0

私は次のことをしようとしています:コードがメイン関数を台無しにしないように関数を使用して整数データを含むテキスト ファイルを読み取り、データをメイン関数に解析します。

私のコードは次のようになります

void Readata(char* fname, int* n, int* TheArray){
  int nn=0;
  int anyInt=0;

  ifstream InFile( fname );
  if ( ! InFile.is_open() ) throw myErrHandler("Could not open input file");

  InFile >> anyInt;
  if ( ! InFile ) throw myErrHandler( "Could not read size of array" );
  nn=anyInt;
  (*n)=nn;    

  int* AnArray = (int*) calloc(nn,sizeof(int));
  for(int i=0; i<nn; i++){
    InFile >> anyInt;
    if ( !InFile ) throw myErrHandler( "Could not read data" );
    AnArray[i]=anyInt;
  }
  TheArray = AnArray;
}

そして、主な機能は次のようになります

int main(int argc, char **argv){
  if ( argc < 2 ){
    cerr << "Usage: " << argv[0] << " input file" << endl;
    return 777;
  }

  int n;
  int* TheArray;
  ReadData(arg[1], &n, TheArray);
  return 1;
}

私の問題は、メイン関数から TheArray にアクセスしようとすると、「セグメンテーション エラー (コア ダンプ)」というメッセージが表示されることです。明らかに、ReadData 関数が呼び出された後、"TheArray" ポインターで正しい場所を指していません。ReadData 関数でデータを画面に出力すると、AnArray と TheArray の両方が同じ (そして正しいもの) を指します。これを行う正しい方法は何ですか?

4

2 に答える 2

1

呼び出すとReadDataTheArrayポインターは値で渡されるため、関数内では他の非ポインター引数と同様に動作します。つまり、ポインターへの変更は関数の外では表示されません。引数を変更するには、実際のポインターを参照 (つまり、ポインターのアドレス) として渡す必要があります。

void Readata(char* fname, int* n, int** TheArray){
    ...

    *TheArray = AnArray;
}

そして、それを次のように呼び出します

Readdata(arg[1], &n, &TheArray);

編集:ピートからのコメントで提案を使用する方がおそらく良いでしょう。ただし、生のポインターの使用をまったく停止し、std::vector.

于 2012-10-23T08:14:56.660 に答える
0

これは、ポインタを TheArray に値で渡しているためです。そのため、代入はポインタのコピー上にあります。正しい方法は、ポインターを参照渡しするか、ポインターをポインターに渡すことです。

ポインターへのポインターでは、これは次のようになります。

void Readata(char* fname, int* n, int** TheArray){

割り当ては次のようになります。

*TheArray = AnArray;

しかし、質問に c++ のタグを付けたので、参照によって std::vector を渡し、サイズを変更して Readata() に入力する方がはるかに優れています (IMHO)。

于 2012-10-23T08:20:23.197 に答える