重定位作为参数

时间:2016-12-14 05:52:59

标签: c++ pointers

我有一个方法,只需一个unsigned char*作为参数。

int MyClass::MyMethod(unsigned char* resultArray)

该参数由外部.NET应用程序分配并传递,但该值预计会根据结果发生变化。

在方法的主体中,我调用了一个以类似方式返回数组的第三方API。

ThirdPartyAPI::GetResult(result);
int size = result.GetSize();
unsigned char* temp = new unsigned char[size];
result.GetData(temp);

现在,我的temp变量是一个填充数组,其中包含我需要返回C#的结果。我怎么做? 我尝试了简单的resultArray = result,但只返回一个空数组。由于在调用我的方法之前C#应用程序无法知道大小,因此必须将其初始化为随机长度或者以空方式发送并在我的方法中调整大小。 所以,如果我可以像resultArray = new unsigned char[size]这样调整大小,那么我就可以避免复制,但会引发异常。

实现这一目标的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

如果您在方法签名中有发言权,请将您的功能更改为此

SELECT 
     DivisionName, CONVERT(Date, DateClosed) [DateClosed],
     COUNT(CASE WHEN DateClosed BETWEEN @START AND @END AND DateCreated < @START THEN 0 END) AS PREDATED,
     COUNT(CASE WHEN DateClosed BETWEEN @START AND @END AND DateCreated >= @START THEN 0 END) AS DAYOF
 FROM 
     POS.Orders o WITH(NOLOCK)
 JOIN 
     POS.OrderDetails od WITH(NOLOCK) ON o.OrderId = od.OrderId
 JOIN 
     Directory.Divisions d WITH(NOLOCK) ON o.DivisionId = d.DivisionId
 GROUP BY 
     DivisionName, DateClosed

然后你可以做

int MyClass::MyMethod(unsigned char** resultArray)

要调用此方法,您现在必须传递指针的地址而不仅仅是指针

*resultArray = result;

替代解决方案

MyClass m;
char *str;
m.MyMethod(&str);

使用此签名,您只需返回字符串并修改int参数以包含调用的状态

char* MyClass::MyMethod(int *status);