這裏是一個例子。許多變化是可能的,根據自己的喜好或需求:
struct MyStruct
{
enum MyNum { Integer, Float, String } WhatTypeIsHere;
size_t HowMany;
union
{
int Integer;
float Float;
const char *String;
} u[MaximumNumberOfElement];
};
要設置,給予一定的x
這是一個struct MyStruct
:
x.WhatTypeIsHere = Float;
x.HowMany = NumberOfObjectsThisTime;
for (i = 0; i < NumberOfObjectsThisTime; ++i)
x.u[i].Float = some value;
設置爲Integer
或其他類型的相似。
閱讀:
switch (x.WhatTypeIsHere)
{
case Float;
for (i = 0; i < x.HowMany; ++i)
Use x.u[i].Float for something…;
break;
case Integer:
…
}
你的函數可以聲明爲使主叫方傳遞一個struct MyStruct
它,和函數填充它,或函數定義了一個本地struct MyStruct
和值返回。 (通常,當你執行後者時,C的底層實現會發生什麼:調用者爲struct MyStruct
分配空間並將其地址傳遞給調用函數,該函數負責填充它。如果編譯器正確優化,則性能等同於第一個選項,即使源代碼看起來像被調用的函數正在返回一個按值的結構。)
關於如何組織結構和聯合有多種選項。您可以使用數組聯合而不是聯合數組,並且您可以傳遞有關單獨返回的類型的信息,而不是在結構中的enum
,並且可以單獨返回或通過其他一些元素信息,例如數組內的標記值。對於小而簡單的用途,這些變化可能沒有太大的區別,他們可以自己選擇。
有多種方法可以解決這個問題。然而,更大的問題是關於要返回的對象的數量。如果它足夠小以至於可以始終使用最大數量的空間,那麼使用一個數組(聯合,使用另一個對象來指示類型,可能將它們打包在一個結構中)是合適的。如果它很大且不同,那麼動態分配空間可能會更好,然後存在調用者或被調用函數是否應提供空間以及哪個函數負責釋放空間的問題。 –
@EricPostpischil這是針對嵌入式環境的,因此動態分配並不是一個真正的選擇 - 在編譯時應該知道內存分配。擁有固定大小的數組並不是一個問題,儘管大多數SCPI命令會返回有限數量的結果或者一個或兩個複合結果,因此可以使用最大數量的空間。感謝您的意見。 – Toby