Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.11.04;
Скачать: CL | DM;

Вниз

быстрый поиск в структуре (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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.014 c
2-1191954003
sdaf
2007-10-09 22:20
2007.11.04
IB


15-1191570233
vajo
2007-10-05 11:43
2007.11.04
Полезный девайс


15-1190924869
Petr V. Abramov
2007-09-28 00:27
2007.11.04
OEM XP


2-1191913114
jslayer
2007-10-09 10:58
2007.11.04
запуск приложения


2-1192135871
Mozgodol
2007-10-12 00:51
2007.11.04
Подмена файла