2

ファイルが正しく渡されていないという私のコードの問題だと思います。入力は、1 2 3 の 3 行を含むファイルです。4 5 6; 7 8 9; 出力はセグメンテーション違反 (コアダンプ) であり、出力は最初の行 1 2 3 を出力するはずです。

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

int getNum();
int getLine();
int getMatrix();
int det1();
int det2();
int det3();
int det4();
int det5();
int det6();


main(){
  FILE *infile;
    infile = fopen("matrix.txt","r");
  int line[6];
  int lineSize;
  int error;
  getLine(line,lineSize,infile);
  printf("%d %d\n", line[0],line[1]);
  fclose(infile);
}

/***********************************************
Name : getLine
Description : To get the line of numbers
Arguments :  infile - the file pointer with numbers inside
             line[]  - the line of numbers
             lineSize - size of line
Returns : 1   - If no errors were encountered
          2 - If END OF FILE was reached
          -1 if non number detected

*************************************************/
int getLine(int line[], int lineSize, FILE *infile){
  int value;
  int l;
  lineSize=0;

  while(value != '\n'){
    value=0;
    l=getNum(value,*infile);
    if (value==EOF){
      return(2);
    }
    line[lineSize]=value;
    lineSize++;
  }
  if (l == -1){
    return(-1);
  }
  return(1);

}


/***********************************************
Name : getNum
Description : To get the Next number from file
Arguments :  infile - the file with numbers inside
             value  - the value of number grabed
Returns : 1   - If no errors were encountered
          -1  - If letter or non number detected
*************************************************/
int getNum(int value, FILE *infile){

  int c;
  int error=1;

  while ((c=getc(infile)) != EOF){
    if (c=='\n'){
      value = '\n';
      return(1);
    }
    if(c==32){//checking for space
      if (error == -1){
        return(-1);
      }
      else{
        return(1);
      }
    }
    else {
      value = 10*value + c - '0';
    }
    if((c<=47)||(c>=58)){
      printf("incorrect number input %d\n",c);
      error = -1;
    }
  }
  value = EOF;
  return(1);

}
4

3 に答える 3

4

コードをスキミングしています...

int getNum();
int getLine();
int getMatrix();
int det1();
/* ... */

これらの宣言はコンパイラに次のようにint伝えます。受け入れます。私がそれらを使用するときは、私を信頼してください」

関数をコンパイラに導入するときにプロトタイプを使用する方が良い

int getNum(int value, FILE *infile);
int getLine(int line[], int lineSize, FILE *infile);
/* ... */

これらの宣言は、コンパイラーに次のようintに伝えます。

... main() 内で継続

      /* ... */
      int lineSize;
      int error;
      getLine(line,lineSize,infile);
      /* ... */

宣言しlineSizeましたが、変数の値を指定しませんでした。プログラムが getLine を呼び出すとき、lineSize の値はほぼ間違いなく間違った値です (関数を呼び出す前にコンピューターがクラッシュすることさえあります)。使用する前に (ほとんど) すべての変数を初期化します。

      /* ... */
      int lineSize = 0;
      int error = 0;
      getLine(line,lineSize,infile);
      /* ... */

私はもっ​​とスキミングしていません...

提案: コンパイラの警告レベルを上げて、コンパイルで警告が生成されている間はプログラムを実行しないでください。

于 2010-10-02T21:42:20.820 に答える
3

ではgetLine()、関数に を指定すると、逆参照されますinfile FILE*getNum()

 l=getNum(value,*infile);

しかし、逆参照されたものではなく、getNum()通常の を期待するだけです。FILE*したがってinfile、変更せずにその関数に渡します。

 l=getNum(value,infile);

さらに、while(value != '\n')ループはおそらく永遠に実行されlines、セグメンテーション違反が発生するまで配列の末尾を超えて書き込みます。valueループがいつ終了するかを制御している は、変更されることはありません (また、初期化されないため、任意の値で開始されます)。getNum()おそらく変更することになっている関数は、パラメーターとして渡された整数のコピーvalueを取得し、このコピーを変更します。オリジナルは決して変更されません。value

関数で変数を変更するvalue場合は、その変数を変更するために使用されるポインターをvalue使用する必要があります。

int getNum(int *value, ...) {
   *value = 5;
   ...
}

l=getNum(&value, infile);

valueまた、整数変数である が割り当てられ'\n'、文字リテラルであると比較されることも少し疑わしいです。の整数値を'\n'ループの終了条件として使用してもよろしいですか?

于 2010-10-02T21:27:42.853 に答える
0

直接的な答えではありませんが、いくつかの printf ステートメントをランダムな場所に貼り付けることをお勧めします。これにより、クラッシュの正確なポイントを比較的迅速に絞り込むことができます。2 つの printfs が 1 行のコードを囲み、クラッシュの原因であることが判明するまでそれらを移動します。これにより、より適切な診断が可能になります。

于 2010-10-02T21:38:19.657 に答える