2011-01-13 19 views
1

おはようございます!ポインタが明白な理由で何も表示されない

私はqtでcという簡単なプログラムを持っています。 short型には2つのポインタがあり、読み込まれた値からファイルおよび格納ビットを読み出すために使用されます。

サンプルコード:私は、コードのunreliant作品を聞かせてきた

//(input is a FILE* which is opened and passed to the function) 
//(output is also a FILE* which is also opened and passed to the function) 

//1. Variables declaration 
short* sample_buffer; 
int buffer_size=1; 
short samples_read; 
unsigned long value_x=7; 
short* nzb_buffer; 
short buffer_position=-1; 
int i; 

//2.Memory allocation 
sample_buffer= malloc(sizeof(short)*buffer_size); 
nzb_buffer = malloc(sizeof(short)*value_x); 

.... 

//3. Read from infile, one short at time, process and write it to outfile 
do 
{ 
    //3.1. Read from input file 
    samples_read = fread(sample_buffer,sizeof(short),buffer_size, input); 
    //3.2. Switch position inside nzb_buffer one to the right, 
    //  going back to zero if out of bounds 
    buffer_position=(buffer_position+1)%value_x; 

    .... 

    //3.3. Put least significant bit of the just read short into nzb_buffer 
    nzb_buffer[buffer_position]=sample_buffer[0]%2; 

    .... 

    //3.4. Write the short we just read from infile to the outfile 
    for (i=0;i<samples_read;i++) 
    { 
     fwrite(sample_buffer,sizeof(short),1, output); 
    } 
} while(samples_read==buffer_size); 

。あなたが何か他のものを見る必要があるなら、教えてください。

問題は、ループの10回または15回の操作後、「セグメンテーションフォルト」信号でクラッシュするという問題です。 fwrite()関数でクラッシュします。

私はデバッグし、私はsample_bufferでwatchを使用します。なんらかの理由で、1つの正確なステップで、nzb_buffer [buffer_position] = sample_buffer [0]%2という操作は、sample_bufferを0x0にします。

nzb_bufferでオーバーフローすることはできません。その操作のbuffer_positionは3です(malloc内の特定の配列に割り当てられた7つのうちの7つ)。そして、各ループは1回の書き込み操作をしてキャリーをシフトするので、nzb_buffer [3]への書き込み操作はループの前に既に発生しており、その時点でポインタを無効化しませんでした。

私はここで起こっている可能性が全くありません。 誰も何が起こっているか、どのように私はそれをデバッグするかについてのアイデアはありますか?

ありがとうございます!

PS:追加されましたコメントは、forループ

+1

ハムは、Qt C++ライブラリではありませんでしたか? – peoro

+0

正直言って、私はこのコードが何をしようとしているのか理解するのに苦労しています。私が残した部分は非常に関連性があると感じます。 –

+0

はい、しかし、私はそこにいくつかのcコードを組み込む必要があるので、この部分はcです。 qtはcと同様に動作しますが、あなたはCコードで "extern" C ""を実行してもOKです – Istrebitel

答えて

1

あなたの終了条件「のコードが何をするか」置き忘れているように見えます。私はやります:

samples_read = fread(sample_buffer,sizeof(short),buffer_size, input); 
while(samples_read==buffer_size){ 

    [...]   

    samples_read = fread(sample_buffer,sizeof(short),buffer_size, input); 
} 
+0

しかし、なぜですか? do-whileループは常に少なくとも1回は必ず発生しなければならないループに対して正確に行われました。{}の間は{}の間は{}のように正当なものですが、最初は常に1回、次に条件付きがチェックされ、2番目に条件が最初にチェックされるので、それが全く起こらない場合 – Istrebitel

+0

ファイルが空の場合、またはファイルの終わりに達したら?あなたはその場合ループしたくありません。したがって、ループは、失敗した場合、フリーダの直後に終了するように構築する必要があります。 – tibur

+0

入力がない場合は少なくとも1回は実行しないでください。 'while(fread(sample_buffer、sizeof(short)、buffer_size、input)== buffer_size)'を実行します。 –

関連する問題