![](/img/trans.png)
[英]With SWIG, how do you wrap C++ void func(Class& out) as C# Class func()?
[英]Is there a way to implement “void func(out params object[] parameters)” in C#
我想做的是能夠將任意數量的變量傳遞到函數中,在函數內部操縱這些變量,並能夠訪問函數范圍之外的那些操縱。
例
void FunctionA()
{
int x = 1;
string s = "blah";
int y = 4;
FunctionB(out x, out s, out y);
Console.WriteLine("{0}, {1}, {2}", x, s, y);
}
void FunctionB(out params object[] parameters)
{
for(int ii = 0; ii < parameters.Length; ii++)
{
if(parameters[ii] is int) parameters[ii] = (int)parameters[ii] + 1;
}
}
調用FunctionA()之后,控制台上應顯示“ 2,blah,5”。 有沒有一種方法可以做到這一點,只需返回一個object []並解析出我想要的變量?
為了澄清起見,這是我正在嘗試做的事情。 將byte []與一系列變量一起傳遞給函數。 嘗試從byte []中讀取信息,並將其分配給傳入的變量。因此,如果我有一個int,一個字符串和另一個寫入int byte []的int,則我輸入類似以下內容:
int x, y;
string s;
byte[] info = ...;
FunctionB(info, x, s, y);
Console.WriteLine("{0}, {1}, {2}", x, s, y);
它將從byte []輸出信息。
不,你不能。
在這里,您只有一個out參數,而您想要多個單獨的 out參數。 C#不支持通過params
...,並且params
是獲取數量可變的參數的唯一方法,除非您希望將其重載到要支持的最大參數數量。
params
將始終將參數的值復制到新數組中。 那時它們已與原始變量分離。
確定要出門嗎? 你能給我們真實的代碼嗎? 根據我對您發布的內容的了解,這是可行的...
void Main()
{
object [] f = new object []{ 1, "blah", 4 };
Test( f );
Console.WriteLine("{0}, {1}, {2}", f[0], f[1], f[2]);
// output
// 2, blah, 5
}
void Test ( object[] parameters )
{
for(int ii = 0; ii < parameters.Length; ii++)
{
if(parameters[ii] is int)
parameters[ii] = (int)parameters[ii] + 1;
}
}
請注意,您的“澄清”與您最初提出的問題大不相同。 聽起來您正在嘗試編寫反序列化代碼。 首先,請閱讀MSDN序列化文檔,以了解有關.NET可以提供的功能的更多信息。 如果在特定情況下創建自我反序列化對象是過大的,則應考慮使用BinaryReader讀取數據:
byte[] info...
int x;
string s;
int y;
using (BinaryReader reader = new BinaryReader(new MemoryStream(info)))
{
x = reader.ReadInt32();
s = reader.ReadString();
y = reader.ReadInt32();
}
請注意,如果您的數據編碼與BinaryReader期望的不匹配,則可能必須在BinaryReader.ReadeByte()之上構建自己的函數。 還要注意,從緩沖區填充“大量變量”的函數有一些代碼氣味……肯定這些變量以某種方式相關,並且您有機會定義一個表示(表示反序列化器)的類。不管那個概念是什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.