将整个结构数组传递给函数[重复]

问题描述 投票:0回答:1

我正在按照教程深入研究 C++ 并探索图形编程。然而,我遇到了一个意想不到的问题,我在网上找不到任何解决方案。

这是代码片段:

struct CustomVertex { float x, y, z; unsigned int color; };

void writeToVRAM(CustomVertex *vertices)
{
    ...
    memcpy(pVoid, vertices, size);
    ...
    return;
}

void createShapes()
{
    // Define vertices for a triangle
    CustomVertex vertices[] =
    {
        { -3.0f, 3.0f, 0.0f, 0xFF0000 }, // Red
        { 3.0f, 3.0f, 0.0f, 0x00FF00 },  // Green
        { 0.0f, -3.0f, 0.0f, 0x0000FF }  // Blue
    };
    writeToVRAM(vertices);
}

我试图将整个 CustomVertex 结构数组作为指向 writeToVRAM 函数的指针传递。但是,我注意到如果不使用指针,数据将无法正确传输。

我尝试过各种函数签名:

void writeToVRAM(CustomVertex *vertices)
void writeToVRAM(CustomVertex vertices)
void writeToVRAM(CustomVertex &vertices)
void writeToVRAM(CustomVertex *vertices[])
void writeToVRAM(CustomVertex vertices[])

以及调用方法:

writeToVRAM(&vertices);
writeToVRAM(*vertices);
writeToVRAM(vertices);

编辑:有趣的是,当我像这样重构代码时:

void writeToVRAM()
{
    CustomVertex vertices[] =
    {
        { -3.0f, 3.0f, 0.0f, 0xFF0000 }, // Red
        { 3.0f, 3.0f, 0.0f, 0x00FF00 },  // Green
        { 0.0f, -3.0f, 0.0f, 0x0000FF }  // Blue
    };
    ...
    memcpy(pVoid, vertices, size);
    ...
    return;
}

突然间,它按预期工作了。

我已经用尽了我能想到的所有指针和语法的组合,但没有一个起作用。任何人都可以深入了解这个特殊问题吗?

我搜索了在线资源,但没有发现其他人遇到这个问题。

directx pass-by-reference directx-9
1个回答
1
投票

writetovram()
内部,
sizeof(verticies)
不会返回您认为的结果。您无法仅从指针获取数组的大小。 StackOverflow 上有很多关于这个问题的问题。

最简单的选择是将数组大小作为另一个参数传递,例如:

struct CUSTOMVERTEX { FLOAT X, Y, Z; DWORD COLOR; };

void writetovram(CUSTOMVERTEX *verticies, int num_verticies)
{
    ...
    memcpy(pVoid, verticies, sizeof(*verticies) * num_verticies);
    ...
}

void createshapes() 
{
    //simple square
    CUSTOMVERTEX verticies[] =
    {
        { -3.0f, 3.0f, 0.0f, D3DCOLOR_XRGB(0, 0, 255), },
        { 3.0f, 3.0f, 0.0f, D3DCOLOR_XRGB(0, 255, 0), },
        { -3.0f, -3.0f, 0.0f, D3DCOLOR_XRGB(255, 0, 0), },
        { 3.0f, -3.0f, 0.0f, D3DCOLOR_XRGB(0, 255, 255), },

    };

    writetovram(verticies, 4);
    // or:
    // writetovram(verticies, sizeof(verticies)/sizeof(verticies[0]));
    // or:
    // writetovram(verticies, std::size(verticies));
}

其他选项包括:

  • 通过引用传递数组,但前提是在编译时已知大小。但如果需要使用多个不同大小的数组,则必须将

    writetovram()
    制作为模板函数,以便可以在编译时为每个调用站点推导出数组大小。

  • 更改数组以使用

    std::array
    std:vector
    代替,通过引用传递给函数,然后它可以使用它们的
    size()
    方法。

© www.soinside.com 2019 - 2024. All rights reserved.