2012-04-04 7 views
2

マシンの問題のためにいくつかのコードを処理しています。私たちはちょうどポインタなどで作業を始めました。だからどこが間違っているのかよく分かりません。デバッグを実行すると、次のような行が表示されます。for(i = 0; i < * y; i ++)エラーをスローしていますが、間違っていても間違っていると確信しています(j = 0; j < * ; j ++)スペース。どんな助けでも大歓迎です。セグメンテーションエラーを取得する

int readImage(char* fileName, 
        int image[MAX_IMAGE_SIZE][MAX_IMAGE_SIZE][NUM_CHANNELS], 
        int* x, 
        int* y, 
        int* max) 
    { 
     /* Variable declarations*/ 
     int i=0; 
     int j=0; 
     int k=0; 
     int num=0; 
     char c; 
     /* Opens file, skips first line*/ 
     FILE *input=fopen(fileName, "r"); 
     if(!input) 
      return -1; 
     do 
      c=getc(input); 
     while(c!='\n'); 
     /*Saves the x and y components into a variable */ 
     fscanf(input,"%d",&x); 
     fscanf(input,"%d",&y); 
     fscanf(input,"%d",&max); 
     /*Cycles through file, reading it into the array */ 
     for(i=0; i<*y;i++) 
     { 
      for(j=0;j<*x;j++) 
      { 
       for(k=0;k<NUM_CHANNELS; k++) 
       { 
        /*Takes input */ 
        fscanf(input, "%d",&num); 
        /*Stores into the array in the form of array[x][y][color] */ 
        image[j][i][k]=num; 
       } 
      } 
     } 
     /*Closes input */ 
     fclose(input); 
     return 0; 
    } 
+0

これでは十分ではありません。残りのコードを参照する必要があります。 – jwodder

答えて

3

変数x, y and maxはすでにポインタです。したがって、fscanf()のアドレス-を使用する必要はありません。また、呼び出し元がそうでなければ、メモリを割り当てる必要があります。

だけ使用します。

fscanf(input,"%d",x); 
    fscanf(input,"%d",y); 
    fscanf(input,"%d",max); 

およびメモリは、発信者によってそれらに割り当てられていることを確認しますが。そうでない場合は、malloc()

+0

それで、forループでxを使うべきですか? – rbonick

+1

いいえforループでは、値を使いたいと思っていました。だから* x、* y、* maxを使うべきです。違い:xはポインタ、* xはxが指す値です。 –

3

を使用してください。& xまたは& yをscanfに渡すべきではありません。ちょうどxとyを渡す。

説明は以下の通りである:

x、yを、関数のパラメータによって定義されるように、XおよびYのメモリ空間上の、すなわちその店舗とINT、メモリ位置へのポインタであり、メモリがあります実際のintがどこに格納されているかを示すアドレス。

次に、アドレス演算子(&)があります。この演算子は、引数のメモリアドレスを返します。あなたが持っているとき

scanfは通常ので、通常、それは読んで値を格納するメモリアドレスを要求するint型変数(たとえばint i、たとえば)あなたは&(&i)とそのメモリアドレスのscanf与えます。しかし、この場合、intのメモリアドレスを要求するのではなく、ポインタのメモリアドレスを要求しています。たとえば、値 "5"を入力した場合、これはyに格納されます(これはintではなくポインタです)。* yを使用すると、プログラムは次の内容を読み込もうとします。あなたのプログラムのために有効なアドレスではない可能性が非常に高いアドレス5のメモリ(したがって、セグメンテーションフォルト)。

うわー、これは私が話すときにあなたの絵を描かなければ説明するのが本当に複雑です、私はあなたがポイントを得ることを願っています。

+0

私はそれを理解しています。そして、コードのこの部分は、あなたと他の答えのおかげで今働いています。どうもありがとうございました! – rbonick

+0

恐ろしい!喜んで助けになる。 –

0

他の人が言っているように、scanf()の引数はポインタである必要があります。 すでにポインタ(X、Yとmax)の代わりに使用するのでは、scanf()ので

に渡すとき、あなたがそれらを間接参照する必要はありませんのセットを持っていたよう:


fscanf(input,"%d",&x); 
fscanf(input,"%d",&y); 
fscanf(input,"%d",&max); 

あなたが使用する必要があります。


fscanf(input,"%d",x); 
fscanf(input,"%d",y); 
fscanf(input,"%d",max); 

あなたはエラーがライン上にあったと言った: for(i=0; i<*y;i++)

詐欺からですテントの*yには何も割り当てられていません(少なくともコードで見ることができます)。 scanf()は、あなたがして間接参照しようyの元の値を、ゴミ箱きます&yに値が割り当てられています(すなわち。*y

は、第二scanf()は、あなたの、1024、たとえば、値を拾った場合for()ループがアドレスを逆参照しようとしています。

関連する問題