0

On running the following script, I get segmentation fault. The output consists of "here 5a". But nothing beyond it. Any suggestions on what might be going wrong?

if(model==1) 
  fptr3=fopen("poisson.pro","r");
if(model==2)
  fptr3=fopen("jtt.pro","r");
if(model==3)
  fptr3=fopen("estimate.pro","r"); 

printf ("here 5a\n");
for (i=0;i<20;i++) 
  fscanf(fptr3,"%lf", &freq[i]);
printf ("here 5ai\n");

for (i=0;i<20;i++) 
{
  printf ("here 5b\n");
  for (j=0;j<20;j++) 
  {
    printf ("here 5c\n");
    fscanf(fptr3,"%lf", &prob[i][j]);
    if(model==3) 
      prob[i][j]=prob[i][j]/10000.0;
  }
}

UPDATE

double freq[20], prob[20][20];
4

7 に答える 7

2

Is this C# ???? wooow no kidding you are getting segfaults... Do you know what return codes are for ??? You really need to improve your code before asking for this kind of help....this is really unreadable, and ugly code... Start adding some check to your file pointers

    if(1==model)
{
 fptr3=fopen("poisson.pro","r");
 if(null == fptr3)
{
  perror("Fopen failed");
}

...

于 2009-07-27T02:32:07.413 に答える
2

valgrindは、Cのセグメンテーション違反に対する主権の救済策です。セグメンテーション違反のにエラーを検出し、何が間違っていたかを正確に通知します。最大限のメリットを得るには、デバッグシンボルをオンにしてコンパイルします。

于 2009-07-27T02:55:00.247 に答える
2

このコードが呼び出され、「モデル」が1、2、または3のいずれかであることを確認しますか?そうしないと、fptr3が設定されないので、それを使って何かをしようとすると問題が発生します。

代わりにこれを試してください?:

void modeltest (int model) 
{
    FILE *fptr3 = NULL;
    int i = 0;
    int j = 0;
    double freq[20], prob[20][20];

    if(model==1) fptr3=fopen("poisson.pro","r");
    if(model==2) fptr3=fopen("jtt.pro","r");
    if(model==3) fptr3=fopen("estimate.pro","r");

    printf ("here 5a\n");
    if (fptr3 != NULL) {
        for (i=0;i<20;i++) fscanf(fptr3,"%lf", &freq[i]);
        printf ("here 5ai\n");
        for (i=0;i<20;i++) {
            printf ("here 5b\n");
            for (j=0;j<20;j++) {
                printf ("here 5c\n");
                fscanf(fptr3,"%lf", &prob[i][j]);
                if(model==3) prob[i][j]=prob[i][j]/10000.0;
            }
        }
    }
    else {
        printf ("fptr3 is NULL!\n");
    }
}

追加のメモ。どうぞ、一貫したブレーススタイルを検討してください!:)

于 2009-07-27T03:33:43.810 に答える
1

私はダニエルに同意します、あなたはあなたの戻り値とポインタをチェックする必要があります。

また、コードのブロックとフォーマットをより適切に行う必要があることにも同意します。あなたがこれまでにそれを読んだ唯一の人であると仮定すると、数週間であなたでさえあなたがそれをフォローすることができないほど十分に忘れてしまうでしょう。

マシューズポイントに向けて、次の行で始まるすべてを削除してみることができます。

printf ("here 5ai\n");

もちろん、ファイルポインタをチェックした後でのみこれを気にします。

もう1つのクレイジーなアイデアは、デバッガーを使用してステップスルーすることです。printfステートメントなどの優れたデバッグオプションがある場合、デバッガーを使用するのは難しいことはわかっていますが、デバッガーを使用すると、時間を大幅に節約できる場合があります(たとえば、segfaultが発生し続ける場合)。また、開発しているプラ​​ットフォームでデバッガーを使用する方法を学ぶことは、優れたコーダーを平均的なハックのパックから分離することの1つです。(参考までに、デバッガーでコアを調べて、問題がどこにあるかを正確に確認することもできます。(ヒント:コアファイルがない場合は、「manulimit」を試してください。))

デバッグの唯一の手段としてprintfを使用することを主張する場合は、使用するたびにすぐにflushを呼び出します。

于 2009-07-27T03:15:57.233 に答える
0

What's freq defined as? What's prob defined as?

Is the first for loop meant to only run fscanf for freq? Or is it supposed to encompass the entire block?

EDIT: Rationale - If all you see is 5a, then it's faulting in the fscanf on freq. You may have allocated too little space for freq, or used an incorrect type.

于 2009-07-27T02:31:16.370 に答える
0
  1. 戻りコードを確認し、必要に応じてperror()を使用してファイルのエラーコードを出力します(ダニエルの回答を参照)。FILE *をNULLとしてfscanf()を呼び出すと、確実にセグメンテーション違反が発生します。

  2. %lfを指定したように、freqは、floatだけでなく、少なくとも20のdoubleの配列である必要があります。man ffrintf()を参照してください。

  3. printf()の代わりにデバッガーを使用してください。

于 2009-07-27T02:56:09.730 に答える
0

fscanfでクラッシュするため、開いているファイルの先頭の内容を投稿する必要があります。ファイルが存在しないか、ファイルを解析しようとしている方法に対してスタックされたときにファイルの形式が正しくありません。

于 2009-07-27T03:23:01.960 に答える