这里我有一个结构定义:
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定义类型结构的函数数组:
PERSON record[MAXR+1];
如何将此数组传递给另一个用于实时更新的函数(即作为指针)?
我的直觉和先前知识告诉我要做以下事情:
PERSON *rp[MAXR+1];
for(i=0; i<MAXR; i++){
*rp[i]=&record[i];
}
valid=readfile(fp, rp);
然而,我在作业中得到了一个&#34;不兼容的类型&#34;错误。 这样做的正确方法是什么?
以下是完整代码:
#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;
}
答案 0 :(得分:2)
您正在尝试将PERSON变量的地址分配给实际的PERSON变量(而不是地址),您可能想要这样做:
rp[i]=&record[i];
请注意,它会将指针复制到struct,而不是struct本身。如果要复制结构,则需要使用memcpy
或memmove
答案 1 :(得分: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
在函数内部分配内存,那么你需要一个指向指针的指针来返回分配内存的指针 - 不过你的情况。
答案 2 :(得分:0)
还值得指出fptr [i] - &gt; job中隐含的括号。 它是(* fptr)[i],而不是* fptr [i]或*(fptr [i])。也就是说,你想索引 在你按照指针之后,而不是之前。
答案 3 :(得分: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
。