2009-08-21 22 views
2

私が作業していたキューコードが少しあります。私はグローバルintを使用してキューのサイズを追跡しようとしていました。cのグローバルカウンタが期待どおりに動作しない

#define MAX 100 

int size=0; 
int gEnqueue=gDequeue=0; 

int enqueue() 
{ 
    gEnqueue++; 
    if(size == MAX) 
     return QUEUE_FULL; 
/* snip the actual queue handling */ 
    size++; 
    return 0; 
} 

int dequeue() 
{ 
    gDequeue++; 
    if(!size) 
     return QUEUE_EMPTY; 

/* snip actual queue handling */ 
    if(size) 
     size--; 
    return 0; 
} 

さらに多くのコードがありますが、投稿するにはあまりにも多くのコードがあります。

何が起こっているのかは、私が設定した最大値に突入することです。両方の関数は偶数回呼び出されます。キューをダンプすると、その中に3つのアイテムしかないことがわかります。

この問題の原因は何ですか?

編集#1:コード例では、私は実際にこれは、ねじではありません

をコード化されたものと一致しました。

編集#2:私はばかだと仮定するのではなく、これをしたはずです。 呼び出しがエンキュー()とデキュー()にさえ間違っていました。

実際のメトリックは推測ではありません。

+3

MAXはどのように定義されていますか? –

+1

私が知る限り、もっとコードが必要です。 (私は何かを見逃していないことを願っています:3) –

+3

ifブロックをスコープする '{}'の不足を心配しています。作業コードに減分を残すことができますか? – dmckee

答えて

0

最も簡単な解決策は、size == MAXの場合は「エンキュー」を呼び出さないことです。

しかし、それが不可能な場合は、これを試してください:あなたは、デバッガを使用できない場合

int size=0; 
int overflow=0; 

int enqueue() 
{ 
    if(size < MAX) 
     size++; 
    else 
     overflow++; 
    return 0; 
} 

int dequeue() 
{ 
    if(overflow) 
     overflow--; 
    else if(size) 
     size--; 
    return 0; 
} 
2

Iに等しいし、プログラムを実行した後に出力を調べどのようなサイズを示す両方の機能内部のprint文を追加することを示唆しています。通常、印刷ログを見るとき、問題はかなり明らかです。

0

あなたが投稿したコードには明らかに間違ったことはありません。これは、コードを間違えたか、コードを呼び出す方法に間違っていることを示しています。これをあなた自身でデバッグする必要があります。この時点であなたを助ける2つの主なデバッグテクニックがあります:

@KPexEAは、printf()や他のロギングステートメントを使ってデバッグすることを推奨しています。 printf()を両方の関数の始めと終わりに置いて、おそらく有用であると思うほど多くの状態を出力します。

int enqueue() 
{ 
    printf("enqueue(): Enter: size=%d\n", size); 
    if(size == MAX) { 
     printf("enqueue(): Exit: QUEUE_FULL\n"); 
     return QUEUE_FULL; 
    } 
    /* snip the actual queue handling */ 
    size++; 
    printf("enqueue(): Exit: size=%d\n", size); 
    return 0; 
} 

int dequeue() 
{ 
    printf("dequeue(): Enter: size=%d\n", size); 
    if(!size) { 
    printf("dequeue(): QUEUE_EMPTY\n"); 
     return QUEUE_EMPTY; 
    } 

    /* snip actual queue handling */ 
    if(size) 
     size--; 
    printf("dequeue(): Exit: size=%d\n", size); 
    return 0; 
} 

出力を調べることで、キューのサイズがどのようになっているかが分かります。 (あなたのキュー内の要素の実際の数を数えて、関数を入力して終了するときにそれを印刷することもできます)。

他のテクニックは対話的なデバッグです。これはコードがどのように流れるかを正確に判断するのに特に便利ですが、実行中のプログラムを見るためにプログラムを実行するたびにそこに座る必要があります。 (毎回あなたのバグが毎回発生するなら、それは簡単です;たまに毎回発生するなら、あなたのプログラムの流れを後で作り直すのは難しいです。)値sizeを表示します。各関数の最後に別のブレークポイントを設定し、(1)ブレークポイントが実際にヒットし、(2)sizeに加えられた変更の期待値が満たされていることを確認します。

関連する問題