2011-05-23 89 views
1

在這裏,我有一個結構定義訪問結構數組:通過指針

typedef struct person { 
unsigned int ssn, age, height, weight, income; 
char name[MAXS+1], job[MAXS+1], religion[MAXS+1], major[MAXS+1], minor[MAXS+1], gender; 
}PERSON; 

在這裏,我有一個在功能陣列型的人定義的結構:

PERSON record[MAXR+1]; 

將如何我將這個數組傳遞給另一個實時更新的函數(即作爲一個指針)?

我的直覺和先驗知識告訴我做到以下幾點:

PERSON *rp[MAXR+1]; 
for(i=0; i<MAXR; i++){ 
     *rp[i]=&record[i]; 
    } 
valid=readfile(fp, rp); 

然而,我「在分配不兼容類型」的錯誤提示的。 這樣做的正確方法是什麼?

下面是完整的代碼:

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <string.h> 
#define MAXS 19 
#define MAXR 999 

typedef struct person { 
unsigned int ssn, age, height, weight, income; 
char name[MAXS+1], job[MAXS+1], religion[MAXS+1], major[MAXS+1], minor[MAXS+1], gender; 
}PERSON; 


//get and check ssn 
int getssn(){ 
int num; 

printf("\nSSN: "); 
scanf("%d", &num); 

if(num<=99999999 || num>999999999){ 
    printf("\nPlease input a valid SSN.\n"); 
    return 0; 
} 
else 
    return num; 
} 

int readfile(FILE *fptr, PERSON **rptr){ 
int v=0, i, j; 

for(i=0; i<MAXR; i++){ 
    j=i; 
    if(fscanf(fptr, "%c\n%d\n%19s\n%d\n%19s\n%d\n%19s\n%19s\n%d\n%d\n%19s\n\n", 
      &rptr[j]->gender, &rptr[j]->ssn, rptr[j]->name, &rptr[j]->age, 
      rptr[j]->job, &rptr[j]->income, rptr[j]->major, rptr[j]->minor, 
      &rptr[j]->height, &rptr[j]->weight, rptr[j]->religion)==EOF) 
     i=MAXR; 
    if(&rptr[MAXR]->ssn==&rptr[j]->ssn) 
     v=j; 
} 


return v; 
} 

int main(){ 
int valid=0, i; 
char filename[MAXS]="clients.txt"; 
FILE *fp; 
PERSON record[MAXR+1], *rp[MAXR+1]; 

do{ 
    record[MAXR].ssn=getssn(); 
}while(record[MAXR].ssn==0); 

printf("Name of file of records: "); 
//gets(filename); 

if((fp=fopen(filename, "r"))==NULL) 
    printf("\nCould not open file\n"); 
else{ 
    printf("\njur doing gohd\n"); 
    for(i=0; i<MAXR; i++){ 
     *rp[i]=&record[i]; 
    } 
    valid=readfile(fp, rp); 
    if(valid==0){ 
     printf("\nSSN %d is not found in file %s.\n", record[MAXR].ssn, filename); 
    } 
    else { 
     printf("%d", valid); 
    } 
} 



return 0; 
} 

回答

2

您正在嘗試人物變量的地址分配給實際的人變量(沒有解決),你可能是指做:

rp[i]=&record[i]; 

請注意,它會將指針複製到結構中,而不是結構本身。如果要複製的結構,你需要使用memcpymemmove

+0

謝謝,這個工作,現在在我腦海中是有道理的。 – Kabir 2011-05-23 13:57:38

+0

很高興聽到:) – MByD 2011-05-23 14:03:35

0

你只需要:

int readfile(FILE *fptr, PERSON *rptr); 

陣列 - 定義明智的 - 僅僅是一個級別的指針已定義的結構。

int readfile(FILE *fptr, PERSON *rptr){ 
int v=0, i, j; 

for(i=0; i<MAXR; i++){ 
    j=i; 
    if(fscanf(fptr, "%c\n%d\n%19s\n%d\n%19s\n%d\n%19s\n%19s\n%d\n%d\n%19s\n\n", 
      rptr[j]->gender, rptr[j]->ssn, rptr[j]->name, rptr[j]->age, 
      rptr[j]->job, rptr[j]->income, rptr[j]->major, rptr[j]->minor, 
      rptr[j]->height, rptr[j]->weight, rptr[j]->religion)==EOF) 
     i=MAXR; 
    if(rptr[MAXR]->ssn==rptr[j]->ssn) 
     v=j; 
} 

沒有必要使用指針指針,因爲您在函數之外聲明瞭數組。如果你做malloc來分配內存中的內存,那麼你需要一個指針指針來返回內存分配的指針 - 不是你的情況。

0

也值得指出fptr [i] - > job中隱含的圓括號。 它是(* fptr)[i],而不是* fptr [i]或*(fptr [i])。也就是說,您要在跟隨指針之後索引 ,而不是之前。

0

數組不能直接傳遞給函數 - 如果你嘗試,它只是傳遞一個指向數組第一個元素的指針(它可以像數組本身一樣被索引來訪問數組的任何成員)。這就是爲什麼你可能會聽說數組是「通過引用傳遞」 - 雖然不是在技術上爲真,那就是效果。

所以,你需要做的就是聲明你的功能是這樣的:

int readfile(FILE *fptr, PERSON rptr[]) 
{ 
    int v = 0, i; 

    for(i = 0; i < MAXR; i++) { 
     if (fscanf(fptr, "%c\n%d\n%19s\n%d\n%19s\n%d\n%19s\n%19s\n%d\n%d\n%19s\n\n", 
      &rptr[i]->gender, &rptr[i]->ssn, rptr[i]->name, &rptr[i]->age, 
      rptr[i]->job, &rptr[i]->income, rptr[i]->major, rptr[i]->minor, 
      &rptr[i]->height, &rptr[i]->weight, rptr[i]->religion) < 11) 
      break; 

     if (rptr[MAXR]->ssn == rptr[i]->ssn) 
      v = i + 1; 
    } 

    return v; 
} 

...你可以直接調用它像這樣:

valid = readfile(fp, record); 

有沒有在需要rp所有。