2015-05-07 4 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

Почему вы дважды выделяете 'фото'? Что такое 'read_char' и где оно объявлено/определено? И стандарт [не выдавать результат 'malloc' в C] (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); 

внутри функции. Это недопустимо в global scope. Удалите глобальный один, оставьте тот, который присутствует внутри функции incorrect_val_test().

Кроме того, пожалуйста, do not cast возвращаемое значение malloc() и семья в C.

Решение:

  1. определяют char *photo = NULL; в глобальном масштабе.
  2. Как вы уже сделали, выделить память для photo внутри вашего incorrect_val_test(), как

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

Тогда вы получили FILE *photo в вашей incorrect_val_test() функции в списке параметров функции

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

, который теней глобального char * photo.

ИМХО, что вы хотите, чтобы написать

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

и внутри тела функции,

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

но, то, почему использовать имена переменных с разницей в одного символа? Используйте что-то более подробное и легко различимое.

Примечание: После того как вы сделали с помощью photo, не забудьте free() выделенной памяти, чтобы избежать памяти утечек.

+0

Но фото объявляется в файле заголовка и определяется в исходном файле внутри функции. Тогда почему ошибка. –

+0

@AbhijatyaSingh упс, пропустил, чтобы уточнить. Избавьтесь от 'malloc()' в глобальной области. :-) –

+0

@AbhijatyaSingh проверяет обновленный ответ. :-) –

Смежные вопросы