0

似乎 memcpy 在我正在复制数据的目标数组中创建了一个偏移量。在这里,我生成在 header 中定义的源缓冲区:

float  segments[360*RANGE_INDEX*6];
void GlWidget::GenerateBuffers()
{
    //    srand( 0 );
    int angleIndex = segmentIndex * 20;

    for(int i = angleIndex; i < angleIndex + 20; i++)
        for(int j = 0; j < RANGE_INDEX; j++)
        {
            float randNumber = rand() % 255;

            for(int k = 0; k < 6; k++)
            {
                segments[(i*RANGE_INDEX+j)*6+k] = randNumber/255.0f;
            }
        }
}

我已经使用迭代将源缓冲区初始化为 0。

void GlWidget::exec()
{// memcpy ( void * destination, const void * source, size_t num );

    qDebug() << "inside exec()";

    int startIndex;
    int finalIndex;

    startIndex = segmentIndex * 20;
    finalIndex = startIndex + 20;
    ppi->MemCpyToColorVector(&segments[0*RANGE_INDEX], 0);
}

在这里,我将源复制到目标,我遇到的问题是第一个i,即角度0,没关系,每六个顶点的颜色保持不变(0到599)。但是,对于角度 1 (i == 1),源缓冲区是正确的,索引 600 到 605 保持相同的值,尽管在目标缓冲区中,颜色 600 和 601 相同,而与 603 不同。

    void PlanPositionIndicator::MemCpyToColorVector(float* segments, int angleIndex)
    {// memcpy ( void * destination, const void * source, size_t num );

   //    QVector<float> colors;

        size_t bytes;

        int index;

        index = 0;

        bytes = 0;

        index = angleIndex * _RANGE_CNT;

        index *= 6;

        bytes = sizeof(float) * _RANGE_CNT * 6;

        memcpy(&colors[index], &segments[index], bytes);
    }

这个偏移量是由 memcpy 创建的吗?你有什么意见?

4

1 回答 1

2

memcpy是一个低级函数。它将整个内存从一个指针复制到另一个指针。在不知道其内部结构的情况下在复杂的数据结构上使用它QVector是解决特定错误的简单方法。如果您需要将数据复制float *QVector < float >您应该简单地执行以下操作:

if (colors.size() < (index + _RANGE_CNT * 6))
    colors.resize(index + _RANGE_CNT * 6);
for (int i = 0; i < _RANGE_CNT * 6; ++i)
    colors[index + i] = segments[index + i];
于 2013-06-16T12:13:43.607 回答