Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C/C+中分配数组+;_C++_C_Pointers_Types - Fatal编程技术网

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类型的变量。我怎么能做到 编辑: 我提供的信息不

嗨 我不是“本地”C/C++程序员。我能写一些基本的东西,并能编写其他语言所共有的代码。但我有这个问题,我甚至不知道如何问不同的然后解释它(因此谷歌搜索将不适合我)

我的密码里有

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来说有点过分)。