2010-06-10 45 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(&陣列);