Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 14

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

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

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

    Привет.

    Есть структура:
    TYPE STRUCTURA:
    STRUCT
    b1:BYTE:=1;
    b2:BYTE:=2;
    w1:WORD:=65535;
    b3:BYTE:=3;
    cb4:BYTE:=4;
    p:POINTER TO ARRAY OF BYTE;(*Здесь хочу сделать ссылку на массив не фиксированной длины*)
    b4:BYTE:=5;
    b5:BYTE:=6;
    END_STRUCT
    END_TYPE

    Надо ссылку на массив, массивов у меня 3 шт.
    buff1: ARRAY [1..10] OF BYTE;(*Массив №1*)
    buff2: ARRAY [1..20] OF BYTE;(*Массив №2*)
    buff3: ARRAY [1..30] OF BYTE;(*Массив №3*)

    S:STRUCTURA;(*Объявил структуру*)
    x:byte:=0; (*для свитча*)

    Так вот, я хочу менять ссылку на любой из этих массивов. Как так сделать?

    CASE x OF:
    1:S.p:=ADR(buff1);
    2:S.p:=ADR(buff2);
    3:S.p:=ADR(buff3);
    END_CASE;

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

    По умолчанию

    POINTER TO ARRAY[0..0] OF BYTE;

    И не путайте ссылку с указателем. Разные вещи. Ссылка (reference) это привязанное к переменной имя (в IEC 61131 у переменных может быть только одно имя, поэтому о ссылках ничего не говорится). Указатель (pointer) — самостоятельная ссылка (в 61131 тоже не оговаривается, является кодесисовским расширением).
    Последний раз редактировалось Yegor; 22.10.2014 в 12:08.

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

    По умолчанию

    Цитата Сообщение от Yegor Посмотреть сообщение
    POINTER TO ARRAY[0..0] OF BYTE;

    И не путайте ссылку с указателем. Разные вещи. Ссылка (reference) это привязанное к переменной имя (в IEC 61131 у переменных может быть только одно имя, поэтому о ссылках ничего не говорится). Указатель (pointer) — самостоятельная ссылка (в 61131 тоже не оговаривается, является кодесисовским расширением).
    Понял, спасибо, сейчас буду пробовать.

  4. #4
    Пользователь
    Регистрация
    19.11.2011
    Адрес
    г. Белгород
    Сообщений
    357

    По умолчанию

    p:POINTER TO ARRAY OF BYTE;(*Здесь хочу сделать ссылку на массив не фиксированной длины*)
    Тут надо бы подумать. Если размер структуры изменится, то в симуляторе и в контроллере будет по разному работать. Надо будет учесть выравнивание. Для корректной работы в контроллере структура должна быть кратна 4 байтам. Но могу и ошибаться.

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

    По умолчанию

    Цитата Сообщение от amn Посмотреть сообщение
    Тут надо бы подумать. Если размер структуры изменится, то в симуляторе и в контроллере будет по разному работать. Надо будет учесть выравнивание. Для корректной работы в контроллере структура должна быть кратна 4 байтам. Но могу и ошибаться.
    Да, я почитал форум и проблемы увидел.
    Делаю всё только онлайн в плк.

    Всё равно схитрить не получилось со структурой.
    В общем это всё нужно мне для клиент сокета.
    Цель была такая, имеется несколько массивов, вот их указатель я и хотел подсовывать в структуру, а структуру
    скармливать в SysSockSend.

    TYPE STRUCTURA:
    STRUCT
    b1:BYTE:=1;
    b2:BYTE:=2;
    w1:WORD:=65535;
    b3:BYTE:=3;
    cb4:BYTE:=4;
    p:POINTER TO ARRAY[0..0] OF BYTE;
    b4:BYTE:=5;
    b5:BYTE:=6;
    END_STRUCT
    END_TYPE

    var
    S:STRUCTURA;(*Объявил структуру*)
    x:byte:=0; (*для свитча*)
    buff1: ARRAY [1..10] OF BYTE;(*Массив №1*)
    buff2: ARRAY [1..20] OF BYTE;(*Массив №2*)
    buff3: ARRAY [1..30] OF BYTE;(*Массив №3*)
    POINT1:POINTER TO STRUCTURA;
    end_var

    CASE x OF:
    1:S.p:=ADR(buff1);
    2:S.p:=ADR(buff2);
    3:S.p:=ADR(buff3);
    END_CASE;

    POINT1:=ADR(S);

    SysSockSend(Socket,POINT1,SIZEOF(POINT1^),0);

    В структуре указатель на массив, этот указатель хотел динамически менять,
    но чтобы отправлялась структура вместе с массивом.

    не получилось... понимаю почему, не понимаю как решить наиболее просто.
    Последний раз редактировалось Scream; 22.10.2014 в 13:12.

  6. #6
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    Да, наивно)) SysSockSend не смотрит, что у вас там в структуре. Для неё это плоский массив байтов, в том числе поле-указатель.

    Заведите один достаточно большой буфер и перед отправкой копируйте в него всё, что душе угодно по любым условиям. Функция SysMemCpy из библы SysLibMem вам в помощь.

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

    По умолчанию

    Цитата Сообщение от Yegor Посмотреть сообщение
    Да, наивно)) SysSockSend не смотрит, что у вас там в структуре. Для неё это плоский массив байтов, в том числе поле-указатель.

    Заведите один достаточно большой буфер и перед отправкой копируйте в него всё, что душе угодно по любым условиям. Функция SysMemCpy из библы SysLibMem вам в помощь.
    Да, про буфер думал изначально, откажусь от структуры и сделаю всё через массив.
    Всем спасибо.

  8. #8
    Пользователь Аватар для vodav
    Регистрация
    31.10.2013
    Адрес
    Томск
    Сообщений
    23

    По умолчанию

    А если так:

    TYPE STRUCTURA:
    STRUCT
    b1:BYTE:=1;
    b2:BYTE:=2;
    w1:WORD:=65535;
    b3:BYTE:=3;
    cb4:BYTE:=4;
    p:POINTER TO BYTE;
    b4:BYTE:=5;
    b5:BYTE:=6;
    END_STRUCT
    END_TYPE

    var
    S:STRUCTURA;(*Объявил структуру*)
    x:byte:=0; (*для свитча*)
    buff1: ARRAY [1..10] OF BYTE;(*Массив №1*)
    buff2: ARRAY [1..20] OF BYTE;(*Массив №2*)
    buff3: ARRAY [1..30] OF BYTE;(*Массив №3*)
    POINT1:POINTER TO STRUCTURA;
    end_var

    CASE x OF:
    1:S.p:=ADR(buff1[1]);
    2:S.p:=ADR(buff2[1]);
    3:S.p:=ADR(buff3[1]);
    END_CASE;

    POINT1:=ADR(S);

    SysSockSend(Socket,POINT1,SIZEOF(POINT1^),0);

  9. #9
    Пользователь Аватар для vodav
    Регистрация
    31.10.2013
    Адрес
    Томск
    Сообщений
    23

    По умолчанию

    Опа, так, ведь,
    SysSockSend(Socket,POINT1,SIZEOF(POINT1^),0);
    видит только указатель на массив, сам массив эта функция не видит. Массив должен быть в составе самой структуры и определятся до использования функции SysSockSend.

  10. #10
    Пользователь Аватар для vodav
    Регистрация
    31.10.2013
    Адрес
    Томск
    Сообщений
    23

    По умолчанию

    Давайте так:

    TYPE STRUCTURA:
    STRUCT
    b1:BYTE:=1;
    b2:BYTE:=2;
    w1:WORD:=65535;
    b3:BYTE:=3;
    cb4:BYTE:=4;
    buff: ARRAY[1..30] TO BYTE;
    size_buff:BYTE;
    b4:BYTE:=5;
    b5:BYTE:=6;
    END_STRUCT
    END_TYPE

    var
    S:STRUCTURA;(*Объявил структуру*)
    x:byte:=0; (*для свитча*)
    buff1: ARRAY [1..10] OF BYTE;(*Массив №1*)
    buff2: ARRAY [1..20] OF BYTE;(*Массив №2*)
    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);

    А на выходе смотреть размер массива и сам массив.

Страница 1 из 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

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

Ваши права

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