0

我得到“'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;
}
4

3 回答 3

1

instruction code[] read_file(instruction code[])不是合法的语法。您不能从函数返回数组。另外,全局code是一个数组。所以这个分配也是非法的——你必须修复这两个地方。

 code = read_file(code);

你想要的只是:

void read_file(instruction code[])

就像这样称呼它:

read_file(code);

无需分配。

实际上,现在我阅读了更多内容,因为code它是全球性的,所以您根本不需要这些参数。

于 2013-09-12T04:31:30.540 回答
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[in pointer 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);
}
于 2013-09-12T04:32:46.120 回答
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;
}
于 2013-09-12T04:37:46.743 回答