【问题标题】:C - accessing a structure arrayC - 访问结构数组
【发布时间】:2018-11-10 12:14:34
【问题描述】:

我正在尝试编写我自己的图灵机。我的程序接受两个文件作为参数:机器必须使用的初始磁带和规则文件。该规则文件由每行一条规则组成,每条规则是五个整数:当前状态、找到的符号、新符号、前进方向和新状态。为此,我有一个函数可以读取我的文件并将每组五个 ints 放入规则结构中。然后生成这些结构的数组。

我想要做的是返回这个数组以便以后能够使用它。这是我所拥有的:

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

正如你们中的一些人可能已经猜到的那样,这不会打印任何东西......我一直在挠头,试图访问我的数组。我真的可以在这里用一只手!

【问题讨论】:

    标签: c arrays struct


    【解决方案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);
    

    【讨论】:

    • 完全成功,非常感谢!看起来我在这里的变量声明有点搞砸了哈哈。
    【解决方案2】:

    这里发生了很多事情。

    主要问题似乎是这个循环:

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

    正从文件到最后,这意味着fscanf() 没有任何内容可供阅读。如果您想通过一次读取整个文件以找出行数,然后再次读取以读取内容,您将不得不 a) 关闭并重新打开它,或者 b) 使用 @987654321 @ 或 fseek() 函数返回到文件的开头。

    (说实话,更好的解决方案是设计您的代码,这样您就不需要重复读取文件两次。如果您最终尝试这样做并卡住了,请再次提出关于此的新问题网站。)

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

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

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

    typedef struct vect vect;
    

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

    【讨论】:

    • 您好,感谢您的回答!对于包含,我不是故意放在这里的,为了给你们一些更干净的东西。我不知道我必须倒带指针,我想这是有道理的,你让我觉得很愚蠢,哈哈,非常感谢!另外,对于 typedef : struct vect vect;我似乎忘记从我的代码中复制/粘贴它,我的错:D
    • @Bruh 很高兴有帮助!下次您提出问题时,请将您的 代码 减少到显示问题的尽可能少,然后发布 all 该代码。这样一来,您不知道的重要部分就会被包括在内,我们不必猜测您向我们展示了哪些部分,哪些部分您不是。这里有一些非常有用的建议:stackoverflow.com/help/mcve 不要觉得自己愚蠢——每个人都从某个地方开始!祝你好运!
    • 最后,请记住,如果您喜欢这个答案和此页面上的其他答案,或者实际上网站上的任何答案,您可以单击“向上”箭头将它们投票为“有用的答案” "。
    • 它说我的声誉太低,所以它没有显示我的投票:p 我想我需要更加活跃
    • @Bruh 我的错。你需要十五个声望才能投票。给你,现在你有了。 :-) stackoverflow.com/help/privileges
    猜你喜欢
    • 1970-01-01
    • 2014-04-07
    • 2014-01-21
    • 2018-05-27
    • 2018-06-08
    • 2017-01-28
    • 2021-09-20
    • 2017-04-13
    • 1970-01-01
    相关资源
    最近更新 更多