我一直在研究一种基本的计算器,它可以采用复杂的数学表达式,如:(2-4)* 7 /(3/4)等等
我正在使用分流码算法的实现......
我在Linux操作系统上。使用gdb调试器我已将一个分段错误隔离到一个函数。 使用cout语句我已经将它进一步隔离到单行...但是我无法理解为什么这一行给了我一个段错误...我会在短时间内给出更多关于确切位置的信息,首先是一些代码..
bool infixToPostfix(const std::vector<std::string>& inputTokens, const int& size, std::vector<std::string>& strArray){
std::cout << "1" << std::endl;
bool success = true;
std::list<std::string> out;
std::stack<std::string> st;
for(int i = 0; i < size; i++){
std::cout << "2\n";
const std::string token = inputTokens[i];
if(isOperator(token)){
std::cout << "3\n";
const std::string o1 = token;
if(!st.empty()){
std::cout << "4\n";
std::string o2 = st.top();
while(isOperator(o2) && ((isAssociative(o1, LEFT_ASSOC) && cmpPrecedence(o1, o2) == 0) || (cmpPrecedence(o1, o2) < 0))){
std::cout << "5\n";
st.pop();
out.push_back(o2);
if(!st.empty()){
std::cout << " 6\n";
o2 = st.top();
}
else{
std::cout << "7\n";
break;
}
}
}
std::cout << "8\n";
st.push(o1);
}
else if(token == "("){
std::cout << "9\n";
st.push(token);
}
else if(token == ")"){
std::cout << "10\n";
std::string topToken = st.top();
while(topToken != "("){
std::cout << "11\n";
out.push_back(topToken);
st.pop();
if(st.empty() ){
std::cout<< "12\n";
break;
}
std::cout << "13\n";
topToken = st.top();
}
if(!st.empty()){
std::cout << "14\n";
st.pop();
}
if(topToken != "("){
std::cout << "15\n";
return false;
}
}
else{
std:: cout << "16\n";
out.push_back(token);
}
}
while(!st.empty()){
std:: cout << "17\n";
const std::string stackToken = st.top();
if(isParentheses(stackToken)){
std::cout << "18\n";
return false;
}
std::cout << "19\n";
out.push_back(stackToken);
st.pop();
}
std::cout << "20\n";
strArray.assign(out.begin(), out.end());
return success;
}
调用std::cout << "10\n";
std::string topToken = st.top();
发生了段错误
我会给出一些输入/输出
输入:(8*2)
输出:1
2
9
2
3
4
8
2
3
4
5
6
8
2
10
11
13
14
2
10
segfault (core dumped)
输入:(4/4)
输出:1
2
9
2
3
4
8
2
3
4
5
6
8
2
10
11
13
14
2
10
segfault (core dump)
还有一些我跑过的测试,我可以很容易地在这里发布但是它们变得非常多余,老实说。如果你们想要看到更多,你只需要问我,我很乐意提供更多。不过我觉得这两个应该提供足够的信息...
我知道段错误发生在哪里,我有一个预感,为什么......如果有人能够向我确认为什么错误正在发生,这将是伟大的,任何问题的解决方案将非常感激。
P.S:代码中的任何拼写错误都是拼写错误!我通过重新输入代码来复制代码,因为我在Linux操作系统上编码,但我拥有一台电脑。有了这样说......代码编译没有错误,任何拼写错误的术语都是错别字!!再次感谢
编辑:在给它几天后再回到这里,我又对代码进行了一些测试。这次使用没有括号的方程式。
输入:3-9
输出:1
2
3
8
2
3
4
5
7
8
17
19
20
segfault (core dump)
输入:6/8
输出:
1
2
3
8
2
3
4
5
7
8
17
19
20
所以我在调用strArray.assign( out.begin(), out.end() );
答案 0 :(得分:0)
在第const std::string token = inputTokens[i];
行后添加以下内容:
std::cout << "inputTokens[" << i << "]: " << token << std::endl;
我认为您会发现inputTokens
向量存在问题,或size
可能无法解决问题。
出于好奇 - 为什么你传递size
作为参数而不是inputTokens.size()
?