通常我会在Stack Overflow上找到解决方案来解决一些关于C / C ++编程的愚蠢问题,但这一次不是关于缺少“;”或一个简短的char数组。
这是一个简单的概念:链表。 但是以圆形形式:a-> b-> c-> d-> e-> f-> a-> b-> .... 就这么简单。
除了一些非常奇怪的事情发生。 让我解释一下。
我所做的是以位为单位翻译字符,但是“字符位”:我计算char十进制值的二进制值,然后在链表的节点中写入每个单独的1和0。 由于我需要以圆形,无边框的方式阅读此列表,因此我将其构建为环状,这意味着最后一个“ - > next”包含第一个项目的地址。 然后,通过一个非常简单的函数“forward()”(当我需要> 1跳跃时被覆盖为“forward(int)”),我只读取任意长度的组中的单个位,从半随机位置开始环。 并且 ring 没有结束,即使“跳跃”结束超出最后一个项目(或者一组位穿过它),我只是落在第一个并且一切都很好。
所以
我从戒指的第一个元素开始阅读。 我收集4位,将它们翻译成十进制值,然后通过尽可能多的项目“跳跃”。 此时我只读取3 + 3 + 2位,将它们翻译为小数,并将这些值用于其他内容。 同时,每当我通过环时,我将当前位置保存在变量中,以便下一个“读取和跳跃”将从那里开始,而不是从头开始。
经过几轮后,取决于戒指的持续时间,其中一个“ - >下一个”地址出现严重错误,并且莫名其妙地变成了像517f7f7f或92808080(是的,他们真的看起来那样,重复对)和程序崩溃。
为了理解出了什么问题,我写下了相当多的“cout”,报告程序在每个函数的哪个阶段得到,并或多或少明确地告诉我发生了什么,完成变量的当前值和一切。 非常奇怪的是,即使在冗长的[do while]循环期间也会发生错误,除了读取节点的地址之外什么都没有(它是一个cout,因此没有“== to =”可能的疏忽)。
所以,一切都好几轮,直到......“某事”发生,节点“下一个”值中的一个地址变为可疑的完美外观数字和 sbam!,Windows告诉我程序崩溃了。
如果您需要其他一些细节或一些代码块来更好地了解情况,请告诉我。
这里有一些代码块,创建列表并与列表交互的部分,以及输出的一部分(对于意大利语而言,它不应该阻止对正在发生的事情的理解)。
class girdleNode
{
public:
girdleNode();
~girdleNode();
void setBit(uchar bitIn){bit = bitIn;}
uchar getBit(){return bit;}
friend class keyGirdle;
private:
girdleNode * next;
uchar bit;
};
class keyGirdle
{
public:
keyGirdle(ullong);
~keyGirdle();
void setFirst(girdleNode * pFirst){this->first = pFirst; current = first;}
void forward();
void forward(uint);
void atFirst(){current = first;}
void atNode(ullong);
private:
girdleNode * current;
girdleNode * first;
};
keyGirdle::keyGirdle(ullong length)
{
first = new girdleNode;
girdleNode * pCursor = first;
pCursor->setBit(0);
for (ullong c = 0; c < (length - 1); c++)
{
pCursor->next = new girdleNode;
pCursor = pCursor->next;
pCursor->setBit(0);
}
pCursor->next = first;
current = first;
}
uchar main_class::leaper(girdleNode * node)
{
girdleNode * pCursor = node;
do //this loop exposes the girdle as it is starting with the node provided in the function argument
{
std::cout << pCursor << "<->";
pCursor = pCursor->next;
}while (pCursor != node); //THIS is the point where addresses go wrong, in the middle of this loop
pCursor = node; //I assign the starting node again after I moved the cursor
for (int c = 0; c < 4; c++)
{
std::cout << "c= " << c << " << pCursor= " << pCursor << "\n"
"pCursor->getBit()= " << (pCursor->getBit() ? "1" : "0") << "\n"
"pCursor->next= " << pCursor->next << "\n";
leapBits[c] = pCursor->getBit();
pCursor = pCursor->next;
std::cout << "new pCursor value= " << pCursor << "\n\n";
}
return bits2dec(leapBits[0], leapBits[1], leapBits[2], leapBits[3]);
}
[.....]
>> Stage: 302
>> Stage: 1702
>> Stage: 602
>> Stage: 107
>> Stage: 2301
>> Stage: 2302
Esposizione keyGirdle prima della lettura dei leapBits:
0x732c28<->0x732cb0<->0x732cc0<->0x732cd0<->0x732ce0<->0x732cf0<->0x732d00<->0x7 32d10<->0x732d20<->0x732d30<->0x732d40<->0x732d50<->0x732e78<->0x732e88<->0x736b b8<->0x736be0<->
[.....]
>> Stage: 302
>> Stage: 1702
>> Stage: 602
>> Stage: 107
>> Stage: 2301
>> Stage: 2302
Esposizione keyGirdle prima della lettura dei leapBits:
0x732c28<->0x732cb0<->0x51808080<->
在那里你看到节点列表结束于第三个地址(0x51808080)是程序中断的地方,并且Windows警告出现告诉我它停止工作。 这两个输出来自同一次运行,它们不是多次测试的结果(注意列表中的相同地址)。