2016-03-20 7 views
-2

私は、このリンクでは、このC++のコードを実行しようとしています: https://searchcode.com/codesearch/raw/108480099/ と、私はこの部分でエラーが発生します:布のOpenGLとシミュレーションおよびC++

void drawTriangle(Particle *p1, Particle *p2, Particle *p3, const Vec3 color) 
{ 
glColor3fv((GLfloat*) &color); 
glNormal3fv((GLfloat *) &(p1->getNormal().normalized())); //line 249 
glVertex3fv((GLfloat *) &(p1->getPos())); 

glNormal3fv((GLfloat *) &(p2->getNormal().normalized())); //line 252 
glVertex3fv((GLfloat *) &(p2->getPos())); 

glNormal3fv((GLfloat *) &(p3->getNormal().normalized())); //line 255 
glVertex3fv((GLfloat *) &(p3->getPos())); 
} 

エラー:

249:58: error: taking address of temporary [-fpermissive] 
     glNormal3fv((GLfloat *) &(p1->getNormal().normalized())); 
252:58: error: taking address of temporary [-fpermissive] 
     glNormal3fv((GLfloat *) &(p2->getNormal().normalized())); 
255:58: error: taking address of temporary [-fpermissive] 
     glNormal3fv((GLfloat *) &(p3->getNormal().normalized())); 

この質問は実際に尋ねられましたhere

If you store it in a variable
auto instance = p1->getNormal().normalized(); You can take the address of instance .

申し訳ありませんが、私は答えを理解していません。それを適用する方法?

私はC++の新機能で、シミュレーションを実行したいだけです。 私が間違った方法で質問した場合はお詫び申し上げます。

+0

私は質問が尋ねられたと言いました。 – Cam

答えて

0

エラーはそれをすべて言う:

error: taking address of temporary

あなたは関数によって返された一時オブジェクトのアドレスを服用してはいけません。

GLfloat localObj = p1->getNormal().normalized(); 
    glNormal3fv((GLfloat *) &(localObj)); //line 249 

解決策は、関数内に新しいオブジェクトを定義し、それに一時オブジェクトを割り当てたりコピーしたりすることです。新しいオブジェクトはローカルオブジェクトであり、関数のスコープ内で有効なままです。 関数glNormal3fvは、渡される配列が永遠に存在するはずでないため、正常に機能します。

+0

vcp、あなたは非常にはっきりとうまく説明しました。どうもありがとうございました。しかし、私はまだこのように動作させることはできません。私はまだ 'error: 'GLFloatは'型名を指定しません '、error:' localObj 'はこのスコープ内で宣言されていません。 – Cam

+0

@Cam: 'GLfloat'(小文字の 'f')ですが、コンパイラがC++ 11をサポートしていれば、代わりに' auto'を使うことができます。 – datenwolf

+0

うわー!ありがとうdatenwolf !!! vcpにもう一度感謝します。 – Cam

関連する問題