lundi 3 août 2015

Cant figure out segmentation fault

I am having trouble trying to figure out where my segmentation faults are coming from. I have narrowed it down to the function and snippet of code but I'm stumped. Mind taking a look at it?

P.S. I ask that you guys dont be too harsh on the negative votes. I am a student and im teaching myself plain c as I go. Not to mention im manipulating strings which is a pain in c so I understand my code looks like crap. But give me a break. That's why I'm here to learn.

Anyway let me know what else you need and thanks in advance.

Here is the console output.

   rpf0024@cse02:~/cse2610$ gcc -std=gnu99 main.c
   rpf0024@cse02:~/cse2610$ ./a.out

   # A demonstration of some simple MIPS instructions
   Loop: sll $t1, $s3,
   add $t1, $t1, $s6
   lw $t0, 0($t1)
   bne $t0, $s5, Exit
   addi $s3, $s3, 1
   j Loop
   Exit:

   Line: 0 #
   Line: 1
   Line: 2 Loop
   Line: 3 add
   Line: 4 lw
   Line: 5 bne
   Line: 6 addi
   Line: 7 j
   Line: 8 Exit
   WompWompWompSplitting string:

   add
   $t1
   $t1
   $s6
   Segmentation fault (core dumped)
   rpf0024@cse02:~/cse2610$

Assem.c - I have verified the segmentation faults are somewhere within my batch of "if" statements. I deleted that whole block of code and my program ran just fine.

int checkRformat(char *LineArray, struct assem item)
{
    int i = 0;
    char *str;
    char *temp;
    item.opcode = NULL;
    item.shamt = NULL;
    item.funct = NULL;
    item.rs = NULL;
    item.rt = NULL;
    item.rd = NULL;

            printf("Splitting string:\n");
            temp = strdup(LineArray);
            str = strtok(temp, " ,.-#\n\t");
    //this helper function gets called by another.It primarily serves to convert the MIPS code
    //instructions or labels into their binary values. These global variables will then concatenated
    // and be printed onto a .txt file. 
        while(str != NULL)
    {
        printf("%s\n", str);
        str = strtok(NULL, " ,.-#\n\t");

        if(strcmp(str, "add"))
        {
            item.opcode = "000000";
                item.shamt = "00000";
                    item.funct = "10100";
        }
        else if(strcmp(str, "$t0"))
        {
            if(strcmp(item.rs, NULL)){item.rs = "01000";}
                else if(item.rt, NULL){item.rt = "01000";}
                    else if(item.rd,NULL){item.rd = "01000";}
        }
        else if(strcmp(str, "$t1"))
        {
            if(strcmp(item.rs,NULL)){item.rs = "01001";}
                else if(item.rt,NULL){item.rt = "01001";}
                    else if(item.rd,NULL){item.rd = "01001";}
        }
        else if(strcmp(str, "$s6"))
        {
            if(strcmp(item.rs,NULL)){item.rs = "11110";}
                else if(item.rt,NULL){item.rt = "11110";}
                    else if(item.rd,NULL){item.rd = "11110";}
        }
    }
}

assem.h

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

struct assem
{
        char myString[101];                     //buffer
        char *myLines[20];                      //this will store the lines from a text file..up to 20 lines
        char *myLines2[20];
        char *myWord[20];                       //this stores the 1st words individually.
        char *opcode;
        char *rs;
        char *rt;
        char *rd;
        char *shamt;
        char *funct;
        char counter;                           //counter for number of lines
                                                //printing stuff...prints file directly from whats STORED IN THE ARRAY
};

int readFile(FILE *FileToBeRead, struct assem *item);                                   //takes in the file that needs to be read and splits it into lines
int firstCheck(struct assem item);
int secondCheck(struct assem item);
int checkRformat(char *LineArray, struct assem item);
int checkFormat1(char *LineArray,struct assem item, int offset);
int checkFormat2(char *LineArray, struct assem item, int offset);
int checkFormat3(char *LineArray, struct assem item, int offset);
int checkFormat4(char *LineArray, struct assem item, int offset);
int checkFormat5(char *LineArray, struct assem item, int offset);
int checkFormat6(char *LineArray, struct assem item);
int checkFormat7(char *LineArray, struct assem item);
int checkLabel1(char *Array, struct assem item);
int checkLabel2(char *Array, struct assem item);
int checkLabel3(char *Array, struct assem item);
//int checkSyntax1(char *LineArray, struct assem item);
void removeSpaces(char* str_trimmed, const char* str_untrimmed, struct assem *item);    //HELPER FUNCTIONS TO REMOVE SPACES
void ReadWords(struct assem *item);                                                     //stores the first word of each line in an array for evaluation
void printFile(struct assem item);                                                      //prints some stuff
void printWords(struct assem item);                                                     //checks the first character if its instruction, label, or comment

Aucun commentaire:

Enregistrer un commentaire