C/CAPL, определяющий один массив из другого

это мой первый вопрос здесь, пожалуйста, обратите внимание, что я очень новичок в кодировании. Быстрый поиск мне не помог, так как я думаю, что ответ может быть слишком простым.

Я пишу код на CAPL (специальный язык CANoe, основанный на C). Давайте упростим мой сценарий: мне нужно прочитать 10 входных значений, но я могу просто читать по одному (из-за аппаратных причин).

Мое значение хранится в буфере (rsBuf), теперь я пытаюсь определить массив справки каждый раз, когда я читаю значение (rsBuf1... 10). В конце я создам еще один массив с добавленными значениями rsBuf1 ... rsBuf10.

для каждого «действия чтения» я хочу определить rsBuf1 = rsBuf; rsBuf2 = rsBuf; и так далее...

ошибка: для "rsBuf1 = rsBuf;" Ошибка 1112 в (732,16): типы операндов несовместимы. Ошибка компиляции -- 1 ошибка, 0 предупреждений

мои "настоящие" значения:

variables
{
byte rsBuf[1024];
byte rsBuf1[1024];
}

есть ли простой способ сделать этот массив из другого? Я также попробовал некоторые другие найденные мной обозначения, такие как rsBuf1 = {rsBuf}, но это не помогло. Конечно, я мог бы определить rsBuf1[1]=rsBuf[1]; ... rsBuf1[1024]=rsBuf[1024];

но это было бы пустой тратой времени, я думаю. Заранее спасибо, ура Роберт


person Robertk2016    schedule 03.03.2016    source источник
comment
ты пробовал memcpy() ? :) что-то вроде memcpy(rsBuf1, rsBuf, 1024);   -  person Shark    schedule 03.03.2016
comment
Привет, спасибо, я только что попробовал tutorialspoint.com/c_standard_library/c_function_memcpy.htm: memcpy (rsBuf1, rsBuf, strlen(rsBuf)+1); // та же ошибка: Ошибка 1154 в (732,31): типы параметров не совпадают. Ошибка 1112 в (733,16): типы операндов несовместимы. ******************** спасибо, сейчас попробовал с 1024, работает!   -  person Robertk2016    schedule 03.03.2016
comment
Рад, что помог вам с вашим первым вопросом ;)   -  person Shark    schedule 03.03.2016


Ответы (2)


Вы не можете копировать массивы через присваивание в C, потому что синтаксис этого не позволяет. Лучшее решение — использовать функцию memcpy.

В качестве альтернативы, если это имеет смысл для дизайна программы, вы можете поместить массивы в структуру-оболочку:

typedef struct
{
  int array [5];
} array_wrapper_t;

array_wrapper_t this = {1,2,3,4,5};
array_wrapper_t that;
that = this;

Это должно дать идентичный машинный код вызову memcpy.

person Lundin    schedule 03.03.2016

Опция 1

Вы можете использовать memcpy следующим образом, чтобы скопировать весь массив:

memcpy(rsBuf1, rsBuf, elcount(rsBuf));

Следующее скопирует первые четыре байта:

memcpy(rsBuf1, rsBuf, 4);

Вариант 2

При желании вы можете определить свою функцию копирования, см. реализацию copy_buffer():

variables
{
  byte rsBuf[1024] = {1, 2, 3, 4, 5, 6, 7, 8};
  byte rsBuf1[1024]; 
}

on start
{
  print_buffer(rsBuf, 8);
  print_buffer(rsBuf1, 8);

  copy_buffer(rsBuf1, rsBuf, elcount(rsBuf));

  print_buffer(rsBuf1, 8);
}

void copy_buffer(byte dest[], byte src[], long len)
{
  int i;
  for (i = 0; i < len; i++)
    dest[i] = src[i];
}

void print_buffer(byte buf[], byte len)
{
  int i;
  writeLineEx(0, 0, ">");
  for (i = 0; i < len; i++)
    writeEx(0, 0, " 0x%02x", buf[i]);
}
person sergej    schedule 07.03.2016