C++ 在C/C+中分配数组+;
嗨 我不是“本地”C/C++程序员。我能写一些基本的东西,并能编写其他语言所共有的代码。但我有这个问题,我甚至不知道如何问不同的然后解释它(因此谷歌搜索将不适合我) 我的密码里有C++ 在C/C+中分配数组+;,c++,c,pointers,types,C++,C,Pointers,Types,嗨 我不是“本地”C/C++程序员。我能写一些基本的东西,并能编写其他语言所共有的代码。但我有这个问题,我甚至不知道如何问不同的然后解释它(因此谷歌搜索将不适合我) 我的密码里有 typedef float point3[3]; 现在我通过以下方法初始化了3D中的一组点(x,y,z): 函数的作用和u和v的值与我的问题无关(但如果有人问我,我可以提供代码) 现在我想声明一个点3的数组(一维)。因此,当我调用数组[0]时,我将得到一个point3类型的变量。我怎么能做到 编辑: 我提供的信息不
typedef float point3[3];
现在我通过以下方法初始化了3D中的一组点(x,y,z):
函数的作用和u和v的值与我的问题无关(但如果有人问我,我可以提供代码)
现在我想声明一个点3的数组(一维)。因此,当我调用数组[0]时,我将得到一个point3类型的变量。我怎么能做到
编辑:
我提供的信息不足。我的错。我需要保留:typedef float point3[3];因为我使用的是带GLUT的OpenGL,并使用这个函数glVertex3fv(cpoint);其中cpoint是point3类型。所以我很确定我不能使用struct 首先,像这样声明您拥有point3
point3 cpoint[2] = {
{computeX(a, b), computeY(a,b)-5, computeZ(a,b)},
{computeX(c, d), computeY(c,d)-5, computeZ(c,d)}
}
struct point3
{
float x;
float y;
float z;
};
然后声明您的数组
point3 points[2] = {{calculateX(a1, b1), calculateY(a1, b1), calculateZ(a1, b1)},{calculateX(a2, b2), calculateY(a2, b2), calculateZ(a2, b2)}};
首先,像这样声明您自己的point3
struct point3
{
float x;
float y;
float z;
};
然后声明您的数组
point3 points[2] = {{calculateX(a1, b1), calculateY(a1, b1), calculateZ(a1, b1)},{calculateX(a2, b2), calculateY(a2, b2), calculateZ(a2, b2)}};
在C中,我不会在声明数组时初始化它,除非它是一个具有常量值的小数组
typedef float point3[3]; /* point is a type */
point3 *pp; /* pp points to objects of type point3 */
point3 ap[NELEMS]; /* each (of NELEMS) element of ap is of type point3 */
pp = malloc(NELEMS * sizeof *pp);
if (pp) {
/* use pp */
pp[0][0] = computeX(); pp[0][1] = computeY(); pp[0][2] = computeZ();
(*(pp+42))[0] = computeX(); (*(pp+42))[1] = computeY(); (*(pp+42))[2] = computeZ();
free(pp);
}
ap[0][0] = computeX(); ap[0][1] = computeY(); ap[0][2] = computeZ();
在C中,我不会在声明数组时初始化它,除非它是一个具有常量值的小数组
typedef float point3[3]; /* point is a type */
point3 *pp; /* pp points to objects of type point3 */
point3 ap[NELEMS]; /* each (of NELEMS) element of ap is of type point3 */
pp = malloc(NELEMS * sizeof *pp);
if (pp) {
/* use pp */
pp[0][0] = computeX(); pp[0][1] = computeY(); pp[0][2] = computeZ();
(*(pp+42))[0] = computeX(); (*(pp+42))[1] = computeY(); (*(pp+42))[2] = computeZ();
free(pp);
}
ap[0][0] = computeX(); ap[0][1] = computeY(); ap[0][2] = computeZ();
假设C++,最简单的方法是创建一个类来封装点结构,然后创建一个类型的向量:
struct Point
{
Point(float x, float y, float z) : x_(x), y_(y), z_(z)
float x_;
float y_;
float z_;
};
typedef std::vector<Point> Points;
然后,在代码的后面,一旦填充,您可以使用:
Point a = points[ 3 ]; // for example
假设C++,最简单的方法是创建一个类来封装点结构,然后创建一个类型的向量:
struct Point
{
Point(float x, float y, float z) : x_(x), y_(y), z_(z)
float x_;
float y_;
float z_;
};
typedef std::vector<Point> Points;
然后,在代码的后面,一旦填充,您可以使用:
Point a = points[ 3 ]; // for example
我想以一种与point3 typedef兼容的方式扩展Robin Welch的答案:
typedef float point3[3];
struct Point
{
Point(float x, float y, float z)
: x_(values_[0]), y_(values_[1]), z_(values_[2])
{
values_[0] = x;
values_[1] = y;
values_[2] = z;
}
float& x_;
float& y_;
float& z_;
point3 values_;
operator const point3&() const { return values_; }
operator point3&() { return values_; }
};
现在您可以使用这个简单的结构,并将其传递给OpenGL函数,就好像它根本不是这个结构一样。它包含用于OpenGL的原始point3数组,但访问方便,并且为您自己提供了一个构造函数。我想以一种与point3 typedef兼容的方式扩展Robin Welch的答案:
typedef float point3[3];
struct Point
{
Point(float x, float y, float z)
: x_(values_[0]), y_(values_[1]), z_(values_[2])
{
values_[0] = x;
values_[1] = y;
values_[2] = z;
}
float& x_;
float& y_;
float& z_;
point3 values_;
operator const point3&() const { return values_; }
operator point3&() { return values_; }
};
现在您可以使用这个简单的结构,并将其传递给OpenGL函数,就好像它根本不是这个结构一样。它包含用于OpenGL的原始point3数组,但访问方便,并且为您自己提供了一个构造函数。我提供的信息不足。我的错。我需要保留:typedef float point3[3];因为我使用的是带GLUT的OpenGL,并使用这个函数glVertex3fv(cpoint);其中cpoint是point3类型。所以我很确定我不能使用struct。@Ertai:我添加了一个答案,它通过自动转换扩展了这个解决方案。我提供的信息不足。我的错。我需要保留:typedef float point3[3];因为我使用的是带GLUT的OpenGL,并使用这个函数glVertex3fv(cpoint);其中cpoint是point3类型。所以我很确定我不能使用struct。@Ertai:我添加了一个答案,它通过自动转换扩展了这个解决方案。我假设(*(pp+42))类似于数组[42]?是的,同样的事情。您可以改用数组下标语法。我只是想展示指针语法;在我的代码中是这样的pp=malloc(NN*sizeof pp);其中N为常数int N=20;而且我已经“无效”从“空”转换为“浮点(*)[3 ] ]“ErTA:听起来好像你使用C++而不是C。你需要在C++上用C++做一个明确的强制转换。事实上,如果你使用C++,你应该使用<代码>新的<代码>。我已经修改了这行来做:PP=(Poot3*)Malc(NN*SIZEOF*PP);它编译了。。。但有些事情很不对劲,因为我的观点不正确。你能告诉我一个新的语法如何与上面的代码相同吗?我得到了:pp=newpoint3[NN];我的观点仍然是错误的(它编译了你)。我假设(*(pp+42))类似于数组[42]?是的,同样的事情。您可以改用数组下标语法。我只是想展示指针语法;在我的代码中是这样的pp=malloc(NN*sizeof pp);其中N为常数int N=20;而且我已经“无效”从“空”转换为“浮点(*)[3 ] ]“ErTA:听起来好像你使用C++而不是C。你需要在C++上用C++做一个明确的强制转换。事实上,如果你使用C++,你应该使用<代码>新的<代码>。我已经修改了这行来做:PP=(Poot3*)Malc(NN*SIZEOF*PP);它编译了。。。但有些事情很不对劲,因为我的观点不正确。你能告诉我一个新的语法如何与上面的代码相同吗?我得到了:pp=newpoint3[NN];但我的观点仍然是错误的(它汇集了你)。我提供的信息不足。我的错。我需要保留:typedef float point3[3];因为我使用的是带GLUT的OpenGL,并使用这个函数glVertex3fv(cpoint);其中cpoint是point3类型。所以我很确定我不能使用struct。你试过了吗?不太确定是否真的不能使用指向结构的指针。我提供的信息不足。我的错。我需要保留:typedef float point3[3];因为我使用的是带GLUT的OpenGL,并使用这个函数glVertex3fv(cpoint);其中cpoint是point3类型。所以我很确定我不能使用struct。你试过了吗?不太确定是否真的不能使用指向结构的指针;点3 cpoint={computeX(u,v),computeY(u,v)-5,computeZ(u,v)};点3测试[0]=cpoint;?如果是,则不起作用,这就是我的情况。@Ertai:您必须区分初始化和赋值。数组的初始化是可能的,应该完成,而不是作为一个整体进行分配。我最近写了一些关于这个主题的东西:好吧,基本上我的问题是我没有正确的赋值运算符。我想如果我的指示正确的话,我需要一个助手。。。问题是我不知道如何做这件事,学习C++中的指针是一件很难的事情(对简单的ASIG来说有点过分)。