我正在尝试编写自己的图灵机。我的程序将两个文件作为参数:我的机器必须使用的初始磁带和一个规则文件。该规则文件每行包含一个规则,每个规则是五个整数:当前状态,找到的符号,新符号,磁头行进方向和新状态。为此,我有一个函数可以读取我的文件,并将找到的每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;
}
正如您中某些人已经猜到的那样,它什么也不会打印出来。。。我已经摸了一段时间,试图访问我的数组。我真的可以在这里用一只手!
答案 0 :(得分:1)
这里没有什么问题。
您要声明大小为0的数组。
int line_number = 0;
rule rule_list[line_number];
您不需要rule_list
,只需删除它即可。
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;
此外,请在启用警告的情况下运行编译器。这样可以帮助您自己找到其中的一些问题!