我是C的新手。我创建了一个结构和一组结构来存储数据并将它们传递给我的函数:
int dosomething(struct s1 *struct1, struct s2 *struct2);
struct S1 {
int a;
int b;
int c;
};
struct S2 {
double x;
double y;
double z;
};
int main()
{
int n = 200;
struct S1 s1;
struct S2 *s2 = malloc(n * sizeof(struct S2));
dosomething(&s1, &s2[0])
return 0;
}
int dosomething(struct S1 *s1, struct S2 *s2)
{
s1->a = 1;
s1->b = 2;
s1->c = 3;
s2[0].x = 1.1;
s2[1].x = 1.123233;
...
return 1;
}
随着时间的推移,这变得很烦人,所以我决定把它们放在一起。
现在我正在做这个
struct S1 {
int a;
int b;
int c;
struct S2 *s2;
};
struct S2 {
double x;
double y;
double z;
};
int main()
{
int n = 200;
struct S1 s1;
struct S2 *s2 = malloc(n * sizeof(struct S2));
s1.s2 = s2;
dosomething(&s1)
return 0;
}
int dosomething(struct S1 *s1)
{
s1->a = 1;
s1->b = 2;
s1->c = 3;
s1->s2[0].x = 1.1;
s1->s2[1].x = 1.123233;
...
// OR
struct S2 *s2 = s1->s2;
s2[0].x = 1.1;
s2[1].x = 1.123233;
...
}
现在,问题是: 我读了很多关于结构,数组,结构数组等的指针,但我仍然不确定,如果我在这里做的是正确的。 C: pointer to array of pointers to structures (allocation/deallocation issues), c pointer to array of structs, How to declare pointer to array of structs in C, Pointer to array of struct in function。 我的项目正在发展到一个规模,我只是想通过努力让它变得更好而让它变得更糟。
我是否需要创建一个指向s2.s1 [x]?
的指针数组我是否需要告诉一个指针(结构S2 * s2 = s1-> s2)s2有多少元素?
是否有任何陷阱或可能出现问题?
答案 0 :(得分:0)
它没有任何问题,它是否符合您的要求,从长远来看,它是一个很好的设计选择。
另外,你可以做到
s1.s2 = malloc(sizeof *s1.s2);
if (s1.s2 == NULL)
error_handler(); // do not use s1.s2 after this
dosomething(&s1);
答案 1 :(得分:0)
将结构,指针或数组放在另一个结构中称为 composition 。您应该将S2
数组置于S1
结构(如果它属于)中。
例如,Point
是一对(x, y)
坐标,因此很明显它应该由两个int
组成,即:
void do_stuff(struct Point pt);
优于:
void do_stuff(int x, int y);
但绝不要因为你想节省一些打字而这样做。如果S2
适合S1
,请执行此操作。如果"没有S1
没有S2
"在你的程序中,它是有道理的。
因此,如果这两个结构不属于一起,但是您发现自己将相同的参数序列传递给多个函数,那么您可以使用名为{{的OOP重构技术的变体3}}。即而不是这样做:
do_stuff(&s1, &s2, &s3);
您可以创建一个新结构,其中没有其他目的,只能由这些参数组成:
struct StuffParameters {
struct S1 * s1;
struct S2 * s2;
struct S3 * s3;
};
然后你可以将它传递给多个"类似的"功能:
struct StuffParameters parameters = { &s1, &s2, &s3 };
do_stuff(¶meters);
do_some_other_stuff(¶meters);
yet_another_function(¶meters);