1

我正在为我的班级写一个回溯问题,我必须实现一些现有的功能。这是我必须实现的功能之一。这void *input是我们应该传入数据的地方,在我的例子中是一个二维向量。

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*)因为无论您的签名如何,您都无法将数组传递给函数。该参数将是一个指针,因此您将永远无法正确访问您的向量。

您的下一个问题是您有一个指向向量的指针(通常是个坏主意),但您没有正确取消引用它在索引到下一个向量(然后进入下一个向量......)之前需要一个取消引用,即,

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

接下来,问问自己;你为什么要处理指向向量的指针的指针?这是一个非常草率且容易出错的解决方案。

于 2013-03-24T23:42:50.107 回答