0

我有带有多个头文件和源文件的 ac 程序。运行时,程序给出分段错误。在使用“up”和“print variable”命令时,我发现函数“busntoint()”不能正常工作。

我有以下函数将长度为 n 的字符串从二进制转换为十进制:

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

0

您的第一个问题可能在于您滥用pow计算二的幂以及您的计算可能遇到的溢出。

计算二的整数幂的正确方法是移位运算符,这里是

2u << (n-1-i)

后缀u是为了确保它具有正确的类型 ( unsigned)。但是你还必须确保你移动的值不会太大,你必须保证相应的幂仍然适合unsigned. 您没有告诉我们您的架构是什么,并非所有架构都unsigned具有 32 位。

那么你的LoadMemory功能也看起来很假。据我所知,不能保证addr(您没有显示类型)小于4096.

于 2013-07-28T20:37:34.367 回答
0

利用unsigned int addr = bus32toint(line);

于 2013-07-28T21:54:03.410 回答