0

memcpy は、データをコピーしている宛先配列にオフセットを作成するようです。ここでは、ヘッダーで次のように定義されたソース バッファーを生成します。

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 です。問題ありません。6 つの頂点ごとの色は同じままです (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 に答える