2012-04-12 53 views
0

當我試圖寫入我的子文件中的文件時,Im卡住了。fprintf()在一個子程序中

void new_page(float *a, float *b, float *c, int *d){ 
    fprintf(results,"\nPage Totals: %f\t%f\t%f\t%d", *a,*b,*c,*d); 
} 

我得到一個警告說

Warning: incompatible implicit declaration of built-in function 'fprinf' [enabled by default] 

"error: 'results' undeclared (first use in this function)"

在主fprintf中正常工作,它只是當它涉及到子程序/功能它不會工作。根據我的理解,它認爲結果是未聲明的,所以我必須傳遞文件的名稱或位置才能使其工作?

+0

關於警告..你的意思是'fprintf()'?和錯誤:「結果」在哪裏聲明?你能提供更多的代碼嗎? – Jack 2012-04-13 00:57:57

回答

1

除非results是全球性的,它是未定義的。

從它的外觀來看,你已經打開一個文件(流)爲results in main。如果是這樣,它只存在於main的範圍內。

將它傳遞給函數。不建議使其成爲全球。


它看起來像:

void new_page(FILE *results, float *a, float *b, float *c, int *d){ 
    fprintf(results,"\nPage Totals: %f\t%f\t%f\t%d", *a,*b,*c,*d); 
} 

也;如果你在一個單獨的文件中有這個功能,那麼main(),其中,正如你所說的fprintf的作品 - 你必須在該文件中包括stdio.h


編輯:聽起來你正在做的事情不對的函數簽名和原型等

舉一個簡單的例子(不上的fopen等需要的檢查):

#include <stdio.h> 

void foo(FILE * fp) 
{ 
    fprintf(fp, "HELLO\n"); 
} 

int main(void) 
{ 
    FILE *fp; 

    fp = fopen("blabla", "w"); 
    foo(fp); 
    fclose(fp); 

    return 0; 
} 

也;你說你的編譯器不抱怨。你在使用廣泛的警告嗎?如果不是,你應該。即GCC:

$ gcc -Wall -Wextra -pedantic -o my_prog my_source.c

我平時也添加-std=c89,或者如果需要的話,-std=c99

然後運行它機智的valgrind:

$ valgrind ./my_prog

這兩個步驟會給你很多提示和線索到這裏的東西可能是錯誤的。

+0

所以要傳遞它,我只是將一個指針傳遞給參數列表中的文件,它應該看到它被定義了嗎?哦,它不是全球性的,我不使用任何全局變量。 – sergio 2012-04-12 23:38:01

+0

是的,有點。當你像那樣傳遞它時,你會告訴函數; 「你好,這是一個地址,在那個地址你會發現一個FILE流」。 – Morpfh 2012-04-12 23:48:14

+0

該功能位於單獨的文件中。生病再試一次,看看交易是什麼:D – sergio 2012-04-12 23:50:20

0

這裏有一個以上的解決方案。

  1. 您可以將文件處理程序傳遞給函數。
  2. 您可以使用printf寫入文件。但如果你這樣做,你不能再次寫入屏幕。搜索freopen
1

爲了解決fprintf警告,你需要添加

#include <stdio.h> 

靠近你的源文件的頂部。

results錯誤是不同的;您可以將其設置爲全局,也可以將其作爲參數傳遞給您的new_page函數。

製作一個變量全局(即定義任何函數外,包括main)是款式一般較差,但如果resultsFILE*,你將要使用整個程序,這是沒有道理的,使其全球。

+0

至於全局變量我不允許使用任何程序。就像你說的那樣,風格很差,我的老師說使用全局變量是不被接受的。 – sergio 2012-04-13 00:31:15

+0

@sergio:然後你需要將它作爲參數傳遞。 – 2012-04-13 01:00:40