2016-12-05 28 views
0

だから、私はテキストファイルから2次元配列を読み込んでいて、次元がどうなるかわからないので、mallocを使うようになった。それは言われている、ここに私の失敗した試みはうまくいけば、私達がこれをする方法を知っていることを愛するので私達は私を導き、導くことができる!境界を知らずに2次元配列をテキストファイルから読み込む?

void 2dArray(double **arr, int N, int M) { 
    int i,j; 
    FILE *fp; 
    fp = fopen("array.txt", "r"); 
    for(i=0; i < N; i++) { 
    for(j=0; j < M; j++) { 
     fscanf(fp, "%lf", &arr[i][j]); 
    } 
    } 
} 

int main() { 
    int **array; 
    // How do I initialize this?? 
    // heres my attempt: 
    array = (double **)malloc(sizeof(double*); 
    2dArray(array, N, M); 
    //Where would I get N and M? 
+0

あなたが問題を明確にすることはできますか?テキストファイルに12個の数字が含まれているとします。次に、2D配列に、例えば4×3(または6×2、または12×1など)ではなく、3×4要素が含まれていることを確認しますか?質問にテキストファイルの例を含めると役立つかもしれません。 –

答えて

0

まず、既知のデータでリソースを割り当てる必要があります。データを知るには、ファイルを開き、2次元配列の次元を数えます。それは次のようになります。

int **array; 
int *n, *m,i; 
n = malloc(sizeof(int)); 
m = malloc(sizeof(int)); 
findArraySize(n,m); //will find and write array size to n and m 

//start of bad allocation method with lots of seperate resource in actual memory 
array = malloc(n*sizeof(double*)); //allocate resource for pointer to pointer 
for(i = 0 ; i < n ; i++) //allocate resource for each pointer 
    array[i] = malloc(m*sizeof(double)); 
//end of bad allocation method 

//or you can use the allocation method below for better performance and readability 
//(*array)[m] = malloc (sizeof(double[n][m])); 

2dArray(array, *n, *m); 

とあなたのfindArraySize機能は、次のようなものでなければなりません:

void findArraySize(int* n, int *m){ 
    int i,j; 
    FILE *fp; 
    char separators[] = " "; 
    char line[256]; 
    char * p; 
    *n = 0; 
    *m = 0; 

    fp = fopen("array.txt", "r"); 

    while(!eof(fp)){ 
     fgets(line, sizeof(line), fp); 
     p = strtok(line, separators); 
     *n += 1; 
     *m = 0; //we assume array is well defined, m is same for each row 
     while (p != NULL) { 
      *m += 1; 
      p = strtok(NULL, separators); 
     } 
    } 
} 
+0

ここにポインタへのポインタを使用する理由は全くありません。代わりに2D配列を割り当てます。 'int(* array)[m] = malloc(sizeof(int [n] [m]));'。 'n'と' m'を動的に割り当てる理由もありません。あなたが達成するのは遅いプログラムです。 – Lundin

+0

あなたは正しいですが、私はすべてのポインタを別々に割り当てることが、より良いロジックの裏付けを説明していると思います。 – cokceken

+0

各セグメントを別々に割り当てると、セグメントを指すルックアップテーブルが作成されます。不必要に複雑で悪名高いエラーを起こすことは別として、データキャッシュの使用を効果的にブロックし、プログラムを不必要に遅くする。 – Lundin

関連する問題