Страница 2 из 2 ПерваяПервая 12
Показано с 11 по 14 из 14

Тема: Ссылка на массив в структуре.

  1. #11
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,248

    По умолчанию

    так Вы когда код написали, надо было его сперва проверить а потом аыкладывать
    в таких случаях резервируют место по максимальному размеру массива и добавляют переменную сколько елементов будет в массиве,на другой стороне будет проще определить сколько взять данных
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  2. #12
    Пользователь
    Регистрация
    24.07.2012
    Адрес
    Россия
    Сообщений
    1,492

    По умолчанию

    В принципе идея нравится, кроме вложенных циклов и выровнять структуру скорее всего надо будет. Я рассчитывал на SizeOf(buff) MOD 4 = 0;
    Спасибо за идею, буду завтра с утра пробовать.

  3. #13
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,248

    По умолчанию

    а на другой то стороне кто принимает данные, почти все ЯВУ понимают стандарт JSON, может в него все сформировать и не парится

  4. #14
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    2,251

    По умолчанию

    Цитата Сообщение от 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
    мелкие ошибки - возможны, исправите сами если юзать будете

Страница 2 из 2 ПерваяПервая 12

Похожие темы

  1. ССЫЛКА
    от zendo057 в разделе Трёп (Курилка)
    Ответов: 2
    Последнее сообщение: 27.12.2013, 22:36
  2. помогите разобраться в структуре
    от VanoKing в разделе ПЛК1хх
    Ответов: 1
    Последнее сообщение: 27.09.2011, 08:31
  3. ТРМ151-09 EasyGo ошибочная ссылка
    от Ярослав123 в разделе Эксплуатация
    Ответов: 2
    Последнее сообщение: 01.03.2011, 17:35
  4. массив
    от freak в разделе ПЛК1хх
    Ответов: 7
    Последнее сообщение: 01.07.2010, 03:14
  5. битая ссылка на конфигуратор трм101
    от *BizON* в разделе Сервисное ПО
    Ответов: 0
    Последнее сообщение: 17.12.2007, 10:32

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •