2012-01-08 19 views
0

2次元配列を出力してバイナリに入力しようとしています。バイナリデータの出力と入力C

私の2次元配列は、次のような構造

typedef struct matrep { 
    unsigned rows, columns; 
    double *data; 
} MATRIX; 

内に含まれていると私は、全体の構造を入力する

void matrix_writebinary(MATRIX *mat,FILE *fp)  
{ 
    int a=mat->rows,b=mat->columns; 
    fwrite(&a,sizeof(int),1,fp); 
    fwrite(&b,sizeof(int),1,fp); 
    fwrite(mat->data,sizeof(double) * a * b,1,fp); 
    rewind(fp); 
} 

と、次の関数に出力する構造を次の関数を作成しました

MATRIX *matrix_readbinary(MATRIX *mat,FILE *fp)  
{ 
    MATRIX matrix; 
    MATRIX *ptr; 
    ptr=&matrix; 
    int a,b; 

    double *tempptr=ptr->data; 
    fread(&a,sizeof(int),1,fp); 
    fread(&b,sizeof(int),1,fp); 

    for (int i=0; i < a; i++) 
    { 
     for (int j=0; j < b; j++) 
     { 
      double value=0.0;  
      fread(&value,sizeof(double),1,fp); 
      *(tempptr++)=value; 
     } 
    } 

    rewind(fp); 
    matrix.rows=a; 
    matrix.columns=b; 
    return(ptr); 
} 

私はそれを確認しましたmat->rowsmat->columnsは、両方の入力とprintf機能を使用して、正しく出力されたが、それはコード内

*(tempptr++)=value; 

ラインに到達したとき、私は私が私のポインタを混乱だと言われますセグメンテーションエラーを取得してきました。 私は、ファイルを十分に出力してfprintfとfscanfで入力したので、関数の外にあるファイルを閉じたり操作したりすることに問題はないと思います。

誰でも私の指針を整理するのに役立つでしょうか?

答えて

4

データにメモリを割り当てていません。割り当てを追加する必要があります。

ptr->data = malloc(sizeof(double) * ptr->rows * ptr->columns); 
double *tempptr = ptr->data; 

/* ... */ 

また、一時的なアドレスを返さないでください。だから、マトリックス自体は、あまりにも、動的に割り当てする必要があります:あなたは、直接&ptr->rows&ptr->columnsに中間変数のための必要性を全く読まないことができます

MATRIX * ptr = malloc(sizeof(MATRIX)); 

。すべてのデータを一度に読み取ることもできます。

すべて一緒にそれを置く:

MATRIX *matrix_readbinary(FILE * fp) 
{ 
    MATRIX * ptr = malloc(sizeof(MATRIX)); 

    fread(&ptr->rows, sizeof(unsigned int), 1, fp) 
    fread(&ptr->columns, sizeof(unsigned int), 1, fp) 

    ptr->data = malloc(sizeof(double) * ptr->rows * ptr->columns); 

    fread(ptr->data, sizeof(double), ptr->rows * ptr->columns, fp) 

    return ptr; 
} 

それが割り当てられたデータメモリなしでいくつかの中途半端なマトリックス構造を提供するためにあなたを必要とするので、私は、MATRIXポインタを渡すことをお勧めしません、あなたはなるだろう責任の悪夢で。

は、対応するクリーンアップ機能を忘れてはいけない:あなたの返信用

void matrix_free(MATRIX * mat) 
{ 
    free(mat->data); 
    free(mat); 
} 
+0

おかげで非常に多くを、あなたが作るセンスを言っているのか、私は私がメモリを割り当てられていなかったことを実現していませんでした。しかし、私が2つのエラーを取得する関数を試してみると、 "'void *'から 'MATRIX *'への 'MATRIX * ptr = malloc(sizeof(MATRIX)); "ptr-> data = malloc(sizeof(double)* ptr-> rows * ptr-> columns)行の 'void *'から 'double *'への無効な変換。 – Leavenotrace

+0

私はあなたがCを書いていると言ったと思ったと思った。 :-)(あなたが書いている言語を明確に言うことが重要です.C++ではコード全体がひどく、私は全く違う何かをしたでしょう) –

+0

本当に痛いのは残念ですが、プログラムはまだセグメンテーションエラーのためにシャットダウンします – Leavenotrace