标题中函数名称之前的预期初始值设定项。 C

时间:2013-09-12 04:28:08

标签: c initializer

我在“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;
}

3 个答案:

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