2015-05-07 397 views
0

意想不到的初始化我有頭文件爲:全局變量

test.h

//Mandatory fields size macro 
#define size_uid 65 
#define size_txn 33 
#define size_adhaarNo 13 
#define size_ver 4 
#define size_input 65 
#define size_photo 1024*1024*10 
#define size_pseudonym 50 
#define size_name 50 

//Mandatory fields declaration 
char uid[size_uid]; 
char txn[size_txn]; 
char adhaarNo[size_adhaarNo]; 
char ver [size_ver]; 
char *photo; 
char pseudonym[size_pseudonym]; 
char name[size_name]; 
char input[size_input]; 
void incorrect_val_test(FILE *, FILE *, FILE *, FILE *, FILE *, FILE *,FILE *,FILE *,FILE *,FILE*); 

test.c的

#include "test.h" 

//Mandatory fields declaration 
char uid[] = "865A80A01C70A9E0D5FC5F4D354A9155BF58CD483B1397C92614E5BC92317ACC"; 
char txn[] = "23da7b99-c561-4102-9df8-d37fbfe1"; 
char adhaarNo[] = "250241800087"; 
char ver [] = "1.0"; 
char *photo = (char *)malloc(sizeof(char)*size_photo); 
char pseudonym[] = "2b6c55566d14459991513fb00bce34ed"; 
char name[] = "Amarjeet Sharma"; 
char input[] = "936a185caaa266bb9cbe981e9e05cb78cd732b0b3280eb944412bb6f8f8f07af"; 

void incorrect_val_test(FILE *ver, FILE *ts, FILE *txn, FILE *vtxn, FILE *uid, FILE *input, FILE *adhaarNo, FILE *photo, FILE *name, FILE *pseudonym) 
{ 
     //Some initialization and files are opened here.... 

    photo = (char *)malloc(sizeof(char)*size_photo); 

    FILE *photos = fopen("./input/data.txt","r"); 

    if(photos == NULL) 
    { 
     printf("Can't open data file.\n"); 
     return; 
    } 

    i=0; 

    while((read_char = fgetc(photos))!= EOF) 
    { 
     if(read_char == '\n') 
     continue; 

     photo[i]= read_char; 
     i++;  
    } 


// Some more processing done here 
} 

的main.c

int main() 
{ 

     // Some files are opened here to read data. 
     incorrect_val_test(fp_ver, fp_ts, fp_txn, fp_vtxn, fp_uid, fp_input, fp_adhaarNo, fp_photo, fp_name, fp_pseudonym); 

     return 0; 
} 

當我編譯它提供了以下錯誤消息

錯誤信息

warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
photo = (char *)malloc(sizeof(char)*size_photo);
error: incompatible types when assigning to type ‘FILE {aka struct _IO_FILE}’ from type ‘char’
photo[i]= read_char;

有人能指出我在哪裏,我錯了?

+1

你爲什麼分配兩次'photo'?什麼是'read_char',它在哪裏聲明/定義?並且標準[不要在C中投入'malloc'的結果](http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc)。 –

+0

我的頭文件中沒有看到聲明!在源文件中定義變量並在頭文件中聲明它。 –

+0

您確定您使用的是C編譯器,而不是C++編譯器嗎? – alk

回答

3

你具備的功能

void incorrect_val_test(..., FILE *photo, ...) 

注意,你有一種說法認爲陰影全局變量。這是你的錯誤的原因。

4

你可以有一個函數調用像

char *photo = (char *)malloc(sizeof(char)*size_photo); 

一個功能內。這是不允許在全球範圍內。刪除全球一,留下incorrect_val_test()函數內的一個。

此外,請do not cast返回值malloc()和家庭在C

解決方案:

  1. 在全球範圍內定義char *photo = NULL;
  2. 當你這樣做,分配內存以photoincorrect_val_test()裏面,像

    char *photo = malloc(size_photo); //cast not required 
                // sizeof(char) is guranteed to be 1 
    

然後,在你的函數參數列表

void incorrect_val_test(..., FILE *photo, ...) 
FILE *photoincorrect_val_test()功能

這影響了全球char * photo

恕我直言,你想要的是寫

void incorrect_val_test(..., FILE *photos, ...) 
             ^
             | 

,並在函數體中,

photos = fopen("./input/data.txt","r"); 

但是,那麼,爲什麼要使用的變量名以單個字符的區別?使用更詳細和容易區分的內容。

注意:在完成使用photo後,請不要忘記爲free()分配內存以避免內存泄漏。

+0

但是,照片是在頭文件中聲明的,並在函數內的源文件中定義。那爲什麼是錯誤。 –

+0

@AbhijatyaSingh oops,錯過澄清。擺脫全局範圍內的'malloc()'。 :-) –

+0

@AbhijatyaSingh檢查更新的答案。 :-) –