将列表转换为旧式双打数组

时间:2014-05-26 20:15:21

标签: arrays memory c++-cli new-operator

我正在使用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显示未定义。

为什么它超出了范围?

谢谢!

2 个答案:

答案 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中的引用。