2011-10-30 48 views
0

我有一個C程序,我正在從一個文件中讀取數據,然後嘗試打印它以便在此刻進行測試。我遇到的問題是,我的常量在MAX = 40,並且它的打印次數。我試過在函數中傳遞jobcount的引用,但是當我在int之後添加*時,在jobcount傳遞之前添加&時出現錯誤。我感謝他們的幫助,對所有問題始終保持高質量的投入!在C中傳遞變量

#include <stdio.h> 

struct record{ 
    char name[1]; 
    int arrival_time; 
    int job_length; 
    int job_priority; 
}; 

const int MAX = 40; 

void fileinput(struct record jobs[MAX], int jobcount); 
void output(struct record jobs[MAX], int jobcount); 
int main(void) 
{ 
    struct record jobs[MAX]; 
    int jobcount; 
    fileinput(jobs,jobcount); 
    output(jobs,jobcount); 
    return(0); 
} 

void fileinput(struct record jobs[MAX], int jobcount){ 
    jobcount = 0; 
    FILE *f = fopen("data.dat","r"); 
    while(fscanf(f, "%s %d %d %d", jobs[jobcount].name, &jobs[jobcount].arrival_time, &jobs[jobcount].job_length, &jobs[jobcount].job_priority) != EOF) 
    { 
     jobcount++; 
     printf("READ IN TEST \n"); 
    } 
} 

void output(struct record jobs[MAX], int jobcount){ 

    int j = 0; 
    for(j = 0;j < jobcount; j++) 
    { 
     printf("%s %d %d %d\n", jobs[j].name, jobs[j].arrival_time, jobs[j].job_length, jobs[j].job_priority); 
     printf("FOR LOOP TEST \n"); 
    } 
} 

data.dat文件看起來像這樣

A1 3 3 3 
B1 4 4 4 
C1 5 5 5 

回答

1

你不應該得到一個錯誤。大概你可能已經改變了前進宣言,忘了改變定義。

void fileinput(struct record jobs[MAX], int* jobcount); 

fileinput(jobs,&jobcount); 

和定義 -

void fileinput(struct record jobs[MAX], int* jobcount) { 
    // .... 
} 

由於jobcount是一個指針,你需要提領先修改/訪問它正指向值。您需要發佈確切的錯誤消息,以獲得進一步的幫助。

+0

這是我得到的錯誤。 gcc projectv2.c -o project projectv2.c:在函數'fileinput'中: projectv2.c:26:38:error:數組下標不是整數 projectv2.c:26:60:error:數組下標不是整數 projectv2.c:26:90:錯誤:數組下標不是整數 projectv2.c:26:118:錯誤:數組下標不是整數 – Intelwalk

+0

@Intelwalk - 正如我之前提到的,您需要解除引用指針。數組索引必須是一個整數,但是您提供的是一個指針。所以,你需要在訪問''(* jobcount)'之前取消引用'jobcount',而不管你使用什麼。 – Mahesh

+0

我現在得到了分段錯誤。這裏是我的代碼:#include struct record { char name [1]; int arrival_time; int job_length; int job_priority; }; const int MAX = 40; void fileinput(struct record jobs [MAX],int * jobcount); void output(結構記錄作業[MAX],int jobcount); int main(void) { struct record jobs [MAX]; int jobcount; fileinput(jobs,&jobcount); 輸出(jobs,jobcount); return(0); } – Intelwalk

1

你可能會做最好的修訂fileinput()返回作業計數:

int fileinput(struct record jobs[MAX]) 
{ 
    int jobcount = 0; 
    ... 
    return jobcount; 
} 

,然後在main()

int main(void) 
{ 
    struct record jobs[MAX]; 
    int jobcount = fileinput(jobs); 
    ... 
    return 0; 
} 

主要的選擇是一個指針傳遞給jobcountfileinput()功能。如果你還返回了一個狀態(所有OK,數據中的條目太多,僞造的數據等),這可能會更好。你的函數仍然會返回一個值,但這將是錯誤指示,並且作業計數將通過指針返回。

第三個(可怕的和不推薦的)替代方案是使用全局變量(或文件靜態變量)作爲jobcount

對於通用輸入功能,你應該明確地傳遞數組的大小,而不是假設它是MAX:

int fileinput(struct record jobs[], size_t maxjobs); 

int jobcount = fileinput(jobs, MAX); 

你會寫代碼,以確保您不會超過規定的數量的工作記錄。

1

如果需要,您可以使用「return」從fileinput()獲取「jobcount」。你只需要「&」,傳遞一個指向「jobcount」的指針:

... 
const int MAX = 40; 

void fileinput(struct record jobs[MAX], int * jobcount); 
... 
int main(void) 
{ 
    struct record jobs[MAX]; 
    int jobcount=-1; 
    fileinput(jobs,&jobcount); 
    output(jobs,jobcount); 
    return(0); 
} 

void fileinput(struct record jobs[MAX], int * jobcount){ 
    *jobcount = 0; 
    FILE *f = fopen("data.dat","r"); 
    while(
    (fscanf(f, "%s %d %d %d", jobs[jobcount].name, &jobs[jobcount].arrival_time, 
     &jobs[jobcount].job_length, &jobs[jobcount].job_priority) != EOF) && 
    (*jobcount < MAX)) 
    { 
     *jobcount++; 
     printf("READ IN TEST \n"); 
    } 
    ...