0

I wrote and run this code in Windows, in DEV C++ but I am keep getting a Segmentation fault on Ubuntu's terminal when I try to run this program. Here is my whole code.

#include<iostream>
#include<string>
#include<fstream>
#include<cmath>

using namespace std;

int Str2NumByAscii(const string& str); // convert string to number
                                       // by means of ascii table for
                                       // numbers 0-9 (ascii code: 48-57)
int* findRegister(string regreader1, string* regname, int* regadress[]);

void MOV(int* Rx, int* Ry);
void ADD(int* Rx, int* Ry);
void SUB(int* Rx, int* Ry);
void HLT(int* RegAdr[]);
void JMP(int *Rx, int number, int linenum,ifstream &read, string operation, string regreader1,string regreader2);

int main() {

    int R1=1,R2=2,R3=3,R4=4,R5=5;
  int* regadress[5]={&R1,&R2,&R3,&R4,&R5};
    string regname[5]={"R1","R2","R3","R4","R5"};

//  cout<<"Registered values before any operation\n";
//  HLT(regadress);

    string operation;//that string is for makin
  string regreader1;
  string regreader2;

    ifstream read;
    read.open("example.txt");

  int linenum = 0;
  string line;

     while (!read.eof()){
    getline(read, line);
    cout<<line<<endl;
    linenum++;
  }

  cout<<"total number of lines in file : " <<linenum<<endl;

  read.close();
  read.open("example.txt"); // for going the beginning of the file

  int current_line = 1; // keeps the number of current line
  while (!read.eof()){
    getline(read, operation,  ' ')  ;
    getline(read, regreader1, ',')  ;
    getline(read, regreader2, '\n') ;
    current_line++;

    int number;
    int* Rx = findRegister(regreader1,regname,regadress);

    int* Ry=findRegister(regreader2,regname, regadress);

if(!Ry) {
      number = Str2NumByAscii(regreader1);
      // call JMP function here
    }
    if(operation == "MOV"){
      MOV(Rx,Ry);
    }
    else if (operation == "ADD"){
      ADD(Rx,Ry);
    }
    else if(operation == "SUB"){
      SUB(Rx,Ry);
    }
  else if(operation== "JMP"){
    JMP(Rx,number,current_line, read, operation, regreader1,regreader2 );
  }
else if(operation=="HLT"){
    HLT(regadress);
    return 0;

}
  }
  cout<<"Registered values after any operation\n";
  HLT(regadress);
    return 0;

} // end of main()

int* findRegister( string regreader1, string* regname, int* regadress[] ){
  for(int i=0; i<5; ++i){
    if(regreader1==regname[i]){
      return regadress[i];
    }
  }
  return 0; // nullptr
}

int Str2NumByAscii(const string& str){
  int N = str.size();
  int number = 0 ;
  for(int i = 0; i < N; ++i ){
    char ch = str[i];
    int num = ch - 48;
    number += num * pow(10,N-i-1) ;
  }
  return number;
}

void MOV(int* Rx, int* Ry){
  *Rx = *Ry ;
}

void ADD(int* Rx, int* Ry){
  *Rx = *Rx + *Ry ;
}

void SUB(int* Rx, int* Ry){
  *Rx = *Rx - *Ry ;
}

void HLT(int* RegAdr[]){
  for(int i = 0 ; i < 5 ; ++i )
    cout<<*RegAdr[i]<<" ";
  cout<<"\n";

}
void JMP(int *Rx, int number, int linenum,ifstream &read, string operation, string regreader1,string regreader2){

if(Rx==0){
    while(number>=linenum && !read.eof()){
            getline(read, operation,  ' ')  ;
    getline(read, regreader1, ',')  ;
    getline(read, regreader2, '\n') ;

    }
}
}

/* example.txt
MOV R1,R2
SUB R1,R2
JMP R1,2
SUB R4,R5
HLT
*/

I am getting an segmentation fault about this function.

  int* findRegister( string regreader1, string* regname, int* regadress[] ){
      for(int i=0; i<5; ++i){
        if(regreader1==regname[i]){
          return regadress[i];
        }

Could you please help me ?

3
Contributors
2
Replies
39
Views
4 Months
Discussion Span
Last Post by rubberman
0

@Baran_1: CodeBlocks is a development UI that uses GCC under the covers to compile stuff. What compiler version are you running?

Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.