![](/img/trans.png)
[英]passing an argument ( a struct in an array of structs within a struct) to a function in C
[英]C: Pointer to an array of structs inside a struct within a function
我對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:指針的指針數組結構(分配/釋放的問題) , C指針,指向結構的數組 , 如何聲明指針在C結構的數組 , 指向在功能結構的陣列 。 我的項目越來越大,我只是不想通過嘗試使其變得更好而變得更糟。
我是否需要創建一個指向s2.s1 [x]的指針數組?
我是否需要告訴一個指針(結構S2 * s2 = s1-> s2)s2有多少元素?
有陷阱嗎?
它沒有錯,這取決於它是否符合您的要求,並且從長遠來看,它是一個不錯的設計選擇。
另外,您可能可以
s1.s2 = malloc(sizeof *s1.s2);
if (s1.s2 == NULL)
error_handler(); // do not use s1.s2 after this
dosomething(&s1);
將一個結構,指針或數組放置在另一個結構內被稱為composition 。 如果S2
數組屬於該數組,則應將其放置在S1
結構中。
例如,一個Point
是一對(x, y)
坐標,因此很明顯它應該由兩個int
組成,即:
void do_stuff(struct Point pt);
優於:
void do_stuff(int x, int y);
但是絕對不要僅僅因為您想保留一些輸入而這樣做。 如果S2
裝入S1
內,則執行此操作。 如果程序中沒有“沒有S2
S1
”,那就有意義。
因此,如果這兩個結構不屬於一起,但是您發現自己將相同的參數序列傳遞給多個函數,則可以使用一種稱為“引入參數對象”的OOP重構技術。 即而不是這樣做:
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.