Я пытался выяснить проблему с моим размещением и использованием многомерного динамически размещаемого массива в C. Я был бы очень признателен за любую помощь.
Я пробовал два подхода.Первый:
cdr = (double ***) malloc(NUM_REGIONS * sizeof(double **));
for(i=0; i<NUM_REGIONS; i++){
cdr[i] = (double **) malloc(numRatings * sizeof(double *));
for(j=0; j<numRatings; j++){
cdr[i][j] = (double *) malloc(remQuarters * sizeof(double));
}
}
А второй:
tempPtr1 = (double *) malloc(NUM_REGIONS * numRatings * remQuarters * sizeof(double) );
tempPtr2 = (double **) malloc (NUM_REGIONS * numRatings * sizeof(double *));
cdr = (double ***) malloc(NUM_REGIONS * sizeof(double **));
for(i=0; i< NUM_REGIONS; i++){
cdr[i] = tempPtr2 + i;
for(j=0; j < numRatings; j++) cdr[i][j] = tempPtr1 + i * NUM_REGIONS + j;
}
Ни один не работает.В обоих случаях каждый cdr [i] в конечном итоге указывает на одно и то же место.При первом входе в цикл «i» все значения cdr [i] (т. Е. Cdr [0], cdr [1], cdr [2] и т. Д.) Устанавливаются в одно и то же значение.Затем последующие циклы не меняют ни одного из них.
Я подозреваю, что что-то происходит с приоритетом оператора, или я неправильно разыменовываю, но я не смог понять это.
Спасибо.
ОБНОВЛЕНИЕ
Я собрал следующий упрощенный код, который, кажется, работает нормально.Но в то время как выходные данные полностью соответствуют ожидаемым, я все еще получаю то же странное поведение, что и при пошаговом просмотре в отладчике.Я начинаю думать, что фундаментальная проблема с моим кодом может быть в другом месте, и меня просто отвлекли проблемы с отладчиком (или, возможно, просто из-за моего неправильного понимания вывода).Есть ли известная причина, по которой часы на 'cdr [0]', 'cdr [1]' и т. Д. В Visual Studio не показали бы то, что я ожидаю показать?
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#define NUM_REGIONS 50
void printArray(double *inVec, int len){
int i;
for(i=0; i<len; i++) printf("%f\t",inVec[i]);
printf("\n");
}
int main(array<System::String ^> ^args){
int numRatings = 25, remQuarters = 100, i, j, k;
double ***cdr;
char dummy;
cdr = (double ***) malloc(NUM_REGIONS * sizeof(double **));
for(i=0; i<NUM_REGIONS; i++){
cdr[i] = (double **) malloc(numRatings * sizeof(double *));
for(j=0; j<numRatings; j++){
cdr[i][j] = (double *) malloc(remQuarters * sizeof(double));
}
}
for(i=0; i<NUM_REGIONS; i++){
for(j=0; j<numRatings; j++){
for(k=0; k<remQuarters; k++){
cdr[i][j][k] = 100*i + 10*j +k;
}
}
}
for(i=0; i<5; i++) printf("%f\t",cdr[1][1][i]);
printf("\n");
for(i=0; i<5; i++) printf("%f\t",cdr[3][1][i]);
printf("\n");
for(i=0; i<5; i++) printf("%f\t",cdr[1][3][i]);
printf("\n");
for(i=0; i<5; i++) printf("%f\t",cdr[i][i][i]);
printf("\n");
printArray(cdr[1][1], 5);
printArray(cdr[3][3], 5);
scanf("%c", &dummy);
return 0;
}
Еще раз спасибо за все отзывы.