2010-12-13 22 views
0

こんにちは 私は "ネイティブ" C/C++プログラマではありません。私はいくつかの基本的なことを書いて、他の言語に共通するコーディングを行うことができます。しかし、私はこの問題を抱えています。私はそれを説明する方法とは違う方法を尋ねる方法さえ知らないので(Google検索は私に合わないでしょう)。C/C++で配列の配列を割り当てる

私は私のコード

typedef float point3[3]; 

そして今、私は、このことにより、3D(X、Y、Z)でのポイントの束をinitilizingてる中で持っている:

point3 cpoint = {computeX(u,v),computeY(u,v)-5,computeZ(u,v)}; 

何の機能はありませんuとvの値は私の質問には無関係です(しかし、質問があればコードを提供できます)。

今、point3の配列(1次元)を宣言したいと思います。だからarray [0]を呼び出すと、point3型の変数が得られます。私はそれをどのようにすることができますか?

編集:

私は情報が不十分です。私の悪い。私は保持する必要があります:typedef float point3 [3]; GLUTでOpenGLを使っていて、この関数glVertex3fv(cpoint)を使っているからです。 cpointはpoint3タイプです。だから私は構造体を使うことができないと確信しています。それは、小さなでない限り、それを宣言するとき

+1

構造体からfloat *にキャストや変換を渡して、関数に渡すこともできます。また、 "C/C++"などはありません。彼らは異なった言語であり、どちらかとしてコンパイルされるものを書くことは可能ですが、あなたはそうしようとして足に自分自身を撮影しています。 1つを選び、それに固執する。 C++には、あなたが拒否している多くの多くの便利なツールが用意されています。 –

答えて

0

私はPOINT3のtypedefをとの互換性を保つことを可能にする方法で、ロビン・ウェルチの答えを拡大したいと思います:

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配列が含まれていますが、便利なアクセスとコンストラクタを自分で作成できます。

2
point3 cpoint[2] = { 
    {computeX(a, b), computeY(a,b)-5, computeZ(a,b)}, 
    {computeX(c, d), computeY(c,d)-5, computeZ(c,d)} 
} 
+0

このコードが次のようなものなら:point3 test [2]; point3 cpoint = {computeX(u、v)、computeY(u、v)-5、computeZ(u、v)}; point3 test [0] = cpoint ;?はいの場合は動作していないと私の場合です。 – Ertai

+0

@Ertai:初期化と割り当てを区別する必要があります。配列の初期化は可能であり、実行する必要があります。割り当ては全体ではありません。私は最近、そのテーマをテーマにして書いています。https://gustedt.wordpress.com/2010/12/12/assignment-and-initialization/ –

+0

さて、基本的に私の問題は正しい割り当て演算子がないことです。私は譲歩を使用することができると思う私は私のポインタが正しい場合は...問題は、私はこれを行う方法がわからないとC + +のポインタについて学習するのは少し難しいことです(そして、私が持っている譲歩)値の配列に値(配列)を代入するだけです。 – Ertai

1

最初に私は、配列を初期化しないと、あなたは、あなたの配列Cでは

point3 points[2] = {{calculateX(a1, b1), calculateY(a1, b1), calculateZ(a1, b1)},{calculateX(a2, b2), calculateY(a2, b2), calculateZ(a2, b2)}}; 
+0

私は不十分な情報を提供しました。私の悪い。私は保持する必要があります:typedef float point3 [3]; GLUTでOpenGLを使っていて、この関数glVertex3fv(cpoint)を使っているからです。 cpointはpoint3タイプです。だから私は構造体を使うことができないと確信しています。 – Ertai

+0

試しましたか?あなたが実際に構造体へのポインタを使用することができない場合は、あまり確かです。 –

0

を宣言し、この

struct point3 
{ 
float x; 
float y; 
float z; 
}; 

ようPOINT3を所有宣言定数値を持つ配列。

最も簡単な方法は、あなたのポイントの構造をカプセル化し、そのタイプのベクトルを作成するためにクラスを作成することです、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(); 
+0

私は(*(pp + 42))は配列[42]と同じであると仮定していますか? – Ertai

+0

はい、同じことです。代わりに、配列の添字構文を使用することができます。ポインタ構文を表示したかっただけです。 – pmg

+0

この行pp = malloc(NELEMS * sizeof * pp);私のコードではこのようなものです\t pp = malloc(N * N * sizeof * pp); Nはconst int N = 20です。 "void *"からfloat(*)[3]への無効な変換があります。 " – Ertai

2

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; 

その後、あなたはポイントを保存するためのコレクションを作成することができます:その後のコードで

Points points; 

、あなたが使用してアクセスすることができ、一度人口:

Point a = points[ 3 ]; // for example 
+0

+1。そして構造体。しかし、主にベクトルのために:) – Default

+0

ベクトルに追加する方法をスローしたいかもしれません.. – Default

+1

私は不十分な情報を提供しました。私の悪い。私は保持する必要があります:typedef float point3 [3]; GLUTでOpenGLを使っていて、この関数glVertex3fv(cpoint)を使っているからです。 cpointはpoint3タイプです。だから私は構造体を使うことができないと確信しています。 – Ertai