2011-06-07 37 views
-1

功能工作正常的陣列,同時在我與調試運行,但功能後完成陣列檢查它是空的問題,從文件返回結構,以結構

這是結構:

typedef struct coordinates 
{ 
int x_l; 
int y_l; 
int x_r; 
int y_r; 
} Coordinates; 

typedef struct field 
{ 
int Id; 
Coordinates location; 
int area; 
int price; 
} Field; 

這是功能:

int ReadFromFile(Field *pArr) 
{ 
    int size; 
    int i; 


FILE *f = fopen("c:\\migrashim\\migrashim.txt", "r"); 

if (f == NULL) 
    { 
     printf("error open file"); 
     exit (1); 
    } 
fseek(f,0,SEEK_SET);  
fscanf(f, "%d\n", &size); 

pArr=(Field*)realloc(pArr,sizeof(Field)*(size)); 


for (i=0 ; i<size ; i++) 
{ 
    fscanf(f, "%d\n", &pArr[i].Id); 
    fscanf(f, "%d %d\n", &pArr[i].location.x_l,&pArr[i].location.y_l); 
    fscanf(f, "%d %d\n", &pArr[i].location.x_r,&pArr[i].location.y_r); 
} 

    return size; 
    } 

,這是從主呼叫:

{ 
    counter_2=ReadFromFile(pFieldArr); 
    printf("\nFile loaded successfully!"); 
     New_Field_flag=0;   
     Exit=0; 
     break; 
} 

tnx guys ...

回答

0

您正在向ReadFromFile傳遞一個指針並調整其大小。

這realloc的會盡量就地來調整,但如果不能,它會分配一個新的塊,複製現有的數據,然後釋放舊塊。

您的功能並沒有考慮到該塊可能已移動帳戶(你沒有返回其返回由realloc的指針)。

編輯:

代碼應該是這個樣子:

int ReadFromFile(Field **pArr) 
{ 
    int size; 
    int i; 

    FILE *f = fopen("c:\\migrashim\\migrashim.txt", "r"); 

    if (f == NULL) 
    { 
     printf("error open file"); 
     exit (1); 
    } 

    fscanf(f, "%d\n", &size); 

    *pArr = (Field*)realloc(*pArr, sizeof(Field)* size); 

    for (i = 0; i < size; i++) 
    { 
     fscanf(f, "%d\n", &(*pArr)[i].Id); 
     fscanf(f, "%d %d\n", &(*pArr)[i].location.x_l, &(*pArr)[i].location.y_l); 
     fscanf(f, "%d %d\n", &(*pArr)[i].location.x_r, &(*pArr)[i].location.y_r); 
    } 

    fclose(f); 

    return size; 
} 

然後:

{ 
    counter_2 = ReadFromFile(&pFieldArr); 
    printf("\nFile loaded successfully!"); 
    New_Field_flag = 0; 
    Exit = 0; 
    break; 
} 
+0

你能PLZ讓步的例子..? – talmordaniel 2011-06-07 18:23:54