2010-08-28 144 views
6

我有一個C(不是C++)該結構是這樣的C結構數組

typedef struct mystruct{ 
float a,b; 
int x, y; 
} mystruct; 

然後在功能我收集的數據是這樣的:

mystruct List[MAX]; 
ListNumber = 0; 

for(i = 0; i < MAX; i++) 
{ 
if(conditions_meet) 
{ 
    List[ListNumber].a = masterlist[i].a; 

...等

ListNumber++; 
} 
} 

然後我發送數組到一個函數

DoStuff(static int max, mystruct array[max]){ 
    Stuff 
} 

這個工作,但是當我嘗試做這樣....

mystruct setter(int i) 
{ 
mystruct TEMP; 
TEMP.a = masterlist[i].a; 
//......etc 
return TEMP; 
} 


mystruct List[MAX]; 
ListNumber = 0; 

for(i = 0; i < MAX; i++) 
{ 
if(conditions_meet) 
{ 
    List[ListNumber] = setter(i); 
    ListNumber++; 
} 
} 

它會產生很多時髦的錯誤。這是爲什麼發生? 編輯: @ tommieb75我不能給出太多的細節,結果似乎沒有一個模式。該列表被用作將東西繪製到屏幕的一般方式,並且具有該功能而不是直接設置會在渲染和隨機方面造成奇怪的問題,但根本不會產生編譯器錯誤。 gdb顯示一些整數大於一個整數,這是我發現的唯一模式。 masterlist是另一個結構的全局數組。在這個例子中,數據需要轉換爲結構。 根本沒有編譯器警告或錯誤。也許我可以接受更敏感的警告,但是我總能得到任何我能想到的一般性錯誤的報告。 我將嘗試所選的解決方案,這應該就足夠了。無論如何,類似的函數返回結構在我的代碼中使用,除了這種情況下,使用結構數組完成所有工作。

+1

你可以張貼一些你所得到的錯誤? – GameFreak 2010-08-28 21:54:41

+0

有人刷新我的記憶:你可以通過C中的值返回結構嗎? – 2010-08-28 21:56:29

+2

爲什麼不呢?指針應該更快,但是你可以通過值返回。順便說一句。 www.ideone.com,你可以檢查;-) – nilphilus 2010-08-28 21:59:24

回答

1

對於一個簡單的設置,你需要從整個結構元素的副本結構成員?

mystruct List[MAX]; 
ListNumber = 0; 

for(i = 0; i < MAX; i++) 
{ 
if(conditions_meet) 
{ 
    List[ListNumber].a = masterlist[i].a; 
    ListNumber++; 
} 
} 

如果你真的需要一個功能,使用的目標存儲器像參數:

void setter(mystruct *dest,const mystruct *src) 
{ 
    dest->a = src->a; 
} 
for(i = 0; i < MAX; i++) 
{ 
if(conditions_meet) 
{ 
    setter(&List[ListNumber], &masterlist[i]); 
    ListNumber++; 
} 
} 
+0

是的,函數是清理函數,它是一個巨大的眼睛很難快速閱讀和改變。然而,這似乎是一個有趣的解決方案,我將對其進行測試。 – Balkania 2010-08-29 23:06:40

1

是什麼

mystruct setter(i) 
{ 
mystruct TEMP; 
TEMP.a = masterlist[i].a; 

'我' 有什麼類型?

//如果你在結構未初始化成員的錯誤,可以幫助 http://ideone.com/WRLVG

+1

它隱含地int。 – Potatoswatter 2010-08-28 22:20:28

+0

@Patatoswatter參數呢?我記得關於返回值,但不記錄(無論如何,你是對的) – nilphilus 2010-08-28 22:34:59

0

第一個問題是你的二傳手的定義是不是一個合法的函數簽名。參數i必須給予類型

mystruct setter(int i) { 
    ... 
} 

它還使用未在函數定義的變量masterlist。這可能在其他地方被合法地聲明爲靜態。如果沒有,但需要以某種方式訪問​​該功能

+0

Masterlist是一個全球性的。我不知道C中的正確名稱,但是......無論如何,我輸入的代碼大部分都是在飛行中完成的,否則它將會太大。 – Balkania 2010-08-28 23:02:07

+0

另外,這並不是實際代碼的複製粘貼,我只是舉了一個例子,以消除所有周圍的噪音......當然,真實的東西是正確的,否則我的編譯器會抱怨; P – Balkania 2010-08-28 23:09:54

+0

@Blakania:You '不會得到任何有用的答案,因爲你的構成例子似乎已經排除了實際問題。 – caf 2010-08-29 11:51:27

0

問題是,在setter函數中,您有一個堆棧分配變量TEMP,一旦函數返回就會超出範圍......您可能會更好指針分配給my_struct在堆上,並返回它的地址返回到調用的程序。...

編輯:

​​3210

也就是說,什麼是需要得到值回來了一旦例行程序結束的範圍。這就是所謂的返回按引用

+0

它被返回值。 – Potatoswatter 2010-08-28 22:21:28

+0

通過引用返回值和引用返回值之間的區別...這就是我上面所說的,通過將地址返回到通過引用返回的堆上分配的指針。 – t0mm13b 2010-08-28 22:58:29

+0

如果通過引用返回,則會出現問題,但幸運的是,C沒有該功能。如果按價值回報不起作用,他們可能不會允許它進行編譯。 – Potatoswatter 2010-08-28 23:28:38