我正在按照教程深入研究 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;
}
突然间,它按预期工作了。
我已经用尽了我能想到的所有指针和语法的组合,但没有一个起作用。任何人都可以深入了解这个特殊问题吗?
我搜索了在线资源,但没有发现其他人遇到这个问题。
在
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()
方法。