C - доступ к массиву структур - PullRequest
0 голосов
/ 10 ноября 2018

Я пытаюсь закодировать свою собственную машину Тьюринга. Моя программа принимает в качестве аргументов два файла: мою исходную ленту, с которой машина должна будет работать, и файл правил. Этот файл правил состоит из одного правила в строке, и каждое правило состоит из пяти целых чисел: текущее состояние, найденный символ, новый символ, направление движения головы и новое состояние. Для этого у меня есть функция, которая читает мой файл и помещает каждый набор из пяти int в структуру правила. Затем создается массив этих структур.

То, что я пытаюсь сделать, это вернуть этот массив, чтобы иметь возможность использовать его позже. Вот что у меня есть:

struct rule {
    int cur_state;
    int symbol;
    int new_symbol;
    int direction;
    int new_state;
};
typedef struct rule rule;
struct vect {
    int nb_elem;
    rule *p;
};

vect rule_generator (char * file_rule){
    int line_number = 0;
    int ligne;
    char tmp;
    rule rule_list[line_number];
    vect output_rules;
    FILE * file;
    file = fopen(file_rule, "r");

    for(tmp = getc(file); tmp != EOF; tmp = getc(file)){
        if ( tmp == '\n')
            line_number++;
    }
    output_rules.p = malloc(line_number*sizeof(rule));
    assert(output_rules.p);
    output_rules.nb_elem = line_number;
    for (ligne = 0; ligne < line_number; ligne++ ){
        fscanf(file, "%d %d %d %d %d", &rule_list[ligne].cur_state, 
&rule_list[ligne].symbol, &rule_list[ligne].new_symbol, 
&rule_list[ligne].direction, &rule_list[ligne].new_state);
    }

    fclose(file);
    return output_rules;
}
int main (int argc, char *argv[]){
    vect rule_list = rule_generator(argv[2]);
    printf("symbole : %ls \n", &rule_list.p[0].symbol);
    return 0;
}

Как некоторые из вас, возможно, уже догадались, это ничего не печатает ... Я некоторое время чесал голову, пытаясь получить доступ к своему массиву. Я мог бы действительно использовать здесь руку!

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Здесь много чего происходит.

Основная проблема заключается в том, что этот цикл:

for(tmp = getc(file); tmp != EOF; tmp = getc(file)){
    if ( tmp == '\n')
        line_number++;
}

проходит через файл до конца, что означает, что fscanf() ничего не осталось для чтения. Если вы хотите прочитать весь файл один раз, чтобы узнать количество строк, а затем снова прочитать его, чтобы прочитать содержимое, вам придется либо а) закрыть и снова открыть его, либо б) использовать rewind() или fseek() функция для возврата к началу файла.

(Если честно, еще лучшим решением было бы разработать код так, чтобы вам не нужно было читать файл дважды. Если вы попытаетесь это сделать и застрянете, задайте еще раз новый вопрос по этому вопросу сайт.)

Кроме того, вы должны добавить эти строки в начале вашего кода:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

для чтения в заголовочных файлах, которые определяют используемые вами функции, и поместите эту строку после определения struct vect, чтобы определить тип:

typedef struct vect vect;

Также, пожалуйста, запустите ваш компилятор с включенными предупреждениями. Это помогло бы вам самостоятельно найти некоторые из этих проблем!

0 голосов
/ 10 ноября 2018

Мало проблем здесь.

  1. Вы объявляете массив размером 0.

    int line_number = 0; rule rule_list[line_number];

    Вам не нужно rule_list, просто удалите его.

  2. output_rules не где initilized, кроме выделения памяти.

Решение:

Я бы предложил вам использовать output_rules для fscanf.

for (ligne = 0; ligne < line_number; ligne++ ){
        fscanf(file, "%d %d %d %d %d", &output_rules.p[ligne].cur_state, 
          &output_rules.p[ligne].symbol, &output_rules.p[ligne].new_symbol, 
          &output_rules.p[ligne].direction, &output_rules.p[ligne].new_state);
    }

Также вы хотели напечатать значение symbol?

Как вы используете %ls, который используется для wchar_t *.

printf("symbole : %ls \n", &rule_list.p[0].symbol);

должно быть

printf("symbole : %d \n", rule_list.p[0].symbol);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...