2016-11-19 10 views
0

私の機能に問題があります。私はそれが構造体の配列を返すように見えることはできません。私の構造体をC++、OPENGLの配列として返します

struct Vertex 
{ 
    glm::vec3 p; 
    glm::vec3 c; 
}; 

class CMyApp 
{ 

public: 
    CMyApp(void); 
    ~CMyApp(void); 

    Vertex[] DrawCircle(int cx, int cy); 
... 

それはDrawCircleを強調し、 " ';' を期待":

はここMyApp.hヘッダファイルです。 ";" 期待されるため、関数名のDrawCircleの下にここに

Vertex[] CMyApp::DrawCircle(int cx, int cy) { 
    Vertex result[42]; 

    result[0] = { glm::vec3((float)cx, (float)cy, 0.0), glm::normalize(glm::vec3(0, 0, 1)) }; 

    for (int ii = 1; ii < 21; ii++) { 
     float theta = 2.0f * 3.1415926f * float(ii)/float(20); 
     float x = 0.5 * cosf(theta); 
     float y = 0.5 * sinf(theta); 
     result[ii].p = glm::vec3(x, y, 0.0); 
     result[ii].c = glm::normalize(result[ii].p); 
    } 

    result[21] = { glm::vec3((float)cx, (float)cy, 2.0), glm::normalize(glm::vec3(0, 0, 1.0)) }; 

    for (int ii = 22; ii < 42; ii++) { 
     float theta = 2.0f * 3.1415926f * float(ii)/float(20); 
     float x = 0.5 * cosf(theta); 
     float y = 0.5 * sinf(theta); 
     result[ii].p = glm::vec3(x, y, 2.0); 
     result[ii].c = glm::normalize(result[ii].p); 
    } 

    return result; 
} 

同じ下線:

は、ここで(もちろん、ヘッダを含む)MyApp.cppです。

私は配列のマークを削除する場合、唯一のエラーはreturn文です。私は配列thoとして戻ってみたい。

ありがとうございました。

+0

パラメータ 'vertex * function(int&length)'でポインタを使用し、長さをフィードバックするか、answerで説明したstd :: vectorを使用してください。 – Tokenyet

答えて

3

ローカル配列を返すことはできません。そのような配列はスタックに割り当てられます。関数が返ってくると、その内容はすべて他のスタック変数で利用できます。通話後に使用すると、その内容が破損する可能性があります。

ので

Vertex[] CMyApp::DrawCircle(int cx, int cy) { 
    Vertex result[42]; 
    return result; 
} 

は、コンパイラの未定義の動作です。

代わりにベクターを使用してください。その移動コンストラクタは、配列として整理された多くの結果を返すために効率的になります。あなたは

class CMyApp 
{ 

public: 
    CMyApp(void); 
    ~CMyApp(void); 

    typedef Vertex ArrayOfVertices[]; 
    ArrayOfVertices DrawCircle(int cx, int cy); 
}; 

を宣言する場合は、エラーメッセージを取得すること

std::vector<Vertex> CMyApp::DrawCircle(int cx, int cy) { 
    std::vector<Vertex> result; 
    result.reserve(42); 
    // same content than your original code. 
    ... 
    return result; 
} 

注:あなたがすることはできません

error: ‘DrawCircle’ declared as function returning an array

ArrayOfVertices DrawCircle(int cx, int cy);

0

I want to return as an array tho.

。 CとC++はそれを許可しません。 C++でできることは、とにかくプレーンな配列の代わりに使うべきstd::vectorを返すことです。

関連する問題