Как memcpy в двумерный массив в структурированном тексте?

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

Итак, в C я могу сделать это, чтобы скопировать вектор c в строки матрицы a :

int a[100][100];
int c[10][10];

int i;
for(i = 0; i<10; i++)
{
    memcpy(&a[i], &c[i], sizeof(c[0]));
}

Как это сделать в структурированном тексте? Мой аналогичный подход пока не работает. (Ошибка компилятора: меньше индексов для поля a).

VAR 
      a: ARRAY[0..99,0..99] OF REAL; (*2D array*)
      c : ARRAY[0..99] OF REAL; (*1D array*)
END_VAR

FOR i:=0 TO 99 DO
      memcpy(ADR(a[i]), ADR(c[i]), SIZEOF(c[0]));
END_FOR

person Richard Teubner    schedule 28.06.2018    source источник
comment
У меня есть идея, но я боюсь, что проблема в другом. Похоже, вы пытаетесь решить задачу по-другому. Можете ли вы описать (отредактировать), чего вы пытаетесь достичь? Может быть, есть совершенно другой подход к этому с использованием указателей.   -  person Sergey Romanov    schedule 29.06.2018
comment
Мне нравится копировать 1D-массивы одинакового размера в 2D-массив. Я тоже думал о структуре. Если вы знаете, как перебирать член структуры, это также подходит для меня. Разве это не подход с указателем выше?   -  person Richard Teubner    schedule 29.06.2018
comment
Что такое IDE? Кодеис? Указатели не являются частью спецификации IEC61131-3, поэтому каждый реализует ее по-своему. Также я не могу понять, как вы копируете один массив 0-99 в массив 0-9801, который является общим элементом 0-99,0-99.   -  person Sergey Romanov    schedule 01.07.2018


Ответы (2)


Вы пытаетесь скопировать c в a?

Для массива вам нужны оба индекса, например:

memcpy(ADR(a[i,0]).....

Пожалуйста, протестируйте. Я полагаю, что это то, как я это помню, но не на моем компьютере.

person Scott    schedule 29.06.2018

Если я правильно понимаю, вы хотели бы скопировать 1-мерный массив (1x99 = 99 элементов) в 99-мерный массив (99x99 = 9801 элемент). Вы можете скопировать первый массив (1 измерение) в первую строку или столбец (или наоборот), второй во второй... и т.д.

Если это ваша морская свинья, вы можете попробовать этот код:

VAR

    i: INT; //auxiliar
    j: INT; //auxiliar

    origin : ARRAY[0..9] OF REAL;       //origin data
    destiny: ARRAY[0..9,0..9] OF REAL;  //destiny

END_VAR

FOR i := 0 TO 9 DO

    FOR j := 0 TO 9 DO

        //Copy the origin array to the first column, second, etc of destiny array
        destiny[i,j] := origin[i];

    END_FOR;    

END_FOR;

Я протестировал его на своем компьютере (используя codesys), и он работает, но я не знаю, ищете ли вы это...

person ada    schedule 12.07.2018