#c #multidimensional-array
#c #многомерный массив
Вопрос:
Очень специфическая проблема, возможно, из-за моего в целом плохого понимания многомерных массивов в C. У меня есть этот код:
int io_pipes[NUM_IO_PROC][n][2][2];
for (int i = 0; i < n; i) {
int pipes[NUM_IO_PROC][2][2];
for (int j = 0; j < NUM_IO_PROC; j) pipes[j] = io_pipes[j][i];
}
Конечно, чего-то не хватает (например, того, что происходит с pipes
переменной). Проблема в том, что в строке 5 я получаю ошибку компилятора с надписью «несовместимый тип в присваивании». Мне бы хотелось, чтобы компилятор предоставил мне больше информации, потому что, насколько я знаю, pipes[j]
и io_pipes[j][i]
оба типа int[2][2]
.
Комментарии:
1. Вы хотите скопировать данные или просто «создать указатели»?
2. Я думаю более правильно
pipes[j]
иio_pipes[j][i]
оба типаconst int[2][2]
, что означает, что вы не можете назначитьpipes[j]
.3. Я выбрал версию struct, которая позволяет мне делать именно то, что я хотел, а не версию memcpy, приведенную ниже, и в целом имеет больший смысл.
Ответ №1:
Вы не можете «назначать» массивы. (По крайней мере, то, что я думаю, что вы пытаетесь сделать.)
Вам нужно будет скопировать каждый элемент, один за другим. Может быть, вы можете использовать одну из существующих библиотечных функций для этой задачи?
for(int j = 0; j < NUM_IO_PROC; j)
memcpy(amp;pipes[j], amp;io_pipes[j][i], sizeof pipes[j]);
Комментарии:
1.
memcpy(amp;pipes[j], amp;io_pipes[j][i], sizeof pipes[j]);
вероятно, понятнее.
Ответ №2:
Идентификатор массивов внутренне обрабатывается как указатель на базовый адрес, но, в отличие от указателей, им нельзя присвоить новое значение адреса, которое вы пытаетесь выполнить в pipes[j] = io_pipes[j][i];