我有一个示例教程,其中包含2个文件“ functions.c”和“ functions.h”,其中包含函数的原型和主体。
在该示例中,没有主要内容包含声明struct / pointer的数组到结构的数组以及对函数的调用。
functions.c:
@Configuration
functions.h:
#include "functions.h"
const char *getTeamA(const sTest *p)
{
return p->teamA;
}
void setTeamA(sTest *p, char *s)
{
strcpy(p->teamA, s);
}
int getNum(const sTest *p)
{
return p->num;
}
void setNum(sTest *p, int i)
{
p->num = i;
}
所以我的问题是
我如何根据上面编写的代码声明该结构?
例如:
#ifndef FUNCTIONS_H_
#define FUNCTIONS_H_
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_CHAR 20
#define SIZE 5
typedef struct {
char teamA[MAX_CHAR];
int num;
// ...
} sTest;
const char *getTeamA(const sTest *p);
void setTeamA(sTest *p, char *s);
int getNum(const sTest *p);
void setNum(sTest *p, int i);
#endif /* FUNCTIONS_H_ */
这是正确的方法吗?还是有更好的方法来声明变量并将其传递给函数?
重要的是我必须坚持在functions.c和functions.h中编写的代码,因此函数无法直接修改结构数据,需要使用指针(因为函数中有成员选择运算符“->” .c)。
答案 0 :(得分:2)
您不需要void read_file(char *contents[], int lines, char *filename){
int j = 0;
size_t len = 0;
FILE *file = fopen(filename, "r");
for(j = 0; j < lines; j++){
contents[j] = NULL;
len = 0;
getline(&contents[j], &len, file);
}
fclose(file);
}
。您可以通过执行dataPtr
来执行完全相同的操作,因为您将数据声明为data[i]
的数组,因此sTest
指向数组中的第一个元素。
让我们在调用data
时解构您正在做的事情。您试图将数据数组中的第一个sTest结构设置为具有“ name1”作为teamA字段。请注意,setTeamA(dataPtr[0].teamA, "name1")
的原型实际上包含了setTeamA()
。在您的示例中,您正在传递sTest *p
字段。因此,您真正想调用的是teamA
。这将转换为指向dataPtr [0]处数据的指针。
正如我之前说过的,尽管这行得通,但dataPtr是不必要的。因此,这等效于:
setTeamA(&dataPtr[0], "name1")
。
同样值得注意的是,您可以简单地写:
setTeamA(&data[0], "name1")
因为数据已经是指向数组中第一个元素的指针。
答案 1 :(得分:0)
使用 setTeamA(&data [0],“ name1”)
它索引到索引0,然后获取结果的引用(是一个指针),因此将类型设为sTest *,然后setTeamA函数将完成对teamA字段的设置。
那个dataPtr变量在这里没用。