2010-06-10 36 views
3

我试图将一些代码从Javascript转换为c。该函数创建一个数组(总是有固定数量的项目),然后返回该数组。我已经知道在c中返回一个数组并不简单,所以我想把它作为一个结构体返回。我的c并不是那么棒,所以我想检查一下,在这种情况下返回一个struct是正确的,而且我正确地做到了这一点。谢谢。在c中定义并返回一个struct

typedef struct { 
    double x; 
    double y; 
    double z; 
} Xyz; 

Xyz xyzPlusOne(Xyz addOne) { 

    Xyz xyz; 
    xyz.x = addOne.x + 1; 
    xyz.y = addOne.y + 1; 
    xyz.z = addOne.z + 1; 

    return xyz; 
} 

回答

8

这是非常好的,正确的C,但传球按价值结构可能不适合更大的结构或者如果你打算更改来电者的结构:

Xyz s; 
s = XyzPlusOne(s); 

在这种情况下,你会过得更好传递结构的指针,只是简单地说:

Xyz s; 
XyzPlusOne(& s); 

在另一方面,如果你想要这样的:

Xyz s1, s2; 
..., 
s2 = XyzPlusOne(s1); 

然后返回一个值是有道理的。

2

这看起来像它可以与现代编译器一起工作,但它是一种非C类方法。在C中,你将更有可能通过引用来传递结构,并且不返回任何内容。

+0

谢谢,我没有意识到这一点。 – 2010-06-11 09:41:55

3

这应该做工精细,但如果你想保持原来的结构完好,你可能想拥有它的一个const指针传递到结构,以避免它的另一个副本:

Xyz xyzPlusOne(const Xyz* addOne) { 

    Xyz xyz; 
    xyz.x = addOne->x + 1; 
    xyz.y = addOne->y + 1; 
    xyz.z = addOne->z + 1; 

    return xyz; 
} 

或者你可以定期指针传递到结构,改变它的功能,并没有返回值(如果不需要保留原有结构不变):

void xyzPlusOne(Xyz* addOne) { 
    addOne->x++; 
    addOne->y++; 
    addOne->z++; 
} 
+0

你搞砸了_ _(见我的编辑) – Artelius 2010-06-10 12:46:08

+0

@Artelius - Doh,我想我现在就明白了。过了一段时间,因为我已经做了任何C编程:) – 2010-06-10 12:47:38

+0

更改“。”到“ - >”,因为你通过一个指针引用。 – TMN 2010-06-10 12:50:35

2

下面是另一种方法,仅仅修改原始阵列:

void xyzPlusOne(Xyz *addOne) 
{ 
    if (addOne != NULL) 
    { 
     addOne->x++; 
     addOne->y++; 
     addOne->z++; 
    } 
} 

呼叫为:xyzPlusOne(&阵列);