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 ?