0

これは今まで見たことがありません。2 つの整数を比較すると、セグ フォールトが発生します。

編集:最もイライラする部分を含めるのを忘れました:DDDで正常に動作するため、これをデバッグできません。

これは、セグフォルトをバックトレースする私の gdb セッションです。

> Reading symbols from /home/michael/ecs60/hw3/3/huffman...done.
[New LWP 4109]

warning: Can't read pathname for load map: Input/output error.
Core was generated by `./huffman -d'.
Program terminated with signal 11, Segmentation fault.
#0  0x000000000040123a in huffnode::operator< (this=0x1e39010, hn=...)
    at huffnode.h:54
54      if(weight < hn.weight) {
(gdb) bt
#0  0x000000000040123a in huffnode::operator< (this=0x1e39010, hn=...)
    at huffnode.h:54
#1  0x00000000004021f4 in minheap<huffnode>::add (this=0x7fff15de7490, 
    n=...) at minheap.h:65
#2  0x0000000000401cb4 in decompress () at main.cpp:198
#3  0x00000000004012bb in main (argc=2, argv=0x7fff15de75f8)
    at main.cpp:41 <

問題のあるコードは次のとおりです。

bool huffnode::operator<(const huffnode& hn) {
    if(weight < hn.weight) {
            return true;
    } else if(weight == hn.weight) {
            return small < hn.small;
    } else {
            return false;
    }
};

問題のあるコードを呼び出す関数は次のとおりです。

template<class T>
void minheap<T>::add(T n) {
        if(size + 1 > capacity)
                incCapacity();

        heap[size] = n;
        int index = size;
        if(index == 0) return;
        while(heap[index] < heap[(index + 1)/2 -1] && index != 0) {
                swap(index, ((index+1)/2 - 1));
                index = ((index + 1)/2 - 1);
        }
        size++;
};

minheap::add を呼び出す解凍の部分は次のとおりです。

unsigned int freq[NUM_CHARS];
for(int i = 0; i < NUM_CHARS; i++) {
        in = getNum();
        freq[i] = in;
}

for(int i = 0; i < NUM_CHARS; i++) {
        if(freq[i] > 0) {
                tree.add(huffnode((int)freq[i], (char) i));
        }
}

みんなありがとう!セグフォルトは修正されましたが、プログラムの半分が明らかに壊れたコードに依存していたので、DDD に戻ります。

4

4 に答える 4

0

問題は、サイクル条件での比較順序です

 while(heap[index] < heap[(index + 1)/2 -1] && index != 0)

index != 0比較を最初に行う必要があります

 while(index != 0 && heap[index] < heap[(index + 1)/2 -1])

元のバリアントでは、最初の比較

 heap[index] < heap[(index + 1)/2 -1]

に対して実行されindex == 0ます。これは、と同等です。

 heap[index] < heap[-1]

インデックスを使用して存在しない要素にアクセスしようとすると-1、クラッシュが発生します。


チェック

if(index == 0) return;

この問題を解決するために明らかに「追加」したことは、何も解決しません。index最初はが0の場合にのみ状況をキャッチできます。indexただし、サイクルの反復中に、後で0になる状況はキャッチされません。

これは無意味なものを削除ifし、もう一度、サイクルヘッダーの比較を交換します。

于 2012-12-03T07:30:39.723 に答える
0

ほとんどの場合、整数とは何の関係もありません。次の 2 つのうちの 1 つが無効である可能性があります。

  1. 参照hn&;
  2. thisポインター。

両方を印刷すると、どちらが原因かがわかります。

編集:質問にさらにコードを追加したことに気づきました。次の行に問題があります。

while(heap[index] < heap[(index + 1)/2 -1] && index != 0) {

への引数&&は左から右にチェックされるため、次の場合は範囲​​外アクセスを避けるためにオペランドの順序を入れ替える必要がありますindex == 0

while(index != 0 && heap[index] < heap[(index + 1)/2 -1]) {
于 2012-12-03T07:06:40.423 に答える