Reputation: 33
I have been trying to read cfg into a multilinklist but im getting this error please someone help. It keeps on giving this error. I dont think there's any error. Please check this code and tell me where is the error which causes the program to crash with the exception attached in the picture
#include <iostream> #include <fstream> #include <cstring> using namespace std; struct prod_list{ string production; struct prod_list *next; }*head_p=NULL; //Node for linked list to store Non terminals struct rule_list{ char non_terminal; struct prod_list *first; struct rule_list *next; }*head_r=NULL; // Global variable struct prod_list *temp_p,*prev_p=NULL,*first_p=NULL,*temp1_p=NULL,*temp2_p,*newTemp; struct rule_list *temp_r,*prev_r=NULL,*first_r=NULL ,*temp1_r=NULL; prod_list *adding_productions_of_the_rule(string line); prod_list *add_node(prod_list *root, string production); int main() { string line; ifstream file ("cfg.txt"); if (file.is_open()) { while ( getline (file,line) ) { head_p = NULL; // Creating rule_list node temp_r = new rule_list; temp_r->non_terminal = line[0]; head_p = adding_productions_of_the_rule(line); temp_r->first = head_p; temp_r->next = NULL; if(head_r == NULL) { head_r = temp_r; prev_r = temp_r; } else { prev_r->next = temp_r; prev_r = temp_r; } } file.close(); } else { cout << "Unable to open file"; } return 0; } prod_list *adding_productions_of_the_rule(string line) { string prod = NULL; // Splitting line after arrow in cfg rule line. line = line.substr(3,line.length()); // cout << "The cfg is "+line << endl; // declaring character array of line's length char ch[line.length()]={0}; // memset(ch,'0',line.length()); // cout << sizeof(ch) << endl; // storing line in character array and printing character array for(int i=0; i<line.length(); i++){ ch[i] = line[i]; // Displaying the characters stored in character array from string line. // cout << ch[i]; } // cout << endl; char *point; point = strtok(ch, "|"); while(point != NULL){ // cout << point << endl; // Assigning each production from the cfg rule to an array of strings // production[i] = point; // cout << production[i] << endl; // Creating prod_list node prod = point; head_p = add_node( head_p, prod ); point = strtok(NULL, "|"); // i++; } return head_p; } prod_list *add_node(prod_list *root, string production){ prod_list *next_ptr = NULL; prod_list *prev_ptr = NULL; if(root == NULL){ //list is empty if( (root = new prod_list) != NULL){ next_ptr = root; // cin >> next_ptr->title; next_ptr->production = production; next_ptr->next = NULL; }else{ cout << "Error: Unable to allocate memory. " << endl; return NULL; } return next_ptr; }else{ //list has members. next_ptr = root; while(next_ptr->next != NULL){ next_ptr = next_ptr->next; } prev_ptr = next_ptr; if((next_ptr = new prod_list)!= NULL){ prev_ptr->next = next_ptr; next_ptr->production = production; next_ptr->next = NULL; }else{ cout << "Error: Unable to allocate memory " << endl; } } return root; }
**I have been trying to read cfg into a multilinklist but im getting this error please someone help **
https://i.sstatic.net/AgNXB.png
Upvotes: 2
Views: 18109
Reputation: 33932
Your error an be reduced to a very minimal case:
#include <string>
int main() {
std::string prod = NULL;
}
What's happening is this is trying to make a std::string
out of a NULL pointer. Obviously there is nothing there for the string
to work with, so it did the only thing it could do: scream for help.
Solution:
Don't assign anything. std::string
will default construct an empty string.
Upvotes: 5