0

複数のヘッダーとソース ファイルを含む ac プログラムがあります。プログラムを実行すると、セグメンテーション違反が発生します。「up」および「print variable」コマンドを使用すると、関数「busntoint()」が正しく機能していないことがわかりました。

長さ n の文字列を 2 進数から 10 進数に変換する次の関数があります。

unsigned int busntoint(int n, busn bus)
{
    unsigned int value = 0;
    int i;
    for (i=0; i < n; i++) {
            if (bus[i] == '1') value += (unsigned int)pow(2,(n-1-i));
    }
    return value;
}
unsigned int bus2toint(bus2 bus) 
{
    return busntoint(2, bus);
}
unsigned int bus32toint(bus32 bus) 
{
    return busntoint(32, bus);
}

次に、これらの関数の動作をチェックする別のプログラムを作成しました。それはうまく機能し、正しく期待される出力を提供します。「より大きな」プログラムで正しく機能しない理由はわかりません。

役に立つ場合、変数の定義は次のとおりです。

typedef char bus2[3];
typedef char bus3[4];
typedef char bus5[6];
typedef char bus6[7];
typedef char bus8[9];
typedef char bus16[17];
typedef char bus32[33];

「より大きな」プログラムでの関数の使用法は次のとおりです。

int LoadMemory(char * binfilename, bus8 memory[4096])
{
    //some code
    int addr = bus32toint(line);
    setbit8(memory[addr], &line[33]);
    //some code
}

gdb の p addr はガベージ値を与え、メモリ [addr] でセグメンテーション違反を引き起こします。

4

2 に答える 2