Чтение файлов и передача параметров в массив struct в функции C - PullRequest
1 голос
/ 09 июня 2019

Это мой первый пост здесь, в StackOverflow!Я пытаюсь написать код, который читает код сборки и сохраняет его в массиве структур.Я реализовал функцию, которая делает это.Внутри функции кажется, что значения были правильно переданы в массив структур, так как я пытался увидеть значения в структурах с некоторыми printf.Но когда я пытаюсь увидеть те же значения вне функции (поэтому я использовал для этой функции некоторые значения printf), напечатанные значения абсолютно неверны!

Obs: логика кодане завершена, я просто пытаюсь решить проблему чтения файлов на данный момент.Obs2: .txt файл, который я пытаюсь прочитать:

oi MOV s1, s2

tchau ADD s3, s4

1 sub s5, s6

void loader(struct instructionEmMnemonico mnemonicoInstru[500]) {
    FILE* arquivo;
    int i = 0, j = 0;
    char letra = '0';
    int endline = 0;
    int mnemonico = 0;
    char line[90];
    char *token, *result;

    arquivo = fopen("teste.txt", "r");
        if(arquivo == NULL) {
            printf("Arquivo nao pode ser aberto\n");
        }
        while(!feof(arquivo)) {
            fgets(line, 90, arquivo);
            printf("%c-----------\n",line[0]);
            if(line[0] != ' ' || line[0] != '\n' || line[0] != '\t') {
                token = strtok(line,", \n\t");
                mnemonicoInstru[i].label = token;
                printf("%s\n",mnemonicoInstru[i].label);
                token = strtok(NULL,", \n\t");
                mnemonicoInstru[i].mnemonico = token;
                printf("%s\n",mnemonicoInstru[i].mnemonico);
                token = strtok(NULL,", \n\t");
                mnemonicoInstru[i].operando1 = token;
                printf("%s\n",mnemonicoInstru[i].operando1);
                token = strtok(NULL,", \n\t");
                mnemonicoInstru[i].operando2 = token;
                printf("%s\n",mnemonicoInstru[i].operando2);
            } else {
                token = strtok(line,", \n\t");
                mnemonicoInstru[i].label = token;
                printf("%s\n",mnemonicoInstru[i].label);
                token = strtok(NULL,", \n\t");
                mnemonicoInstru[i].mnemonico = token;
                printf("%s\n",mnemonicoInstru[i].mnemonico);

                token = strtok(NULL,", \n\t");
                mnemonicoInstru[i].operando1 = token;
                printf("%s\n",mnemonicoInstru[i].operando1);

                token = strtok(NULL,", \n\t");
                mnemonicoInstru[i].operando2 = token;
                printf("%s\n",mnemonicoInstru[i].operando2);

                token = strtok(NULL,", \n\t");
                mnemonicoInstru[i].operando3 = token;
                printf("%s\n",mnemonicoInstru[i].operando3);
            }
            i++;
        }
    fclose(arquivo);
}


int main() {
    struct instructionEmMnemonico programa[500];

    loader(programa);
    printf("-----\n");
    printf("%c--------\n",programa[2].label[0]);
    printf("%s---\n",programa[2].mnemonico);
    printf("%s--\n",programa[2].operando1);
    printf("%s-\n",programa[2].operando2);
return 0;
}

В printf внутри функции "загрузчик" результаты верны, но printf в основной функции не имеет никакого смысла!

1 Ответ

3 голосов
/ 09 июня 2019

Это потому, что вы назначаете указатели. mnemonicoInstru[i].label = token;

, так как token - указатель на локальную переменную line, при обращении к ней вне функции loader у вас неопределенное поведение.

Скопируйте фактическое содержимое.

mnemonicoInstru[i].label = strdup(token);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...