2015-05-07 263 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检查更新的答案。 :-) –