Массив равен другому массиву - PullRequest
9 голосов
/ 13 февраля 2012

У меня есть цикл, который выглядит примерно так, где arrayfunction устанавливает все значения массива, а compute_with_both_arrays вычисляет число на основе обоих этих массивов.

То, как я это сделал ниже, не работает для array1 = array2. Есть ли способ, которым я могу сделать это без запуска функции arrayfuncion дважды в каждом цикле?

float sum = 0;

float array1[10];
arrayfunction(0, array1);

for(i=1; i<10; i++) {
  float array2[10]
  arrayfunction(1, array2);

  float s;
  s = compute_with_both_arrays(array1, array2);
  sum = sum + s;

  array1 = array2;
}

1 Ответ

12 голосов
/ 13 февраля 2012

Вы должны вручную скопировать память из одного массива в другой с помощью функции, подобной memcpy.

Так, например:

memcpy(array1, array2, sizeof(array1));

Имейте в виду, что мы можем использовать оператор sizeof для array1, поскольку это явный массив, размещенный в стеке. Как заметил комментатор, мы передаем размер места назначения, чтобы избежать переполнения буфера. Обратите внимание, что та же самая техника могла бы быть сделана и для статически размещенного массива, но вы не можете использовать его для массива, динамически размещаемого в куче, используя malloc, или с некоторым указателем на массив ... в этих ситуациях вы должны явно передать размер массива в байтах в качестве третьего аргумента.

Наконец, вы захотите использовать memcpy над for -циклом, потому что функция обычно оптимизирована для копирования блоков памяти с использованием инструкций на уровне машинного кода, которые значительно опередят эффективность цикл for, даже если включена оптимизация компилятора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...