我正在使用DLL来处理一些需要旧式数组作为参数的硬件。我使用的是Visual C ++ Express 2010。
例如,它可能有
bool DLLFunction(double* array1, double* array2, int array1length, int array2length);
我试图在单例类中隔离所有内容,因此在单例之外的所有内容都使用Lists和Arrays。这意味着我有一堆包装函数,它们将Lists转换为double []以传递给DLL。
因此,我已经使用以下辅助函数将List转换为double []。问题是指向double的指针是未定义的函数。
bool MySingleton::AdaptList(List<double> ^myList, double *myDouble) {
if(myDouble)
delete(myDouble);
myDouble = new double[myList->Count];
for(int k=0; k<myList->Count; k++) {
myDouble[k] = myList[k];
}
return true;
} // AdaptList from List to Double*
在我的代码中,我做了类似的事情:
double *oldschool;
List<double>^ myList;
myList = gcnew List<double>;
// a bunch of myList.Add( ) calls to add the data
bool success = AdaptList(myList, oldschool);
// eventually, delete oldschool
使用调试器,在AdaptList函数内,oldschool
可以完全满足它的需要。当AdaptList返回控件时,oldschool
显示未定义。
为什么它超出了范围?
谢谢!
答案 0 :(得分:2)
每当你需要一个指向数组的非托管指针时,总是值得考虑是否可以从pin_ptr<>获得一个。它会暂时将数组固定在内存中,以便在本机代码使用时无法移动它。像这样:
List<double>^ list = gcnew List<double>;
//...
pin_ptr<double> p = &list->ToArray()[0];
NativeFunctionTakesDoublePointer(p);
如果NativeFunction()存储指针,则无法使用它,因为当p
变量超出范围时,将取消固定数组。
答案 1 :(得分:1)
您需要将双指针传递给MySingleton::AdaptList
成员函数:
bool MySingleton::AdaptList(List<double> ^myList, double **myDouble) {
if(*myDouble) delete(*myDouble);
*myDouble = new double[myList->Count];
for(int k = 0; k < myList->Count; ++k) (*myDouble)[k] = myList[k];
return true;
} // AdaptList from List to Double*
或对指针的引用:
bool MySingleton::AdaptList(List<double> ^myList, double *&myDouble) {
if(myDouble) delete myDouble;
myDouble = new double[myList->Count];
for(int k = 0; k < myList->Count; ++k) myDouble[k] = myList[k];
return true;
} // AdaptList from List to Double*
原因:你正在通过&#39; myDouble&#39;指针按值而不是成员函数bool MySingleton::AdaptList
中的引用。