gpt4 book ai didi

C++ 奇怪的段错误

转载 作者:行者123 更新时间:2023-11-28 07:50:54 24 4
gpt4 key购买 nike

我的程序出现了一个奇怪的段错误。 Dlist 是一个创建链接列表的类,其中包含从动态列表中插入和删除项目的操作。我肯定我对这个类的实现是正确的,但是这段代码产生了一个段错误。奇怪的是,当我让我的 atleastTwo 和 atleastOne 函数通过引用传递时,seg 错误消失了,一切都编译通过了。谁能阐明这个问题?

bool atleastTwo(Dlist<double> stack){
try{
stack.removeFront();
stack.removeFront();
} catch(emptyList e){
cout << "Not enough operands\n";
return false;
}
return true;
}

bool atleastOne(Dlist<double> stack){
try{
stack.removeFront();
} catch(emptyList e){
cout << "Not enough operands\n";
return false;
}
return true;
}

void processInput(inputs usrInput, Dlist<double> &stack){
switch(usrInput){
case i_add:
if(atleastTwo(stack)){doOperation(stack, add);}
break;
case i_subtract:
if(atleastTwo(stack)){doOperation(stack, subtract);}
break;
case i_multiply:
if(atleastTwo(stack)){doOperation(stack, multiply);}
break;
case i_divide:
if(atleastTwo(stack)){doOperation(stack, divide);}
break;
case i_negation:
if(atleastOne(stack))negation(stack);
break;
case i_duplicate:
if(atleastOne(stack)){duplicate(stack);}
break;
case i_reverse:
if(atleastTwo(stack)){reverse(stack);}
break;
case i_print:
if(atleastOne(stack)){print(stack);}
break;
case i_clear:
clear(stack);
break;
case i_printAll:
printAll(stack);
break;
default:
break;
}
}

T *removeFront();
// MODIFIES this
// EFFECTS removes and returns first object from non-empty list
// throws an instance of emptyList if empty

谢谢

最佳答案

关于问题本身,我看不出您的代码会出现段错误。我怀疑问题出在 Dlist 的代码中,可能是析构函数实现不当?

要解决您的问题,您可以在 Dlist 中实现元素计数并检查它。但也许你不允许修改 Dlist。避免跳动代码和过多测试的首选解决方案将遵循建议。不要测试操作数的数量,而是尝试它,并将异常处理程序放入您的处理方法中。第二种解决方案的问题是堆栈可能保持不一致状态:这意味着您无法继续计算,应该从头开始。

void processInput(inputs usrInput, Dlist<double> &stack)
{
try{
// .... your old code WITHOUT ifs
} catch(emptyList e){
cout << "Not enough operands\n";
}
}

我想后者是一种可行的方法,您可以保留堆栈的拷贝并在一个拷贝上进行计算。这种方式和上面的代码更容易阅读和理解,性能会好得多。

希望对你有帮助。

关于C++ 奇怪的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13813992/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com