我在“read_file”之前得到“期望初始化程序”作为错误。错误在行“指令代码[] read_file(指令代码[])。”它在线上搜索网页寻求帮助,所有我发现是与c ++相关的帖子,所以要澄清这是针对C。
我试过移动函数原型的定位。我之前编写了相同的程序,实现了链表而不是数组,我没有错误,所以我认为它可能与结构数组有关。
感谢您的帮助。
#include<stdio.h>
#include <stdlib.h>
typedef struct instruction{
int op; //opcode
int l; // L
int m; // M
} instr;
FILE * ifp; //input file pointer
FILE * ofp; //output file pointer
instruction code[501];
instruction code[] read_file(instruction code[]);
char* lookup_OP(int OP);
void print_program(instruction code[]);
void print_input_list(instruction code[]);
int main(){
code = read_file(code);
print_input_list(code);//used for debugging
print_program(code);
}
instruction code[] read_file(instruction code[]){
int i = 0;
ifp = fopen("input.txt", "r");
while(!feof(ifp)){
fscanf(ifp,"%d%d%d",&code[i]->op, &code[i]->l, &code[i]->m);
i++;
}
code[i]->op = -1; //identifies the end of the code in the array
fclose(ifp);
return code;
}
答案 0 :(得分:1)
instruction code[] read_file(instruction code[])
不是合法语法。您无法从函数返回数组。此外,全局code
是一个数组。所以这项任务也是非法的 - 你必须修复这两个地方。
code = read_file(code);
你想要的只是:
void read_file(instruction code[])
并称之为:
read_file(code);
无需转让。
实际上现在我读了一些,因为code
是全局的,你根本不需要参数。
答案 1 :(得分:0)
尝试使用函数返回calloc
- ed(请参阅calloc(3)手册页)指针instr
。
所以
instr* read_file(const char*filename)
{
instr* arr=NULL;
int len=0, size=0;
FILE* f= fopen(filename, "r");
if (!f) { perror(filename); exit(EXIT_FAILURE); };
while (!feof (f)) {
if (len>=size-1) {
int newsize = 5*len/4+50;
instr* newarr = calloc(newsize, sizeof(instr));
if (!newarr) { perror("calloc"); exit(EXIT_FAILURE); };
if (arr) memcpy (newarr, arr, sizeof(instr)*len);
free (arr);
arr = newarr;
size = newsize;
};
if (fscanf(f, "%d %d %d",
&arr[len]->op, &arr[len]->l, &arr[len]->m)<3)
break;
len++;
}
arr[len]->op = -1; // end of array marker
fclose(f);
return arr;
}
上面的函数读取instr
[在指针arr
]中的堆分配数组,并根据需要重新分配它。
不要忘记free
read_file
的结果接近程序结束。
使用上面的代码,您可以阅读大量instr
(平均PC上可能有数百万,而且远远超过500)。然后你会编码
int main() {
instr* code = read_file("input.txt");
print_program(code);
// at the very end of main
free(code);
}
答案 2 :(得分:0)
这是更正后的代码。
#include<stdio.h>
#include <stdlib.h>
typedef struct instruction{
int op; //opcode
int l; // L
int m; // M
} instruction;
FILE * ifp; //input file pointer
FILE * ofp; //output file pointer
instruction code[501];
instruction * read_file(instruction code[]);
char* lookup_OP(int OP);
void print_program(instruction code[]);
void print_input_list(instruction code[]);
int main(){
instruction * code = read_file(code);
print_input_list(code);//used for debugging
print_program(code);
}
instruction * read_file(instruction code[]){
int i = 0;
ifp = fopen("input.txt", "r");
while(!feof(ifp)){
fscanf(ifp,"%d%d%d",&code[i].op, &code[i].l, &code[i].m);
i++;
}
code[i].op = -1; //identifies the end of the code in the array
fclose(ifp);
return code;
}