添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
#include #define M_PI 3.14159265358979323846264338327950288419716939937510582097494 #include<windows.h> #define gkey GetAsyncKeyState using namespace std; #define rxs regex_search #define loop while(true) double a; double num1; double c3 = 299792458 ; double c3sq = 89875517873681764 ; int mc; string again; stack<int> presedence; stack<string> oprators; queue<double> numbers; stack<char> test; double num5; double num6; int E; int abrt = 0 ; double num2; double ans = num1 + num2; int num; int numalt = 0 ; int numaltt = 0 ; // int nums [] = {srand(time(0));rand();} bool autoregex( string test){ regex e ( " [-+]?([0-9]*\.[0-9]+|[0-9]+)" ); if (regex_match (test,e)) return true ; return false ; bool autrege( string test){ regex aret( " SIN|LOG|sqrt|sin|log|tan|pi|e|ln|EE|[^0-9a-z$@#&\]" ); if (regex_match (test,aret)){ return true ; else { return false ;} void namehere( string test){ if (autrege(test) == true ){ regex bret( " [+-]" ); regex cret( " [/*xX]" ); regex dret( " SIN|LOG|sqrt|sin|log|tan|pi|!|e|ln|EE|\\^" ); regex omega( " \\)" ); regex canmae( " \\(" ); if (regex_match (test,bret)){num2 = 1 ;}; if (regex_match (test,cret)){num2 = 2 ;}; if (regex_match (test,dret)){num2 = 3 ;}; if (regex_match (test,omega)){num2 = 4 ;numaltt = numaltt + 1 ;}; if (regex_match (test,canmae)){num2 = 4 ;numalt = numalt + 1 ;}; while (again == " n" &&abrt == 0 ){ // queue<double> numbers; stack<int> pres; queue<string> output; int test; string name; getline(cin, name); istringstream iss(name); string token; while (iss >> token) if (autoregex(token) == true ){ output.push(token); if (autrege(token)== true ) // token area namehere(token); num6++; if (num2 == -1){cout<< " wrong move: " ;again = " n" ;again = " y" ;cout<<num2<<endl;} while (presedence.empty() == 1 && oprators.empty() == 1 ) presedence.push(num2); oprators.push(token); while (presedence.top() < num2) oprators.push(token); presedence.push(num2); while (presedence.top() >= num2) output.push(oprators.top()); oprators.pop(); presedence.pop(); // 3-T 2-ME while (presedence.empty() != 1 && oprators.empty() != 1 ){ output.push(oprators.top()); oprators.pop();presedence.pop();} while (!output.empty()){cout<<output.front()<< " , " ;output.pop();} while (again != " n" &&abrt == 0 ){ What I have tried:
i've got a rough idea of which line is causing the error:
while (presedence.top() >= num2) output.push(oprators.top()); oprators.pop(); presedence.pop(); because when I remove the = it works just fine, what I need to know is why adding the = causes a stack overflow?
Quote:
I keep getting process returned -1073741819 (0xc0000005) whenever I run this code, what's the reason?

You have already been told that:
Greg Utas said:
0xc0000005 is the Windows error code for an invalid memory access (SIGSEGV)

This means that for some reasons, your code messes with memory it don't own.
Since you didn't gave a sample input that cause the problem, and since we don't know what is supposed to do the code, it is difficult to do a realistic run.
Your code do not behave the way you expect, or you don't understand why !
There is an almost universal solution: Run your code on debugger step by step, inspect variables.
The debugger is here to show you what your code is doing and your task is to compare with what it should do.
There is no magic in the debugger, it don't know what your code is supposed to do, it don't find bugs, it just help you to by showing you what is going on. When the code don't do what is expected, you are close to a bug.
To see what your code is doing: Just set a breakpoint and see your code performing, the debugger allow you to execute lines 1 by 1 and to inspect variables as it execute.
Debugger - Wikipedia, the free encyclopedia [ ^ ]
Mastering Debugging in Visual Studio 2010 - A Beginner's Guide [ ^ ]
Basic Debugging with Visual Studio 2010 - YouTube [ ^ ]
1.11 — Debugging your program (stepping and breakpoints) | Learn C++ [ ^ ]
The debugger is here to only show you what your code is doing and your task is to compare with what it should do. As Solution 1 mentioned, you've already been told what the problem is.
Please do not repost questions. It is considered inappropriate to such a degree that a repost is subject to being closed.
You need to debug your code to find out why it overflows the stack. No one is going to debug it for you. They wouldn't be doing you a favor anyway, because debugging is an indispensable skill that you need to learn. Trying to debug code by studying it, or executing it with pencil and paper, is error prone and extremely inefficient for all but the simplest programs.
Since you're writing C++, I have some suggestions.
1. Get rid of the #define statements, which are rarely appropriate in C++. The first one can be replaced with
const double M_PI = 3 . 14159265358979323846 ;The others are just abbreviations, so spell them out in full. In a large program that uses external interfaces, no one will want to have to remember your custom abbreviations to read your code.
2. Don't check a bool by comparing it to 0 , 1 , false , or true . It makes the code look like it was written by a newbie. Curiously, the code only does this in some places but not others.
// Existing if (autrege(test) == true )... while (presedence.empty() == 1 && oprators.empty() == 1 )... // Cleaned up if (autrege(test))... while (!presedence.empty() && !oprators.empty())...3. Format your code by indenting code within braces, putting each statement on its own line, adding a space before and after binary operators, and using a consistent style. This will make your code much easier to read. The first thing I do, when I need to study poorly formatted code, is to reformat it.
// Existing while (presedence.empty() != 1 && oprators.empty() != 1 ){output.push(oprators.top()); oprators.pop();presedence.pop();} while (!output.empty()){cout < < output.front() < < " , " ;output.pop();} // Cleaned up while (!presedence.empty() && !oprators.empty()) { output.push(oprators.top()); oprators.pop(); presedence.pop(); while (!output.empty()) { cout < < output.front() < < " , " ; output.pop(); }Being consistent means things like
- Does a { go at the end of the line or on its own line?
- Is code indented a multiple of 3, 4, or 8 spaces?
- Is there a space between a keyword and a ( that follows?
  • Read the question carefully.
  • Understand that English isn't everyone's first language so be lenient of bad spelling and grammar.
  • If a question is poorly phrased then either ask for clarification, ignore it, or edit the question and fix the problem. Insults are not welcome.
  • Don't tell someone to read the manual. Chances are they have and don't get it. Provide an answer or move on to the next question. Let's work to help developers, not make them feel stupid.
  •