2017-04-20 42 views
-4

我无法获得一些代码来编译。问题似乎是将一个数组引用赋给一个结构的元素。以下是下面的代码和错误消息。C++分配数组引用的麻烦struct

所以我有一个结构,看起来像这样

struct numpyFormatterData{ 
    double* pointerToNumpyData; 
    unsigned long numberOfDataRows; 
    unsigned long numberOfDataColumns; 
    std::string delimitedStringOfColumnNames; 
}; 

然后,我有一个生成双打的随机50×10阵列的功能。

double generateRandomArray(double lower_, double upper_) 
{ 
    int row = 50; 
    int columns = 10; 
    double arr[rows][columns]; 

    for (int i = 0; i < rows; i++) { 
     for (int j = 0; j < columns; j++) { 
      arr[i][j] = std::uniform_real_distribution<double>(lower_, upper_)(gen); 
     } 
    } 
    return arr; 
} 

在我的测试案例中,我有下面的代码是导致问题。我正在使用Catch测试框架。

TEST_CASE("Test construction of NumpyDataRequest Class", "[NumpyDataRequest]") { 

SECTION("Test factory method for creating NumpyDataRequest") { 

    double testDataArray = generateRandomArray(0.0, 2.0); 
    numpyFormatterData testNumpyRequest; 
    testNumpyRequest.numberOfDataRows = 50; 
    testNumpyRequest.numberOfDataColumns = 10; 
    testNumpyRequest.delimitedStringOfColumnNames; 
    testNumpyRequest.pointerToNumpyData = &testDataArray; //PROBLEM HERE 

    std::unique_ptr<NumpyDataRequest> testingDataRequest = NumpyDataRequest::setDataForRequest(testNumpyRequest); 
    numpyFormatterData checkDataRequest = testingDataRequest->getRequestData(); 
    REQUIRE(checkDataRequest.numberOfDataColumns == 10); 


} 
} 

我得到的错误信息是:

undefined reference to `generateRandomArray(double, double)' 
collect2: error: ld returned 1 exit status 

我知道,我想引用不正确分配给testDataArray。我尝试了各种不同的方式来做到这一点,但都没有奏效。有什么建议么?

+0

我看到一些问题。首先,根据你的错误文本,在测试文件的范围内没有包含generateRandomArray函数。其次,你的函数中没有结果字段,你可以指定什么。最后,看起来结果似乎不是双倍*,而是双倍**。请检查一下。 –

+0

结果没有在'generateRandomArray(...)'中声明,但让我们假设它被声明在别的地方,并且可以访问,但你仍然不能'返回结果;'因为函数返回一个double也不能在C++中返回一个数组,你而是返回一个指向第一个元素的指针。 –

+0

@ArseniiFomin所以其实问题不在于generateRandomArray函数。我在generateRandomArray函数的测试文件中有一个'include',所以这似乎不成问题。现在,当我移除'testDataArray'前面的'&'amperstand时,我得到一个错误'不能将'double'转换为'double *' testNumpyRequest.pointerToNumpyData = testDataArray;'这就是为什么我认为错误位于该分配。 – krishnab

回答

0

如果你正在寻找的是你的数组的引用,然后改变double generateRandomArray(...)double* generateRandomArray(...)返回类型,然后返回这样return &result[0][0];参考,最终改变double testDataArraydouble *testDataArray

编辑:我只是注意到你的数组是分配在堆栈上,而不是你想在这个例子中。考虑使用堆而不是vector

+0

好的,谢谢。所以我和你在generateRandomArray上。我实际上返回'arr' - 似乎我放了一个旧版本的功能 - 所以我会解决这个问题。我与你在函数返回一个指向数组的指针。感谢您澄清如何解决这个问题。我会给它一个镜头。 – krishnab

+0

嘿法雅。哈哈,我很乐意使用矢量,但不能在这种情况下。所以我实际上试图从python numpy连接到C++。 Numpy公开了一个基本指针,指向它的底层C数组。所以我必须在C++端恢复这一点。一旦我在C++中使用它,那么我实际上会生成一个向量 - 但首先我需要捕获numpy发送的指针。但是你的评论真的很有帮助。我对C++编程还不太熟悉,所以只是想方设法。 – krishnab