3

関数のスコープ外で宣言された列挙型を関数に渡そうとしています。これにより、関数内の列挙型の値を変更すると、指す列挙型の値が変更されます。この列挙型の複数の異なるインスタンスでこの関数を使用したいので、オブジェクトのスコープ内で列挙型自体を使用することはオプションではありません。

列挙型「ColourState」があります。そのように宣言した。ColourState へのポインター。

enum ColourState {COLOUR1, COLOUR2};
ColourState* CS_GO_score;

ポインタはそのように初期化されました。

CS_GO_score = new ColourState;
*CS_GO_score = ColourState::COLOUR2;

CSS_GO_score が指す ColourState を関数 'pulsateColour' に渡そうとしています。

そのようです。

void HUD::pulsateColour(GLfloat *colour1, GLfloat *colour2, GLfloat *objectCol, ColourState goingTo, int timeInFrames)
{
    GLfloat difference[4];
    //give us an array of values to change the array by in the alloted time
    difference[0] = (colour1[0]-colour2[0])/timeInFrames;
    difference[1] = (colour1[1]-colour2[1])/timeInFrames;
    difference[2] = (colour1[2]-colour2[2])/timeInFrames;
    difference[3] = (colour1[3]-colour2[3])/timeInFrames;

    //depending on the state, transform the array in one direction or another

    if(goingTo == ColourState::COLOUR2)//if we're moving toward colour 2
    {
        for(int i = 0; i<4; i++)
        {
        objectCol[i] -= difference[i];//subract the difference till we get there
        //we need to SNAP to the colour as we will not hit it every time using floats
            if( (objectCol[i]>(colour2[i]-(difference[i]*2))) && (objectCol[i]<(colour2[i]+(difference[i]*2)))  )
            {//if we hit this tiny but huuuge target
                objectCol[i] = colour2[i];//SNAP
            }

        }
    }else{
        if(goingTo == ColourState::COLOUR1)
        {
            for(int i = 0; i<4; i++)
            {
                objectCol[i] += difference[i];//add the difference till we get there
                //we need to SNAP to the colour as we will not hit it every time using floats
            if( (objectCol[i]>(colour1[i]-(difference[i]*2))) || (objectCol[i]<(colour1[i]+(difference[i]*2)))  )
            {//if we hit this tiny but huuuge target
                objectCol[i] = colour1[i];//SNAP
            }

            }
        }
    }

    if((objectCol[0] == colour1[0])&&(objectCol[1] == colour1[1])&&(objectCol[2] == colour1[2])&&(objectCol[3] == colour1[3]))
    {//if the objcolour == colour 1
        goingTo = ColourState::COLOUR2;//it's now time to move towards colour 2
    }else{
        if((objectCol[0] == colour2[0])&&(objectCol[1] == colour2[1])&&(objectCol[2] == colour2[2])&&(objectCol[3] == colour2[3]))
        {//if the objcolour == colour 2
            goingTo = ColourState::COLOUR1;//it's now time to move towards colour1  
        }

    }
}

}

この関数はそのように呼び出されます。

pulsateColour(white,blue, GO_scoreColour, *CS_GO_score, 10);

ただし、「goingTo」と「CS_GO_score」による値ポインター (これらは同じアドレスである必要があるため、技術的には同じオブジェクトですよね?) の場合、VS で値モニターを監視すると、「goingTo」が指す値のみが表示されます (関数に対してローカルであるため)変更されましたか?私は何を間違っていますか?

4

2 に答える 2

7

列挙型を値で渡しているため、関数には渡すもののローカルコピーがあります。列挙型を渡してその値を変更する場合は、参照渡しをお勧めします。

enum ColourState {COLOUR1, COLOUR2};

void change_colour(ColourState& c)
{
  c = COLOUR2;
}

....

ColourState cs = COLOUR1;
change_colour(cs);
于 2013-02-18T22:35:32.003 に答える
1

ただし、'goingTo' と 'CS_GO_score' による値ポインターの場合 (これらは同じアドレスである必要があるため、技術的には同じオブジェクトですよね?)、

いいえ...ポインタ自体を渡すと「同じオブジェクト」になります。ここでは、ポインターが指す値を渡しています。または、参照を渡すこともできます。

void HUD::pulsateColour(GLfloat *colour1, 
                        GLfloat *colour2, 
                        GLfloat *objectCol, 
                        ColourState goingTo, /* pass by value */
                        int timeInFrames)

...

関数のスコープ外で宣言された列挙型を関数に渡そうとしています。これにより、関数内の列挙型の値を変更すると、指す列挙型の値が変更されます。ポインターまたは参照を取るように関数を変更する必要があります。

  ColourState *goingTo, /* pass direct the pointer */

また

  ColourState &goingTo, /* pass a reference-dont need to change the body of the function */
于 2013-02-18T22:37:31.493 に答える