Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.11.04;
Скачать: [xml.tar.bz2];

Вниз

быстрый поиск в структуре (record)   Найти похожие ветки 

 
Tonich ©   (2007-10-11 13:19) [0]

Такой вопрос
есть допустим следующие структуры

TDevice = record
Number:integer;
Outbyte:Byte;
InByte:Byte;
end;


TCOMPort = record
Devices:TList; - вот этот лист, это набор структур TDevice
Name:string
end;


TServicePorts = record
ComPorts:TList; - вот этот лист, это набор структур TCOMPort
......
end;


так вот собственно вопрос, как организовать быстрый поиск в этом последнем списке определенного устройства, то есть имя порта я знаю(Name), и номер устройства тоже (Number), для изменения значения полей.

сразу скажу, код набирал прямо тут , могут быть ошибки )
спасибо


 
Ega23 ©   (2007-10-11 14:05) [1]

Зачем в рекорде держать указатель на экземпляр класса?
Не, я понимаю, что не запрещено. Но зачем?


 
Tonich ©   (2007-10-11 14:14) [2]

ну там вообще-то в коде не рекорды. а классы,
хорошо где и как хранить что допустим у ком порта есть столько -то устройств, (массивы не хотел делать)


 
clickmaker ©   (2007-10-11 14:19) [3]


> быстрый поиск в этом последнем списке определенного устройства,
> то есть имя порта

StringList.Objects + IndexOf не подойдет?


 
Tonich ©   (2007-10-11 14:22) [4]


> clickmaker ©   (11.10.07 14:19) [3]

пасибо учтем, я пока только собираю варианты...


 
Tonich ©   (2007-10-11 14:57) [5]


> clickmaker ©   (11.10.07 14:19) [3]

не кажется не подойдет ( ну во-первый я храню список устройств в Tlist тоже самое помоему что и StringList.Objects а там для того что бы он вернул индекс нужно передать в IndexOf  объект, а хде я его возьму если у меня есть только есть одно из возможных значений поля класса(рекорда)


 
evvcom ©   (2007-10-11 15:06) [6]

структуры относительно сложные, быстро никак, только перебором в циклах (IndexOf - тот же цикл внутри метода). Или если надо все же искать быстро, добавь индексацию, но задача эта уже не совсем простая.


 
Ping   (2007-10-11 15:15) [7]

function TServicePorts.ComPortByName(const AName: string): TComPort;
var
 i: integer;
begin
 for i := 0 to ComPorts.Count - 1 do
 begin
   Result := TComPort(ComPorts[i]);
   if (Result.Name = AName) then
     Exit;
 end;
 raise Exception.Create("COM port not found: " + AName);
end;

function TComPort.DeviceByNumber(ANumber: integer): TDevice;
var
 i: integer;
begin
 for i := 0 to Devices.Count -1  do
 begin
   Result := TDevice(Devices[i]);
   if (Result.Number = ANumber) then
     Exit;
 end;
 raise Exception.Create(Name + ". Device not found: " + ANumber);
end;

function TServicePorts.FindDevice(const AName: stirng; ANumber: integer): TDevice;
begin
 Result := ServicePorts.PortByName(AName).DeviceByNumber(ANumber);
end;


Так достаточно быстро?


 
Ping   (2007-10-11 15:23) [8]

Для ускорения поиска, для TCOMPort можно хранить не имя, а номер COM-порта: всяко проверка на равенство строк медленнее такой же проверки для целых чисел.

Ну, и, если надо еще быстрее, то хранить ссылки не в TList, а в обычном динамическом индексированном массиве, тогда обращение будет просто по индексу. Но если устройств не очень много, то проход по циклу в поисках нужного устройства будет ненамного длительнее, чем проверки граничных условий индекса массива плюс проверка на валидность ссылки (на случай, если в массиве есть "незанятые" ссылки на порты.)


 
Tonich ©   (2007-10-11 15:35) [9]


> Ping   (11.10.07 15:15) [7]

быстро конечно как для цикла )
я уже сделал как советовал ты и как советовали раньше, я ищу по индексам без переборов всяких ..пасибо  )


 
Dmitry S ©   (2007-10-11 15:48) [10]

А что портов так много?:)


 
Tonich ©   (2007-10-11 18:09) [11]

портов нет, штуки 4 максимум думаю будет, а вот устройств да
и еще + к этому это поиск нужет очень часто, вот поэтому и спросил про быстрый метод. ну вообщем я уже порешил как сделать, вернее сделал..



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.11.04;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.038 c
2-1192027076
smaller
2007-10-10 18:37
2007.11.04
Как непрерывно выводить звук, с плавно меняющейся частотой?


15-1191593116
Черный Шаман
2007-10-05 18:05
2007.11.04
Что лучше широкоформатка 16:9 или классика 4:3(мониторы)


15-1190821439
Константин Батькович
2007-09-26 19:43
2007.11.04
Проблема с добавлением данных через INSERT (InterBase)!


2-1191937848
Сергей Красин
2007-10-09 17:50
2007.11.04
Стандартные диалоги


2-1192105505
vint45
2007-10-11 16:25
2007.11.04
Резкое увеличение размера динамического массива





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский