Форум: "Начинающим";
Текущий архив: 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