Сообщение от
vodav
Давайте так:
Код:
TYPE STRUCTURA:
STRUCT
...
buff: ARRAY[1..30] TO BYTE;
size_buff:BYTE;
...
END_STRUCT
END_TYPE
var
S:STRUCTURA;(*Объявил структуру*)
x:byte:=0; (*для свитча*)
buff1: ARRAY [1..10] OF BYTE;(*Массив №1*)
..
buff3: ARRAY [1..30] OF BYTE;(*Массив №3*)
POINT1:POINTER TO STRUCTURA;
i:BYTE;
end_var
CASE x OF:
1:S.size_buff=10;
FOR i:=1 TO 10 DO
S.buff[i]:=buff1[i];
END_FOR
2:S.size_buff=20;
FOR i:=1 TO 20 DO
S.buff[i]:=buff1[i];
END_FOR
3:S.size_buff=30;
FOR i:=1 TO 30 DO
S.buff[i]:=buff1[i];
END_FOR
END_CASE;
POINT1:=ADR(S);
SysSockSend(Socket,POINT1,SIZEOF(POINT1^),0);
Ну и в чем тогда смысл плавающего размера массива ?
Код:
TYPE TBUF
ARRAY[1..30] TO BYTE;
END_TYPE
TYPE STRUCTURA:
STRUCT
...
size_buff:BYTE;
buff: TBUF;
...
END_STRUCT
END_TYPE
var
S:STRUCTURA;(*Объявил структуру*)
x:byte:=0; (*для свитча*)
buff : ARRAY [1..3] OF TBUF(*Все массивы. Запас пофиг. Тут сэкономленное ни кому не нужно*)
end_var
x := limit(1,x,3); //чуть контроля
S.size_buf :=(x - 1) * 10;
S.buff := buf[i]; //не все ли равно что скопировано 30 байт если приемник знает size_buf ?
SysSockSend(Socket, adr(s), SIZEOF(s), 0);
Когда размер плавающий, это:
1.Или отправку мастерят в отдельный буфер - Yegor уже сказал
2.Или реализуют за запасом по максимуму - Vodav, но смысл в динамике ?
3.Или плавающую часть держат в конце и сам объект таскают динамически по куче
4.Отправляют друг за другом - если позволяет логика обработки на другом конце
5.Или JSON - Capzap предложил
Вариант симбиоза 1 и 3
Код:
TYPE STRUCTURA:
STRUCT
... //заголовок вообще без буфера
szBuf:BYTE; //только размер, а буфера нету
END_STRUCT
END_TYPE
---------
function Create : pointer to STRUCTURA //создаем и заполняем
var_input
h : STRUCTURA;
pBuf : dword;
szBuf : byte;
end_var
Create := SysMemAlloc(sizeof(h) + szBuf); //с хвостиком !!
Create^ := h; //копируем, но в szBuf - шняга
Create^.szBuf := szBuf; //теперь - хорошо
SysMemCpy(Create + sizeof(h), pBuf, szBuf); //и сами данные
---------
---------
function Destroy : bool //уничтожаем, причем размер - в самой структуре
var_input
pBuf : pointer to STRUCTURA;
end_var
SysMemFree(pBuf,sizeof(pBuf^) + pBuf^.szBuf)); //о хвостике - помним
--------
var
S : STRUCTURA;(*Объявил структуру*)
x : byte:=0; (*для свитча*)
buff1 : ... //тип пофиг
buff2 : ... //тип пофиг, и тип buff1 тоже пофиг
..
p : pointer to STRUCTURA; //здесь и вроде нетипизированного указателя
end_var
p := 0; //от игривых рук
case x of
1: p := Create(s,adr(buff1),sizeof(buff1));
2: p := Create(s,adr(buff2),sizeof(buff2));
..
end_case
if p > 0 then //от игривых рук
SysSockSend(Socket,p,sizeof(s) + p^.szBuf,0);
Destroy(p);
end_if
мелкие ошибки - возможны, исправите сами если юзать будете