У вас есть один адрес - слишком много:
// notice: "set" instead of "&set"
for (ptr = (double *)set; ptr < (double *)(set + DIM0); ptr++) {
Вы добавляли единицу к адресу вашего параметра (и, следовательно, указывали на нигде), а не DIM0
к значению вашего параметра (который приведет вас к данным массива, что является вашей целью).
Обратите внимание, что параметр является указателем на массив измерений [DIM1][DIM2][DIM3]
. Другими словами, аргумент, передаваемый функции, может быть массивом типа double[DIM0][DIM1][DIM2][DIM3]
, который будет переходить в тип указателя этого параметра. У вас есть DIM0
строк, поэтому вы добавляете DIM0
к этому указателю, чтобы достичь позиции после последней ячейки.
То, что вы, вероятно, имели в виду, это добавление единицы к указателю на весь массив. Это будет работать, если у вас есть следующее объявление.
void DisplayAverage(double (*set)[DIM0][DIM1][DIM2][DIM3]);
Теперь вам нужно передать аргумент, используя &arg
вместо просто arg
, чтобы фактически передать адрес массива вместо того, чтобы позволить ему распадаться на тип внутреннего измерения. Цикл может быть записан как
for (ptr = (double *)set; ptr < (double *)(set + 1); ptr++) {