2016-09-14 21 views
-1

これまでのところ、これが得られましたが、それが正しいかどうかはわかりません。 この関数は、2D配列(nxn)の寸法を受け取り、それを割り当てます。 flightInfoは、構造体の名前です。 これは機能しますか? ありがとうアドバンス2次元配列のポインタを構造体に割り当てる方法

配列を割り当てた後(私はあなたが提案したメソッドを使用することはできませんので、メソッドを無視してください)私は構造体を初期化したいと思います。 )、割り当ての直後にそれをやろうとしましたが、 "未処理の例外"という警告が表示され続けていますが、それは の構文で行う必要がありますか? '*'を忘れていますか?

void flightMatrix() 
{ 
FILE * fpf; 
int checkScan,Origin,Dest; 
float time,cost; 
char flightName[3]; 
flightInfo *** matrix; 


if(!(fpf=fopen("flights.txt","r")))exit(1); 

    while((checkScan=fscanf(fpf,"%*10c%3d%3d%3c%5f%7f%*",&Origin,&Dest,flightName,&time,&cost))!=EOF) 
{ 
    matrix=allocateMatrix(Dest); 
    matrix[Origin-1][Dest-1]->o=Origin; 

} 

}

flightInfo*** allocateMatrix(int n) 

{ int i,j; 
    flightInfo*** matrix; 

matrix=(flightInfo***)malloc(sizeof(flightInfo **)*n); 
    for(i=0;i<n;i++) 
matrix[i]=(flightInfo **)malloc(sizeof(flightInfo*)*n); 

for (int i = 0; i < n; ++i) 
{ 
    for (int j = 0; j < n; ++j) 
     matrix[i][j] = NULL; 
} 

    return matrix; 
} 

[http://i.stack.imgur.com/MFC7V.png] これは私が話す

+6

あなたが3つ星のプログラマになると、それは良いことではありません...また、malloc()をキャストしない –

+0

_これは動作しますか?_試しましたか? – LPs

+1

これは2D配列ではありません。 2次元配列であるためには、1つのn x nブロックを割り当ててください。 – fvgs

答えて

0

技術を初期化しようとすると、これは2次元配列を作成しません何が起こるかです。結果はポインタの配列になり、各ポインタはと異なる構造体へのポインターの配列を指します。

違いは、メモリがであり、すべての要素が単一の連続したメモリブロックではなく、いくつかのメモリ位置を指すようにフラグメント化されていることです。

このため一般的なアプローチは、2次元配列平ら作成することです:あなたは、2つのインデックスを使用するように強制されている場合は、あなたが関数の引数として行列を置くことができ

flightInfo** allocateMatrix(int n) 
{ 
    flightInfo** matrix = malloc(n*n * sizeof(*matrix)); 
    for (int i = 0; i < n; i++) 
     for (int j = 0; j < n; j++) 
      matrix[i*n + j] = NULL; 
    return matrix; 
} 

を:

void allocateMatrix(int n, flightInfo* (**matrix)[n]) 
{ 
    *matrix = malloc(n * sizeof(**matrix)); 
    for (int i = 0; i < n; ++i) 
     for (int j = 0; j < n; ++j) 
      (*matrix)[i][j] = NULL; 
} 

秒ポインタは値渡しであるためアスタリスクが必要です。そうしないと、からmatrixに何もしないポインタの変更されたローカルコピーが生成されます。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

typedef struct flightInfo { 
    char airport[30]; 
    int altitude; 
} flightInfo; 

void allocateMatrix(int n, flightInfo* (**matrix)[n]) 
{ 
    *matrix = malloc(n * sizeof(**matrix)); 
    for (int i = 0; i < n; ++i) 
     for (int j = 0; j < n; ++j) 
      (*matrix)[i][j] = NULL; 
} 

int main() 
{ 
    int n = 10; 
    flightInfo* (*matrix)[n]; 

    allocateMatrix(n, &matrix); 

    matrix[0][0] = malloc(sizeof(flightInfo)); 
    strcpy(matrix[0][0]->airport, "Heathrow"); 
    matrix[0][0]->altitude = 10000; 

    printf("%s, %d\n", matrix[0][0]->airport, matrix[0][0]->altitude); 
} 

別の方法は、構造体内に配列をカプセル化することです。

+0

現代のCプログラミングでは、あなたはむしろ 'flightInfo(* matrix)[y] = malloc(sizeof(flightInfo [x] [y]))'を実行するでしょう。 「絡み合った配列」は、1990年代のスタイルCプログラミングの一種です。 – Lundin

+0

@ Lundin:そうですが、関数からそのような配列を返す方法はありますか?私は 'flightInfo *(* allocateMatrix(int n))[n]'プロトタイプで試しましたが、コンパイル時に2番目の 'n'が未知であるため、これはコンパイルされません。配列の宣言は 'flightInfo *(* matrix)[n] = malloc(n * sizeof(* matrix));'です。 –

+0

なぜあなたはflightInfo **を使用したのですか?flightInfo ***を使わなかった理由を説明できますか?私はそれぞれの[i] [j]にポインタを持っていなければならないので、最終的に構造体につながります。あなたが2D配列を割り当てた方法 – Tohar

関連する問題