1

クラスのバックトラッキング問題を書いていますが、いくつかの既存の関数を実装する必要があります。これは私が実装しなければならない機能の1つです。これvoid *inputは、データを渡すことになっている場所です。私の場合は、2次元のベクトルです。

void process_solution(int a[], int k, void *input, bool *finished)
{
    int sumweight = 0;
    int sumvalue = 0;
    std::vector<std::vector<int> > *datavector = static_cast<std::vector<std::vector<int> >* >(input);
    for(unsigned i=0; i<sizeof(a); i++)
    {
        sumweight += a[i]*datavector[i][0];
        sumvalue += a[i]*datavector[i][1];
    }
}

しかし、ラインでエラーが発生したため、キャストに問題があると思いますsumweight += a[i]*datavector[i][0];

エラー:'*(a +((long long unsigned int)(((long long unsigned int)i)* 4ull)))*(datavector +((long long unsigned int)(( (long long unsigned int)i)* 24ull)))-> std :: vector <_Tp、_Alloc> :: operator [] with _Tp = std :: vector、_Alloc = std :: allocator>、std :: vector < _Tp、_Alloc> :: reference = std :: vector&、std :: vector <_Tp、_Alloc> :: size_type = long long unsigned int '

のように、別の変数を使用してベクトルにアクセスしようとするとint t1 = datavector[i][0];、エラーが発生します

エラー:初期化時に「std::vector」を「int」に変換できません

適切なキャストが行われている限り、voidポインタを使用して何でも渡すことができると思いました。ここで何が起こっているのですか?

4

2 に答える 2

4

変数datavectorはのベクトルのベクトルへのポインターintであるため、適切な間接参照を適用する必要があります。

sumweight += a[i] * (*datavector)[i][0];
//                  ^^^^^^^^^^^^^

sumvalue += a[i] * (*datavector)[i][1];
//                 ^^^^^^^^^^^^^

さらに、これ:

for (unsigned i=0; i < sizeof(a); i++)
//                     ^^^^^^^^^

配列内の要素の数はカウントされません(これにより、使用kていない引数は、その配列の長さを含むことを意図していると思います)。

于 2013-03-24T23:38:56.377 に答える
1

まず、ループが間違っています。

for(unsigned i=0; i<sizeof(a); i++)

sizeof(a)sizeof(int*)シグニチャに関係なく、配列を関数に渡すことができないためです。引数はポインタになるため、ベクトルに正しくアクセスすることはできません。

次の問題は、ベクトルへのポインターがあるが(一般的には悪い考え)、それを適切に逆参照していないことです。次のベクトル(次に次のベクトル...)にインデックスを付ける前に、1つの逆参照が必要です。

sumweight += a[i] * (*datavector)[i][0];

次に、自問してみてください。なぜベクトルへのポインタのベクトルを扱っているのですか?これは非常にずさんでエラーが発生しやすいソリューションです。

于 2013-03-24T23:42:50.107 に答える