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

Вниз

Как быстро найти нужный массив, и сделать запись в него.   Найти похожие ветки 

 
ZV ©   (2011-01-26 14:11) [0]

Программа получает массивы   данных, всего есть 50 разных типов входящих данных для каждого пакета  входящих данных   создан массив для хранения . Во входящем пакете первые два байта являются идентификаторами которые указывают к какому типу они относятся.  Проблема заключается в том, что при получении пакета данных мне нужно определить  в какой массив  их записать, для этого я использую оператор       if     , получается, что у меня идет поочередное сравнение двух байт идентификатора с двумя байтами идентификатора массива    и если они совпали, то пишем в этот массив.  При большой скорости входа пакетов , программа начинает не успевать находить нужный массив и соответственно начинаются проблемы
Ниже приведен приблизительный код

ServerSocket1.Socket.Connections[i].ReceiveBuf(InData[0],1);
ServerSocket1.Socket.Connections[i].ReceiveBuf(InData[1],1);
if (InData[0]=3  and InData[1]=4) then begin ServerSocket1.Socket.Connections[i].ReceiveBuf(IDasas[0],100);
if (InData[0]=54  and InData[1]=140) then begin ServerSocket1.Socket.Connections[i].ReceiveBuf(IDwewe[0],100);

и так далее, всего 50 сравнений.

Хотелось бы узнать может можно как то сразу указать путь к нужному массиву используя два байта идентификатора?
Надеюсь Вы меня поняли.


 
Игорь Шевченко ©   (2011-01-26 14:39) [1]

таблицу и двоичный поиск по ней


 
KSergey ©   (2011-01-26 15:05) [2]

Два байта для 50 массивов - многовато, конечно, но т.к. память нынче дешевая, а вопрос скорости стоит остро - я бы сделал статический (да хоть и динамический) массив на 65536 элементов [0..65535], тип элементов этого массива - указатель на то, что нам нужно для соотв. типа. 50 элементов будет занято, остальные пустые, ну и ладно, 64Кб лишней памяти погоды не сделают точно.


 
KSergey ©   (2011-01-26 15:06) [3]

Соотв. "тип пакета" - это будет индекс в этом массиве.


 
Slym ©   (2011-01-27 06:49) [4]

ZV ©   (26.01.11 14:11)
ужасный код...
первое что бросается в глаза куча ServerSocket1.Socket.Connections[i].
кто мешает сделать так
with ServerSocket1.Socket.Connections[i] do
begin
 ReceiveBuf(InData[0],1);
 ReceiveBuf(InData[1],1);
 if (InData[0]=3  and InData[1]=4) then begin ReceiveBuf(IDasas[0],100);
 if (InData[0]=54  and InData[1]=140) then begin ReceiveBuf(IDwewe[0],100);
end;

второе


 
Slym ©   (2011-01-27 07:14) [5]

ReceiveBuf(InData[0],1);
ReceiveBuf(InData[1],1);
это что?
ReceiveBuf(InData[0],2); - и все (зависит от типа массива)
третье
такое колво ифов не рулит, выполнение однотипной команды после каждого ифа тоже не рулит...
рулит массив
type
 TPacketType=(IDasas,IDwewe,Undef);
 TSign=packed array[0..1] of byte;
const
 PacketSign:array[TPacketType] of TSign=((03,04),(54,140),(0,0));
 PacketLen:array[TPacketType] of integer=(100,100,0);

function GetPacketType(const Sign:TSign):TPacketType;
begin
 for result:=low(TPacketType) to high(TPacketType) do
   if word(PacketSign[result])=word(Sign) then
     exit;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 Sign:TSign;
 PcktType:TPacketType;
 PcktLen:integer;
 Pckt:string;
begin
 with ServerSocket1.Socket.Connections[i] do
 begin
   ReceiveBuf(Sign,2);
   PcktType:=GetPacketType(Sign);
   PcktLen:=PacketLen[PcktType];
   SetLength(Pckt,PcktLen)
   ReceiveBuf(PChar(Pckt)^,PcktLen);
 end;
end;


 
Slym ©   (2011-01-27 07:46) [6]

ZV ©   (26.01.11 14:11)
Как быстро найти нужный массив, и сделать запись в него

var PcktData:array[TPacketType] of Pointer;
begin
 PcktData[IDasas]:=@IDasasArray;
 PcktData[IDwewe]:=@IDweweArray;
.....
 ReceiveBuf(PcktData[PcktType]^,PcktLen);


 
ZV ©   (2011-01-27 10:30) [7]

Slym, большое спасибо.
Мда, опыта в Delphi мне явно не хватает


 
Игорь Шевченко ©   (2011-01-27 11:31) [8]


> опыта в Delphi мне явно не хватает


нафиг тебе такой опыт



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

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

Наверх





Память: 0.47 MB
Время: 0.008 c
2-1295623636
Сергей
2011-01-21 18:27
2011.05.01
Как остановить таймер в его событии ontimer?


2-1296036677
И. Павел
2011-01-26 13:11
2011.05.01
Вызов свойства OLEVariant, название которого задано в строке


3-1257573219
Oleg__L
2009-11-07 08:53
2011.05.01
Грамотное освобождение SQL-запроса в DLL


2-1295886563
Дмитрий С
2011-01-24 19:29
2011.05.01
Name в TComponent.Create(...)


2-1295709528
Новик
2011-01-22 18:18
2011.05.01
Изменение поля ввода TEdit;





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский