2011-05-23 144 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所有。