2013-09-12 2 views
0

Я получаю «ожидаемый инициализатор до« read_file »как ошибку. Ошибка находится в строке« код команды [] read_file (код команды []) ». Его строка В поисках веб-страницы для справки, все im нахождение - это связанный с C++ пост, поэтому, чтобы это объяснить, для 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; 
} 
+1

'код команды [] read_file (код команды [])' ?? –

+1

Вероятно, вам понадобится 'инструкция * read_file (код команды []) {...}'. Вы не можете вернуть массив из функции; вы можете вернуть указатели. –

+0

Вы скомпилировали это как C или C++? Он должен жаловаться на использование «инструкции» без сопроводительного ключевого слова «struct». Ваше имя typdef - 'instr', а не' инструкция'. Кроме того, не используйте 'feof' как условие цикла; он не вернется в исходное состояние до тех пор, пока вы не попытаетесь прочитать за ним конец файла, так что вы будете слишком часто выполняться. Вместо этого используйте возвращаемое значение 'fscanf' как условие цикла. –

ответ

1

instruction code[] read_file(instruction code[]) не является юридическим синтаксисом. Вы не можете вернуть массив из функции. Кроме того, глобальный code представляет собой массив. Таким образом, это назначение также является незаконным - вам придется исправить оба места.

code = read_file(code); 

Что это выглядит, как вы хотите, это просто:

void read_file(instruction code[]) 

А просто назвать это нравится:

read_file(code); 

Нет необходимости назначение.

Фактически теперь, когда я читаю еще несколько, так как code является глобальным, вам не нужны параметры вообще.

+0

Для новичков разумно предположить, что '[]' в возвращаемом типе будет означать указатель, как и в списке аргументов. – Elazar

+0

Правда. Но это не так. –

+0

И это не сработает, если вы прочтете больше инструкций, чем можете поместиться в массив 'code' (например, 500). Вам нужно протестировать измерение размера массива 'code'. –

0

Попробуйте функцию, возвращающую calloc -ed (см. calloc(3) man page) указатель 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 (возможно, миллионы на среднем ПК и более 500). Затем вы укажете

int main() { 
    instr* code = read_file("input.txt"); 
    print_program(code); 
    // at the very end of main 
    free(code); 
} 
+0

Привет, спасибо Базиле, хотя этот код выходит за рамки моих знаний и содержит команды, с которыми я незнаком, это по-прежнему очень полезно. Я буду использовать это как инструмент обучения. Очень ценится – slinhart

+0

@studmac: не стесняйтесь повышать (или принимать) мой ответ, если он подходит. –

+0

Хотел бы я! Но мне кажется, что мне разрешено принимать только один ответ, и я не могу выдвинуть его, пока у меня не будет 15pp. Как только я получу достаточно репутации, я вернусь и отступлю. – slinhart

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

Не будет работать (и может произойти сбой), если вы прочтете более 500 инструкций. –

+0

Спасибо! Вы укрепили концепции, о которых говорили предыдущие ответы. Очень признателен – slinhart