C++ Func返回数组
请帮助我完成一些常见的任务,比如编写必须返回数组的函数。我花了两个小时来解决这个问题,但没有结果。这是我的密码:C++ Func返回数组,c++,C++,请帮助我完成一些常见的任务,比如编写必须返回数组的函数。我花了两个小时来解决这个问题,但没有结果。这是我的密码: VERTEX* ConstructVertices(float R, unsigned int Slices) { //const unsigned int n = static_cast<const unsigned int>(Slices); VERTEX *__vertices = new VERTEX[100]; float dx =
VERTEX* ConstructVertices(float R, unsigned int Slices)
{
//const unsigned int n = static_cast<const unsigned int>(Slices);
VERTEX *__vertices = new VERTEX[100];
float dx = (2 * R) / Slices;
float dz = dx;
float x, y, z;
x = -R;
y = 0.5f;
z = 0;
int x_sign = 1;
int z_sign = -1;
__vertices[0].Color = D3DXCOLOR(0.0f, 1.0f, 0.0f, 1.0f);
__vertices[0].Pos = D3DXVECTOR3(x, y, z);
for (int i=1; i<Slices * 4 + 1; i++)
{
__vertices[i].Color = D3DXCOLOR(0.0f, 1.0f, 0.0f, 1.0f);
y = -y;
if (y < 0)
{
__vertices[i].Pos = D3DXVECTOR3(x, y, z);
continue;
}
x += x_sign * dx;
z += z_sign * dz;
x = round_up(x, 2);
z = round_up(z, 2);
if (abs(x) == abs(R))
{
x_sign = -x_sign;
}
if (abs(z) == abs(R))
{
z_sign = -z_sign;
}
__vertices[i].Pos = D3DXVECTOR3(x, y, z);
}
return __vertices;
}
通过Watches窗口,我可以看到顶点[0]、顶点[1]、,。。但是我不能把它看作一个数组&主要是sizeof(顶点)返回4而不是160
非常感谢 只需返回一个
std::vector
返回指向堆上分配的内存的指针有几个主要问题:
delete[]a;
很可能是猜测正确的方法是什么)std::vector
的含义。如果需要指向元素的指针,只需使用非空向量(&a[0]
)或a.data()
的第一个元素的地址即可。后者用C++ 2011引入,并且还具有空数组的TGE优点(当然,返回指针不能被取消)。主要是sieof(顶点)返回4而不是160!“这是因为顶点是指针,显然您使用的是一种奇特的高技术32位计算机,指针的大小是4字节另一点是:
VERTEX *vertices = new VERTEX[100];
vertices = ConstructVertices(1, 10);
第一个赋值是没有用的,因为第二个赋值被覆盖而从未使用过,所以您只会泄漏100个顶点的内存。在代码中,您首先动态分配内存:
VERTEX *vertices = new VERTEX[100];
vertices = ConstructVertices(1, 10);
然后在函数中为您的内存分配新的:
//const unsigned int n = static_cast<const unsigned int>(Slices);
VERTEX *__vertices = new VERTEX[100];
//const unsigned int n=静态\u转换(片);
顶点*_顶点=新顶点[100];
最后,返回这个指针并替换创建的第一个指针。内存被分配两次。而不是这个
VERTEX *vertices = new VERTEX[100];
vertices = ConstructVertices(1, 10);
将顶点数组作为参数添加到函数中,并告诉函数大小
VERTEX *vertices = new VERTEX[100];
ConstructVertices(1, 10,vertices,100);
然后在函数内部填充传递的数组
void ConstructVertices(float R,
unsigned int Slices,
VERTEX* vertices,
size_t verticesArraySz )
{
//const unsigned int n = static_cast<const unsigned int>(Slices);
float dx = (2 * R) / Slices;
float dz = dx;
...
void构造函数顶点(浮动R,
无符号整数切片,
顶点*顶点,
尺寸(垂直阵列)
{
//const unsigned int n=静态_转换(切片);
浮点dx=(2*R)/切片;
浮点数dz=dx;
...
不要使用像
\uu顶点这样的名称,这不是一个好习惯,因为通常特定于编译器的东西都使用这种语法。我认为一个解释对初学者更有用。我需要一个数组作为最终结果。@JamesKanze:但是如果你不解释为什么向量更可取,那么你实际上就没有教过任何东西;你很简单这个人显然是一个初学者,我怀疑这个作业是否允许向量(好吧,假设它是一个作业,也许不是)不管什么专业实践,每个人编写C++代码都应该理解他们为什么要做他们正在做的事情。@ JAMESKANZE:我们不同意。当你告诉某人使用向量时,你应该解释为什么。他们应该已经有了对手动内存管理的基本理解,而且这是困难。从开始开始。g、 你将培养出更多有能力的软件开发人员。只告诉初学者“使用向量”是没有帮助的,我认为这种情况经常发生。理解概念比解决这个简单的实现问题更重要。如果你需要一个“数组”(可能是指向第一个元素的指针)您可以使用非空数组的第一个元素的地址(例如,<代码>和[0 ] < /COD>),或者,当使用C++ 2011时,可以使用<代码>数据()/代码>成员(它同样,但也适用于空向量)。。而不是100:无符号整数n_顶点=切片*4+1;
您应该更改顶点的名称
。为什么顶点[]={{D3DXVECTOR3(-1.0f,0.5f,0.0f),D3DXCOLOR(1.0f,0.0f,0.0f,1.0f)};sizeof(顶点)返回的不是4???Grmpf。那么它不是指针(好的,它也是一个指针,但调试器知道它指向一个数组),然后它是一个数组,它的大小由你传递的初始值设定项定义。但是说VERTEX*VERTEX,你只说这个东西指向一个顶点。在你的例子中,你的指针指向数组中的第一个顶点,所以顶点[1]将是下一个顶点。我知道这一点。但我不知道如何从指针指向其第一个元素时获取数组?在调用“constructVertexs”函数之前,不需要在指针上使用new。
void ConstructVertices(float R,
unsigned int Slices,
VERTEX* vertices,
size_t verticesArraySz )
{
//const unsigned int n = static_cast<const unsigned int>(Slices);
float dx = (2 * R) / Slices;
float dz = dx;
...