переопределение 2d массива как ссылочной копии другого 2d массива C - PullRequest
0 голосов
/ 12 мая 2019

Я пытаюсь скопировать 2d массив в другую переменную по ссылке, чтобы избежать ненужных вычислений.По сути, у меня есть два двухмерных массива, current_array и new_array, и я генерирую new_array из current_array, а затем заменяю.

Я пытаюсь запрограммировать игру жизни Конвея, используя openmp, но у меня возникают проблемы с копированием нового массива в старыйодин.Я пытался использовать * current_array = * new_array, ¤t_array = & new_array, ... и все другие комбинации.Я не знаю много о C или указателях, но учитель настаивает на том, чтобы мы использовали C.

void NextArray(int const height, int const width, int const CurrentArray[height][width], int NewArray[height][width]){
  for(int i = 0; i < height; ++i){
    for(int j = 0; j < width; ++j){
      NewArray[i][j] = Newpoint(i,j, CurrentArray);
    }
  }
}


int main(){
  int CurrentArray[height][width];
  int NewArray[height][width];
  InitialArray=fopen("matrix.txt", "r");

  for(long long i = 0; i < height; ++i){
    for(long long j = 0; j < width; ++j){
      fscanf(InitialArray, "%d", &CurrentArray[i][j]);
    }
  }

  NextArray(height, width, CurrentArray, NewArray);
  CurrentArray = NewArray;
  return 0;
}

Я ожидаю, что CurrentArray будет иметь ту же информацию, что и функция NextArray, если вы определите NewPoint следующим образом:

void NextArray(int const i, int const j, int const CurrentArray[height][width]){
  if (CurrentArray[i][j]){
    return 0;
  }
  return 1;
}

height = 2, width = 2 и «matrix.txt» в виде файла со следующими данными:

0 0
1 1

, тогда значение CurrentArray должно быть

1 1
0 0

1 Ответ

1 голос
/ 12 мая 2019

Чтобы скопировать массив в массив идентичного типа (идентичные размеры и тип элемента), используйте:

memcpy(NewArray, CurrentArray, sizeof NewArray);

Чтобы создать указатель, ссылающийся на другой массив, используйте:

int (*NewArray)[width] = CurrentArray;

Это работает, потому что, когда CurrentArray используется в большинстве выражений, оно автоматически преобразуется в указатель на свой первый элемент.Поскольку это массив массивов, его первый элемент - это массив.Этот массив имеет тип int [width], а указатель на такой массив имеет тип int (*)[width].Поэтому объявление NewArray с int (*NewArray)[width] определяет, что он имеет правильный тип, который будет назначен (и будет действовать как) указатель на первый элемент CurrentArray.

Учитывая вашу задачу, вы, вероятно, захотите дваотдельные массивы - вы хотите, чтобы были доступны как старые, так и новые данные.Ваш заголовок запрашивает «ссылочную копию», но вам, вероятно, не нужна ссылка на старый массив, потому что тогда у вас есть только один набор данных, доступ к которому осуществляется через два разных идентификатора.

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