2017-04-20 6 views
-4

コンパイルするコードを取得できません。問題は、構造体の要素に配列参照を割り当てることにあるようです。以下は、以下のコードとエラーメッセージです。構造体への配列参照の割り当てに関するC++の問題

だから私はその後、私はダブルスのランダムな50×10の配列を生成する関数を持っているこの

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

のように見える構造体を持っています。

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を返すので、結果を返すこともできません。代わりに最初の要素へのポインタを返します。 –

+0

@ArseniiFomin実際には、問題はgenerateRandomArray関数ではありません。 generateRandomArray関数のテストファイルに 'include'があるので、それは問題ではないようです。今度は 'testDataArray'の前に'& 'amperstandを削除すると、' 'ダブル 'を' double * 'に代入するとエラーが発生します。 testNumpyRequest.pointerToNumpyData = testDataArray;これはエラーだと思いますその割り当てに位置しています。 – krishnab

答えて

0

あなたが探していることは、このreturn &result[0][0];のように参照を返す、最後にdouble *testDataArraydouble testDataArrayを変更後、double* generateRandomArray(...)double generateRandomArray(...)の戻り値の型を変更するあなたの配列への参照である場合。

編集:この例ではあなたの配列がスタックに割り当てられているだけに気付きました。代わりにヒープまたはvectorを使用することを検討してください。

+0

よろしくお願いいたします。だから私はgenerateRandomArrayであなたと一緒にいます。私は実際に 'arr'を返します - 私はその関数の古いバージョンを置いているようです - それで解決します。私はあなたに関数の配列へのポインタを返すあなたと一緒にいます。これを修正する方法を明確にしていただきありがとうございます。私はそれを撃つだろう。 – krishnab

+0

ちょっとファラ。私はベクトルを使うのが好きですが、この場合はできません。だから私は実際にPythonのnumpyからC++に接続しようとしています。 Numpyは基礎となるC配列に基本ポインタを公開します。ですから、私はC++側でその点を回復しなければなりません。いったん私はC + +でそれを持って、実際にはベクトルを生成します - しかし、まず私はnumpyが送信するポインタをキャッチする必要があります。しかし、あなたのコメントは本当に本当に役に立ちます。私はちょっとC++プログラミングに新しいので、ちょうど私の方法を見つける。 – krishnab

関連する問題