2011-06-07 36 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