2011-12-04 11 views
-1

引数をロードし、後で他の関数で使用できるようにargsを含むstructにファイルを保存しようとしています。しかし、私はそれを正しく保存することができないようです(FILE * A、* Bは0x0に等しい)。ここに私はこれまでに持っていたものです:FILE *をCの構造体に保存

struct Args 
{ 
     int action;  /* holds action token (see teacts)*/ 
     int error; 
     FILE *A,*B;  /* files containing matrixes*/ 
     int r,s;   /* start coordinates*/ 
     int power,dir; /* used in some other function */ 
} Args; 

void getArgs(int argc, char *argv[],struct Args * args) 
{ 
.... 
testopen(argv[4],args->A); 
.... 
} 

int openFile (const char *arg, FILE *input) 
{ 
     input = fopen(arg,"r"); 

     if (input == NULL) 
       return (1); 
     else 
       return (0); 
} 

int main (int argc, char **argv) 
{ 
    struct Args args = {.action = A_ERROR}; 
    getArgs(argc,argv,&args); 
    .... 
} 

私は間違って何を言っているのですか?

+0

あなたが名前のために、より頻繁に 'args'を使用することもできました:) – thumbmunkeys

+0

どのようなエラーが発生しますか? – Cyclonecode

+0

ここにエラーを投稿してください – azat

答えて

1

ポインタは他のすべてと同様にCの値で渡されます。ライン:openFile

input = ....; 

のみ、その関数内のローカル変数(引数)inputの値を変更するには、それがargs->Aは変更されません。

それを修正するには、可能性:

  • openFileargsへのポインタを渡します。

    int openFile (const char *arg, struct Args *args) 
    { 
        args->A = fopen(arg,"r"); 
        ... 
    
  • (引数FILE**を作る)args->Aへのポインタを渡します

    int openFile (const char *arg, FILE **input) 
    { 
        *input = fopen(arg,"r"); 
        ... 
    
  • 全くFILE*を渡すが、1を返し、ない:

    args->A = openFile(argv[4]); 
    

    メイクをエラーが発生した場合はNULLを返すことになり、呼び出し元でエラーチェックを行うことができます。

0

私は問題があることを信じて0にすべての要素を初期化initialisatorあなたの構造:

意味
struct args args = {.action = A_ERROR}; 

、あなたのFILE *のA、* Bは、値がNULLになっています。したがって、あなたはそれらの値を保存することはできません。もう一度お試しください:

struct args args; 
args.atction = A_ERROR; 
1

すぐに気になる問題が2つあります。最初はopenFileと呼ぶべきであるときにtestopenと呼んでいますが、それはちょっとタイプミスだと思っています。

2番目の方がより狡猾です。 openFileの範囲内でファイルポインタを変更する場合は、パラメータが値渡しであるため、ポインタを渡す必要があります。ポインタを渡していると思うかもしれませんが、実際にはFILEポインタのポインタであるため、ダブルポインターが必要です。言い換えれば

、あなたのような何か必要があります:私はそれがこのようなものであるべきだと思う

int openFile (const char *arg, FILE **input) { 
    *input = fopen(arg, "r"); 
    if (*input == NULL) 
     return 1; 
    return 0; 
} 
: 
rc = openFile (argv[4], &(args->A)); 
0

を:

void getArgs(int argc, char *argv[],struct Args * args) 
{ 
.... 
openFile(argv[4],&args->A); 
.... 
} 

int openFile (const char *arg, FILE **input) 
{ 
     *input = fopen(arg,"r"); 

     if (*input == NULL) 
       return (1); 
     else 
       return (0); 
} 
関連する問題