Note that there are some explanatory texts on larger screens.

plurals
  1. POC++ STATUS_ACCESS_VIOLATION error when program runs
    primarykey
    data
    text
    <p>Everytime I run the program, this mysterious error pops up saying that I have some type of status access violation. I have tried googling it and all it comes up with is that I might be trying to access some memory that is not allowed. Help would be highly appreciated!</p> <p>Here is the error when I run the program:</p> <pre><code> 2 [main] a 5772 exception::handle: Exception: STATUS_ACCESS_VIOLATION 1532 [main] a 5772 open_stackdumpfile: Dumping stack trace to a.exe.stackdump </code></pre> <p>Here is the .cpp code:</p> <pre><code>int main() { Stack s; //variable declarations StackItem *newItem; char token, nextChar, prevChar, response, check; int lineCount, apostCount; char filename[50]; bool insideComment = false, insideString = false, error, isMatch, delimError = false; fstream sourceFile; do //do while response is 'y' { do //do while opening the source file fails { cout &lt;&lt; "Enter filename of source file: "; cin.getline (filename,51); sourceFile.open(filename); //opens the file with given filename if (sourceFile.fail()) cout &lt;&lt; "File could not be opened" &lt;&lt; endl; //error if can't open sourceFile.clear(); } while (sourceFile.fail()); //exits if source file doesn't fail sourceFile.clear(); lineCount = 0; //initializes line count to zero while (!sourceFile.eof()) //exits if end of source file is reached { sourceFile.get(nextChar); //gets the next character in file if ((int)nextChar == '\n') //if next character is an end line { lineCount++; //increments line count cout &lt;&lt; "Line count: " &lt;&lt; lineCount &lt;&lt; endl; //echoes line count } else if (nextChar == '{' || nextChar == '[' || nextChar == '(') { //continues if next char is an opening token newItem-&gt;token = nextChar; //sets newItem's token newItem-&gt;lineNumber = lineCount; //sets newItem's line count if (!s.isFull()) //continues if stack isn't full s.push(newItem); //pushes newItem onto the stack s.displayStack(); //displays the stack } else if (nextChar == '}' || nextChar == ']' || nextChar == ')') { //continues if next char is a closing token if (!s.isEmpty()) //continues if stack isn't empty { isMatch = s.matchStack(nextChar); //checks if token matches top if (isMatch == true) //if true, pops the top of the stack s.pop(); else //continues if match is false { newItem-&gt;token = nextChar; //sets newItem's token newItem-&gt;lineNumber = lineCount; //sets newITem's line count s.trailingItem(newItem); //calls the trailingItem function cout &lt;&lt; endl &lt;&lt; endl &lt;&lt; "Process another file? (y/n): "; cin &gt;&gt; response; //asks user whether to continue while (response != 'y' &amp;&amp; response != 'n') //checks for input error { cout &lt;&lt; "Error! Must enter either y for yes or n for no." &lt;&lt; endl; cout &lt;&lt; endl &lt;&lt; endl &lt;&lt; "Process another file? (y/n): "; cin &gt;&gt; response; } break; //leaves the while loop } } else if (s.isEmpty()) //continues if stack is empty { newItem-&gt;token = nextChar; //sets newItem's token newItem-&gt;lineNumber = lineCount; //sets newItem's line count s.push(newItem); //pushes newItem onto the top of the stack s.processStack(); //processes the error cout &lt;&lt; endl &lt;&lt; endl &lt;&lt; "Process another file? (y/n): "; cin &gt;&gt; response; //asks user whether to continue while (response != 'y' &amp;&amp; response != 'n') //checks for input error { cout &lt;&lt; "Error! Must enter either y for yes or n for no." &lt;&lt; endl; cout &lt;&lt; endl &lt;&lt; endl &lt;&lt; "Process another file? (y/n): "; cin &gt;&gt; response; //gets user input } break; //leaves the while loop } s.displayStack(); //displays the items on the stack } else if (nextChar == '/') //continues if next char is a '/' { sourceFile.get(nextChar); //gets the next character in file if (nextChar == '*') //continues if next char is a '*' { //at this point a comment has started because of '/' then '*' insideComment = true; //sets bool to true newItem-&gt;token = 'c'; //sets newItem's token to c for "comment" newItem-&gt;lineNumber = lineCount; //sets newItem's line count s.push(newItem); //pushes the item onto the stack while (insideComment == true &amp;&amp; !sourceFile.eof()) { //continues while inside a comment and end of file isn't reached sourceFile.get(nextChar); //gets the next character in file if (nextChar == '*') //continues if next char is * { sourceFile.get(nextChar); //gets the next character in file if (nextChar == '/') //continues if next char is '/' { //at this point the comment has ended because of '*' then '/' insideComment = false; //sets bool to false s.pop(); //pops off the c in the stack } } } } else if (nextChar == '/') //continues if next char is a '/' { //at this point a comment has started because of / then another '/' insideComment = true; //sets bool to true while (insideComment == true &amp;&amp; !sourceFile.eof()) { //continues while inside a comment and not at end of file sourceFile.get(nextChar); //gets the next character in file if (nextChar == '\n') //leaves comment if next line is entered insideComment = false; //sets bool to false } } } else if (nextChar == '\n') //continues if next char is an end line { lineCount++; //increments line count cout &lt;&lt; "Line count: " &lt;&lt; lineCount &lt;&lt; endl; //echoes line count } else if (nextChar == '\"' &amp;&amp; insideComment == false) { //continues if next char is a " and is not currently inside a comment insideString = true; //sets bool to true b/c " starts a string while (insideString == true &amp;&amp; !sourceFile.eof()) { sourceFile.get(nextChar); //gets the next character in file if (nextChar == '\"') insideString = false; else if (nextChar == '\n') { lineCount++; //increments line count cout &lt;&lt; "Line count: " &lt;&lt; lineCount &lt;&lt; endl; //echoes line count } } } else if (nextChar == '\'' &amp;&amp; insideComment == false &amp;&amp; insideString == false) { //continues if next char is a ' and not in a comment or string apostCount = 1; //initializes apostrophe count (chars after first apostrophe) while (nextChar != '\'' &amp;&amp; !sourceFile.eof()) { //continues while next char isn't another ' and not end of file sourceFile.get(nextChar); //gets the next character in file prevChar = nextChar; apostCount++; //increments apostrophe count if (nextChar == '\'' &amp;&amp; prevChar == '\\' &amp;&amp; apostCount &lt;= 3) nextChar = ' '; //sets next char to space if 3 or more apostrophes else if (nextChar == '\n') //continues if next char is an end line { lineCount++; //increments line count cout &lt;&lt; "Line count: " &lt;&lt; lineCount &lt;&lt; endl; //echoes line count } } if (apostCount &gt;= 4) //if more than 3 chars come after apostrophe { //displays delimeter error cout &lt;&lt; "Character delimeter error on line " &lt;&lt; lineCount &lt;&lt; endl; delimError = true; } if (delimError == true) //continues if delimiter error occured break; //leaves 2nd while loop } } //end of while loop if (s.isEmpty() == true) //continues if no errors within stack { //displays successful nesting structure to user cout &lt;&lt; "Source file of " &lt;&lt; lineCount &lt;&lt; " lines has proper nesting structure"; cout &lt;&lt; endl &lt;&lt; endl &lt;&lt; "Process another file? (y/n): "; //asks to continue cin &gt;&gt; response; //gets user's response while (response != 'y' &amp;&amp; response != 'n') //checks for input error { cout &lt;&lt; "Error! Must enter either y for yes or n for no." &lt;&lt; endl; cout &lt;&lt; endl &lt;&lt; endl &lt;&lt; "Process another file? (y/n): "; cin &gt;&gt; response; //gets user input } } else //continues if errors are present { s.processStack(); //processes and displays the delimiter errors cout &lt;&lt; endl &lt;&lt; endl &lt;&lt; "Process another file? (y/n): "; //asks to continue cin &gt;&gt; response; //gets user's response while (response != 'y' &amp;&amp; response != 'n') //checks for input error { cout &lt;&lt; "Error! Must enter either y for yes or n for no." &lt;&lt; endl; cout &lt;&lt; endl &lt;&lt; endl &lt;&lt; "Process another file? (y/n): "; cin &gt;&gt; response; //gets user input } } } while (response == 'y'); //opens another file if user entered y for yes return 0; //quits program } </code></pre> <p>Here is the .h code:</p> <pre><code>struct StackItem //defines StackItem structure { char token; //holds delimeter int lineNumber; //holds the line number of the delimeter in the source file StackItem *next; //points to the next structure }; typedef StackItem* nodePtr; const int MAX_ITEMS = 99; class Stack //Stack class definition { private: nodePtr top; //points to the top of the stack int numberItems; //number of items in the stack public: Stack() //initializes private variables { top = NULL; numberItems = 0; } ~Stack() { while (numberItems &gt; 0) { pop(); } } bool isEmpty() //returns whether the stack is empty or not { return top == NULL; } bool isFull() //returns whether the stack is full or not { return MAX_ITEMS == numberItems;} void push(nodePtr newItem) //pushes a new item onto the top of the stack { newItem-&gt;next = top; top = newItem; numberItems++; } void pop() //removes the item on top of the stack { nodePtr p = top; //sets pointer p to what top points to top = top-&gt;next; //top is set to the next struct in stack delete p; //deletes the top item in the stack numberItems--; } void displayStack() //displays all of the items on the stack { nodePtr p = top; //sets pointer p to what top points to cout &lt;&lt; "Stack Contents: " &lt;&lt; endl; while(p != NULL) //while loop to display the stack contents { cout &lt;&lt; p-&gt;token &lt;&lt; " on line " &lt;&lt; p-&gt;lineNumber &lt;&lt; "." &lt;&lt; endl; p = p-&gt;next; } } void processStack() //displays the error for each delimeter in stack { nodePtr p = top; //sets pointer p to what top points to while (p != NULL) //continues until p points to NULL { cout &lt;&lt; "\" " &lt;&lt; p-&gt;token &lt;&lt; " \" on line " &lt;&lt; setw(5) &lt;&lt; right; cout &lt;&lt; p-&gt;lineNumber &lt;&lt; " has no matching element" &lt;&lt; endl; p = p-&gt;next; } } //determines whether the stack delimeter matches the current character bool matchStack(char character) { bool match = false; if (top-&gt;token == '{') { if (character == '}') match = true; //sets bool to true if we have { and } } else if (top-&gt;token == '[') { if (character == ']') match = true; //sets bool to true if we have [ and ] } else if (top-&gt;token == '(') { if (character == ')') match = true; //sets bool to true if we have ( and ) } return match; //returns the bool } //called if we have a trailing item that doesn't match stack delimeter void trailingItem(nodePtr newItem) //displays what doesn't match { cout &lt;&lt; "\" " &lt;&lt; top-&gt;token &lt;&lt; " \" on line " &lt;&lt; setw(5) &lt;&lt; right; cout &lt;&lt; top-&gt;lineNumber &lt;&lt; " doesn't match \" " &lt;&lt; newItem-&gt;token; cout &lt;&lt; " \" on line " &lt;&lt; setw(5) &lt;&lt; right &lt;&lt; newItem-&gt;lineNumber; } }; </code></pre> <p>Here is the a.exe.stackdump file: </p> <pre><code>Exception: STATUS_ACCESS_VIOLATION at eip=00401701 eax=61100049 ebx=0028CD40 ecx=00A01998 edx=00000000 esi=0028CD40 edi=00000000 ebp=0028CD18 esp=0028CAF0 program=C:\Users\Tyler\Desktop\Program 2\a.exe, pid 5772, thread main cs=0023 ds=002B es=002B fs=0053 gs=002B ss=002B Stack trace: Frame Function Args 0028CD18 00401701 (00000001, 009E8628, 009E8510, 00000001) 0028CD68 61007038 (00000000, 0028CDA4, 61006980, 7EFDE000) End of stack trace </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload