2011-12-30 3 views
2

まですべてを実行すると、forループを入力することを拒否し、ちょうどハングします。Cプログラムはループには入っていませんが、何かを実行するとき何らかの理由で

main() 
{  

    char *buffer; 
    int chunk_offset, current_chunk_number, total_chunks; 
    int filelen; 

    filelen = ReadFileintoBuffer(buffer); 
     printf("file read \n");        // error break point 1 


    int events = filelen/eventlen;  // number of 512 + 2 32 bit events events with timecode 

    int sp = 0; 
    int i,j; 
    int toterror[25]; 
    printf("file of length %d has %d events \n", filelen, events); 
    printf(" i = %d \n", i); 
    for(i = 0; i < events; i++) 
    { 
     printf("analyzed %d events of %d", i, events); 
     sp=0; 
     int error[13]; 

     Analyzeevent(buffer+i*eventlen, error); 

     if(error[0]) 
     { 
      sp = 12; 
     } 
     for(j =1; j < 13; j++) 
     { 
      toterror[j+sp] += error[j]; 
     } 

    } 
    printf("post for loop"); 
    Printerrs(toterror, events); 
    exit(0); 

} 

その後、ダウンI =(この特定のケースでは9727988)に至るまで、何を印刷します。それだけですべて停止します。何が起こったのか?私はC++を学び、プログラミングは非常に奇妙で厄介です。コンパイラは何の警告も何も投げません

あなたの助けを前にありがとうございます。

編集:HERESにリング0 ReadFileintoBufferへのコードのために:

int ReadFileintoBuffer(char *buffer) 
{ 
    int filelen; 
    char text[200]; 
    printf("Input File: "); 
    scanf("%s" ,text); 
    FILE *file = 0; 

    int i; 


    //Open file 
    file = fopen(text, "rb"); 
    if (!file) 
    { 
      fprintf(stderr, "Unable to open file \n"); 
     exit(0); 

    } 

    //Get file length 
    fseek(file, 0, SEEK_END);    // find the end of the file 
    filelen=ftell(file);     // set the current pointer (currently at end from above) as file length 
    fseek(file, 0, SEEK_SET);    // set pointer back to beginning of file 

    //Allocate memory 
    buffer=(char *)malloc(filelen+1); 
    if (!buffer) 
    { 
     fprintf(stderr, "Memory error! \n"); 
           fclose(file); 
     return; 
    } 

    //Read file contents into buffer 
    fread(buffer, filelen, 1, file); 
    fclose(file);       // clse the file, all in buffer now 
    return filelen; 
} 
+0

C++で 'main'関数の戻り値の型を常習的に省略しましたか? K&R Cはデフォルトの 'int'を仮定していますが、ANSI Cではそうではなく、かなりの時間"ベストプラクティス "とはみなされていません... –

+0

また、デバッガでコードを実行しましたか? 'events'の値は常に0より小さく、' for'ループは実行されない可能性があります。より使い慣れたC++でも同じ動作が見られます。 –

+0

デバッガを使用していません。デバッガを使い始めるとすぐに問題はすぐにわかります。 – abelenky

答えて

4

あなたはprintf関数といくつかのバッファリングの問題を取得することができます。 forループの内側に\ nを追加してみてください。

すべてのコードを実行している可能性がありますが、印刷結果が表示されていない可能性があります。

+0

また、ループを入力すると、最初の行を印字し(@DYoungのようにバッファリングして)、 'Analyzeevent()'の中にぶら下げてください。 –

+0

\ nを追加すると、 。ありがとうございました!。なぜ私はそれがなぜ起こるのか分かりません。 printfが使うバッファを調べなければなりません。再度、感謝します。 – swicano

0

デバッガを使用する必要がある - ここeventlenは何gdb

?そのタイプは何ですか?その値はfilelenの値とは何ですか?

int events = filelen/eventlen; 

あなたのeventが負であるので、このループに入ることを拒否することを可能かもしれません!その値を参照するには

int events = filelen/eventlen; 

利用のprintf:

for(i = 0; i < events; i++) 
+0

ああ、私はチェックする前にprintステートメントの1つにイベントを入れ、イベントは何千もあります。 – swicano

0

eventlen前、この行に定義されていません。

char *buffer; 
    filelen = ReadFileintoBuffer(buffer); 

を見てみると

+0

ああ申し訳ありませんが、eventlenはmainの外でいくつかの他の定数で定義されています。 – swicano

0

何かがうまくいっていないようです。
我々はReadFileintoBufferのコードが表示されていないが、それはどのような方法でbufferパラメータを使用することはできません。

  • buffer以外に割り当てられた文字列
  • その値ではなく、その参照では、関数に渡されます
したがって

、いずれか

  • buffer前をコールに割り当てられるべきです、例えば(malloc関数を使用)または
  • は、その参照は

    filelen = ReadFileintoBuffer(&buffer); 
    

のようにそれはすべてがReadFileintoBuffer()関数に依存し、代わりに渡す必要があります。予想通りReadFileintoBuffer()コード

コードに基づいて


編集bufferに問題があります。
ローカルのbufferパラメータが関数に割り当てられていますが、ポインタ値が呼び出し元のbufferにコピーされません。

これを修正する方法はいくつかあります。その1つは、前述のように、その値を関数に渡さずにbufferポインタへの参照を渡すことです。

filelen = ReadFileintoBuffer(&buffer); // note the & 

および機能自体 - buffer関連:

int ReadFileintoBuffer(char **buffer) // note the ** 
{ 
    // ... 

    //Allocate memory (using *buffer instead of buffer) 
    *buffer=(char *)malloc(filelen+1); 

    if (!*buffer) 
    { 
     // ... 
    } 

    //Read file contents into *buffer 
    fread(*buffer, filelen, 1, file); 
    // ... 
} 

main()バッファ変数割り当てが実際に機能することによって実行されるこの方法。

printfバッファを空にしただけで承認された解決策は解決しないことに注意してください。bufferが修正されない限り、プログラムは正しく動作しません。

+0

このプログラムは、別の研究者のコードをハッキングして、それをフランケンシュテイングして、私が望むことをすることによって、私のことを学びました。私はいつもファイルI/Oで恐ろしいことがあったので、ここでいくつかの間違いを犯しましたが、うまくいくようです... 私はそれをメインの質問 – swicano

+0

で編集します。私の答えは更新されました。あなたのプログラムの実際の問題は、実際に 'buffer'の割り当て問題でした。 –

0

間欠的なprintfによって問題を捕まえようとしている場合は、fflushでそれらを使用するよりも。 \ nもそのように機能します。または、見えているハンギングアプリを見て何も言うことはできません。

関連する問題