C-访问结构数组

时间:2018-11-10 12:14:34

标签: c arrays struct

我正在尝试编写自己的图灵机。我的程序将两个文件作为参数:我的机器必须使用的初始磁带和一个规则文件。该规则文件每行包含一个规则,每个规则是五个整数:当前状态,找到的符号,新符号,磁头行进方向和新状态。为此,我有一个函数可以读取我的文件,并将找到的每5个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 :(得分:1)

这里没有什么问题。

  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);

答案 1 :(得分:1)

这里有很多事情。

主要问题似乎在于此循环:

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

一直到文件末尾,这意味着fscanf()没什么可读取的。如果您想一次读取整个文件以找出行数,然后再次读取以读取内容,则必须a)关闭并重新打开它,或b)使用{{ 3}}或rewind()函数返回到文件的开头。

(说实话,一个更好的解决方案是设计代码,这样您就不需要重复读取文件了。如果您最终尝试这样做并陷入困境,请再次提出一个新问题网站。

此外,您应该在代码的开头添加以下行:

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

读取定义您正在使用的功能的头文件,并将此行放在struct vect定义之后以定义类型:

typedef struct vect vect;

此外,在启用警告的情况下运行编译器。这样可以帮助您自己找到其中的一些问题!