2016-01-06 141 views
1

下面的代碼會拋出一個錯誤「未定義的引用'poredi'」。爲什麼我得到「未定義的引用」錯誤?

一切都在這個單一的c文件中定義(除了include中的c庫)。

'poredi'只是一個函數,我在typedef的下面定義了一個原型,然後我在文件中將它降低。

看一些類似的問題,我可以說它是在Windows 10上使用MinGW C編譯器通過CodeBlocks IDE進行編譯的,沒有任何其他參數用於編譯。

我是一個總C諾伯所以任何幫助表示讚賞。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

typedef struct { 
    char ime[20]; 
    char prezime[20]; 
    char registracija[10]; 
    int dRod; 
    int mRod; 
    int gRod; 
    char datumIzdavanja[10]; 
} vozac; 

void poredi(vozac *vozaci, int linije); 
int nlines(char *datoteka); 
void napuni(FILE *ulaz, vozac *vozaci, int lines); 

int main(){ 
    int lines = nlines("Registar.in"); 
    FILE *ulaz = fopen("Registar.in", "r"); 
    int i; 
    FILE *izlaz = fopen("Najmladji.out", "w"); 
    vozac *vozaci = calloc(lines,sizeof(vozac)); 
    napuni(ulaz,vozaci,lines); 
    fclose(ulaz); 
    poredi(vozaci,lines); 
    for (i = 0; i < 5; i++){ 
     printf("\n%s %s (%d.%d.%d)", vozaci[i].ime, vozaci[i].prezime, vozaci[i].dRod, vozaci[i].mRod, vozaci[i].gRod); 
    } 
    fclose(izlaz); 
    return 0; 
} 
int nlines(char *datoteka){ 
    FILE *ulaz = fopen("Registar.in", "r"); 
    int brojac = 0; 
    while (!feof(ulaz)){ 
     char ch = fgetc(ulaz); 
     if (ch == '\n') brojac++; 
    } 
    fclose(ulaz); 
    return brojac; 
} 
void napuni(FILE *ulaz, vozac *vozaci, int lines){ 
    int i; 
    char *linija = calloc(70, sizeof(char)); 
    char *token; 
    char *token2; 
    char *znak; 
    char *znak2; 
    for (i= 0; i < lines; i++){ 
     fgets(linija,70,ulaz); 
     token = strtok(linija," "); 
     strcpy(vozaci[i].prezime, token); 
     znak = strchr(vozaci[i].prezime,','); 
     *znak = 0; 
     token = strtok(NULL," "); 
     strcpy(vozaci[i].ime, token); 
     znak2 = strchr(vozaci[i].ime, ';'); 
     *znak2 = 0; 
     token = strtok(NULL, " "); 
     strcpy(vozaci[i].registracija, token); 
     token = strtok(NULL, " "); 
     token2 = strtok(token, "."); 
     vozaci[i].dRod = atoi(token2); 
     token2 = strtok(NULL, "."); 
     vozaci[i].mRod = atoi(token2); 
     token2 = strtok(NULL, "."); 
     vozaci[i].gRod = atoi(token2); 
     token = strtok(NULL, " "); 
     strcpy(vozaci[i].datumIzdavanja, token); 
    } 
void poredi(vozac *vozaci, int linije){ 
    int sortirano = 1; 
    vozac buffer; 
    while (sortirano){ 
     sortirano = 0; 
     for (i = 0; i < linije; i++){ 
      if (vozaci[i].gRod > vozaci[i+1].gRod){ 
       buffer = vozaci[i]; 
       vozaci[i] = vozaci[i+1]; 
       vozaci[i + 1] = buffer; 
       sortirano = 1; 
      } 
      else if (vozaci[i].gRod == vozaci[i + 1].gRod){ 
       if (vozaci[i].mRod > vozaci[i + 1].mRod){ 
        buffer = vozaci[i]; 
        vozaci[i] = vozaci[i+1]; 
        vozaci[i + 1] = buffer; 
        sortirano = 1; 
       } 
       else if (vozaci[i].mRod == vozaci[i + 1].mRod){ 
        if (vozaci[i].dRod > vozaci[i + 1].dRod){ 
         buffer = vozaci[i]; 
         vozaci[i] = vozaci[i+1]; 
         vozaci[i + 1] = buffer; 
         sortirano = 1; 
        } 
       } 
      } 
     } 
    } 
} 
} 
+3

'poredi'嵌套函數。移動到外面。 – BLUEPIXY

回答

4

您在napuni()中定義了poredi()。嵌套函數在ISO C中無效,但gcc允許它作爲extension。我懷疑你實際上是打算使用嵌套函數,但是放錯了大括號。基本上從您的源文件的末尾刪除一個支撐}添加它以上的定義poredi()

更好的縮進將有助於避免此類意外。

+2

最後一行說明了一切,我們可以在**大膽的**請你...... –

相關問題