私は、Cでの多次元の動的に割り当てられた配列の割り当てと使用に関する問題を理解しようとしてきました。助けていただければ、本当にありがたいです。
私は2つのアプローチを試しました。最初:
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));
}
}
そして2番目:
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]など)が同じ値に設定されます。その後のループは、それらのいずれも変更しません。
演算子の優先順位で何かが起こっているか、逆参照が間違っているのではないかと思いますが、それを理解することができませんでした。
ありがとう。
アップデート
次の簡略化されたコードをまとめましたが、これは問題なく機能しているようです。しかし、出力は完全に期待どおりですが、デバッガーでステップスルーしたときと同じ奇妙な動作が発生します。私は自分のコードの根本的な問題が他の場所にあるのではないかと考え始めており、デバッガーの問題(またはおそらく出力の誤解)に転用されたばかりです。VisualStudioの「cdr[0]」、「cdr [1]」などの時計が、期待どおりに表示されない理由はわかっていますか?
#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;
}
すべてのフィードバックに改めて感謝します。