ошибка сегментации при назначении строки в stack.top ()

Я работал над базовым калькулятором, который может принимать сложные математические выражения, такие как: (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;
}

segfault происходит в std::cout << "10\n"; при звонке std::string topToken = st.top();

Я дам некоторые входы / выходы

intput: (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)

я провел еще несколько тестов, которые я мог бы легко опубликовать здесь, но, честно говоря, они стали очень излишними. Если вы, ребята, хотите увидеть больше, вам нужно просто спросить, и я с удовольствием предоставлю больше. Однако я чувствую, что эти двое должны предоставить достаточно информации …

Я знаю, где происходит segfault, и я догадываюсь, почему .. поэтому, если кто-нибудь сможет подтвердить мне, почему именно происходит ошибка, это было бы здорово, и любые решения проблемы будут высоко оценены.

П.С .: любые опечатки в коде — опечатки! Я скопировал код, перепечатав его, так как я пишу на ОС 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

Таким образом, я также получаю segfault при звонке strArray.assign( out.begin(), out.end() );

1

Решение

Добавьте следующее после строки const std::string token = inputTokens[i];:

std::cout << "inputTokens[" << i << "]: " << token << std::endl;

Я думаю, вы обнаружите, что есть проблема с inputTokens вектор или, возможно, size не правильно

Из любопытства — почему вы проходите в size в качестве аргумента вместо использования inputTokens.size()?

0

Другие решения


По вопросам рекламы [email protected]