2012-01-12 46 views
3

我想傳遞參數即刻功能,無需像這樣產生額外的變量:傳球達陣參數的功能

void DrawSprite(float a[2], float b[2]) { /* */ } 

DrawSprite((0.0f, 0.0f), (50.0f, 50.0f)); 

是否有可能,如果是,該怎麼辦呢?

+1

你不會傳遞一個數組到一個函數,你只需要在函數中傳遞一個指向數組的指針。所以說你的問題沒有任何意義。 – 2012-01-12 16:35:42

+0

@Als不,數組不是指針。一個數組是一個數組。這並不是說傳遞基本數組意味着複製數組。 – wilhelmtell 2012-01-12 16:42:58

+1

你可能想考慮爲你的觀點添加一個類(用C++ 0x更容易通過引用/ rvalues傳遞)或者看看初始化列表http://stackoverflow.com/questions/5733828/initializing-from-an- initializer-list-but-without(看到第一篇文章,不是很漂亮,但很接近) – ted 2012-01-12 17:30:19

回答

1

對這個重要問題的一些答案似乎是誤導。問題是:將一個固定大小的數組傳遞給一個函數。首先像

float x[2] = {0.1F, 0.2F}; 
    float y[2]; 
    y=x; 

error: invalid array assignment(海合會4.6.1,但我們應該對「標準」將在這裏講,沒有特定的編譯器功能)。非常正確 - 操作應該完成什麼? xy都指向堆棧中的一塊內存,因此將float*x複製到y將毫無意義,因爲這些值不會被複制到最初保留的位置,即y[0],y[1]

float x[2]唯一合理的演員陣容是float *y。這正是調用函數時發生的情況。您的功能DrawSprite(float a[2], float b[2])實際上被視爲DrawSprite(float* a, float* b)(您可能會打印出typeid(a).name()進行檢查)。因此,您可以通過xDrawSprite,並且此x將簡單地轉換爲float*

第二個問題是初始化。代碼(float[2]){1.0, 2.0}確實構建了一個固定大小的臨時數組float(同樣可以通過typeid((float[2]){1.0, 2.0}).name()進行檢查,至少在gcc上),但是對於該數組沒有太大的限制,因爲float [2]的分配被禁止。您可以將它轉換爲float*(例如,由z=(float[2]){1.0,2.0};指定,但是指定爲0​​,因此它實際上是z=(float*)(float[2]){1.0,2.0};),或者您可以將它傳遞給您的函數,該函數也執行相同操作,即轉換爲float*

3

是的,你可以做到這一點。

試試這個:

void DrawSprite(float a[2], float b[2]) { /* */ } 

DrawSprite((float[2]){1.0, 2.0}, (float[2]){3.0, 4.0}); 

包括在第二行數組大小是好事,因爲它可以讓編譯器執行數組的大小,但你不必。

如果語法是惱人的你輸入,你可以使用一個預處理宏:

#define P(X,Y) (float[]){X, Y} 
DrawSprite(P(1.0,2.0), P(3.0,4.0)); 

或者是內聯函數。

+0

有了這樣的東西,它會拋出很多語法錯誤,當我更改'{'到'('它說「無法從'float'轉換爲'float [2]'」 – Neomex 2012-01-12 16:49:45

+0

我發佈的第一個代碼塊編譯得很好對於MinGW的g ++來說,如果你找不到你添加的語法錯誤,請問另一個問題併發布代碼 – 2012-01-13 04:37:20

+0

正如已經有人在這裏寫的,這是因爲我使用MVC++,它不支持它。 ++ 0x調用?) – Neomex 2012-01-14 00:44:25

3

你可以這樣調用:

float x[2] = {0.0F, 0.0F}; 
float y[2] = {50.0F, 50.0F}; 
DrawSprite(x, y); 
2
DrawSprite((float[2]){1.0, 2.0}, (float[2]){3.0, 4.0}); 

這工作與海灣合作委員會,但在MSVC不起作用。我相信這不是標準的C++

1

更好聲明它作爲被使用malloc聲明浮動的陣列。它可以讓你在工作完成後根據自己的意願釋放數組。由於在malloc中內存將被分配在堆中。傳遞數組可能會導致模糊的階段,並導致代碼崩潰