2

メンバー参照およびポインター演算子の機能についていくつかの懸念があります..

次の例を見てください。

struct ID{
    uint8_t index;
    bool active;
}

struct Square{
    struct ID shortID;
    struct BUDDY *bud;
    uint8_t x;
    uint8_t y;
};

そして、後で正方形へのポインターを返します..私の質問は、ID のメンバーを変更して、ネストされた構造体に変更を反映させることはできますか?

void function1()
{
    Square *someSquare = GetSquare(1);
    someSquare->shortID.index = 89; // Is this now reflected everywhere? OR was the shortID struct only modified in the scope of this funciton..
}

void function2()
{
    Square *someSquare = GetSquare(1);
    if ( someSquare->shortID.index != 89 )
    {
        // Dang...
    }
}

ありがとう!

編集:

簡潔な回答をありがとう、はい、GetSquare 関数は、正方形の配列の指定されたインデックスへのポインターを返します。そのようです:

Square* GetSquare( uint8_t index )
{
    return &squares[index];  
}

そのため、オブジェクトの作成時に "squares" 配列が 1 回割り当てられるため、インスタンスは毎回同じである必要があります。だからあなたの洞察に感謝します私の問題は私のコードのどこかにあるはずです:)

4

5 に答える 5

2

はい、 someSquare はSquare* 演算->子のようなもの(*varname).です。したがって、それはポインターの内容であり、 type を取得しますSquare。次に、変数を で変更するだけです.。これは、構造体であり、すべての変数が公開されているため、クラスにあるようにはなりません。

関数 1 で行った変更は、関数 2 で確認できGetSquareます。同じオブジェクトが返された場合GetSquareは、このようになっている可能性があります。

Square * GetSquare(int i)
{
    static Square * pSquare = 0;
    if (pSquare)
        pSquare = malloc(sizeof(static Square));
    return pSquare;
}

またはこのようなグローバル変数の場合

static Square pSquare ;

Square * GetSquare(int i)
{
    return &pSquare;
}
于 2012-11-23T07:27:55.587 に答える
1

function1 の Square ポインターが function2 の Square ポインターと同じ Square を指している場合、はい、function2 の function1 に設定された値が表示されます (関数がその順序で呼び出される場合)。

ポインターが異なるインスタンスを指している場合、値は表示されません。

juanchopanza が指摘したように、すべては GetSquare 関数が何をするかによって異なります。その関数の定義を投稿してください。

于 2012-11-23T07:32:41.107 に答える
0

はい。GetSquare(1) が同じインスタンスを返す場合、その変更は function2() にも反映されます。返されるインスタンスが same であることを確認したい場合は、次のステートメントでポインター someSquare の値を出力してみてください。

printf("Value of pointer: %p \n",someSquare);

この値が同じ場合は、それらが同じインスタンスであることを意味し、変更は function2() に反映される必要があります。

また、GetSquare は、クラス外のグローバル関数または静的関数である必要があります。インスタンス関数の場合、さまざまなクラス オブジェクトのクラス "Square" のさまざまな配列にアクセスします。

それ以外は、利用可能なコードに基づいて別の意見を述べることができませんでした.

于 2012-11-24T04:10:02.110 に答える
0

グローバルインスタンスの形式を使用していないため、スコープ内になります。getSquare が実際に何をするのかはわかりませんが、Square クラスをインスタンス化し、インスタンスを返すと仮定します...

于 2012-11-23T07:26:31.530 に答える
0

アクセスsomeSquare->someID.indexはアクセスと同じですsomeSquare->x。どちらの場合も、 が指すオブジェクトを変更しますsomeSquare(最初のケースでは、サブオブジェクトを変更します)。

于 2012-11-23T07:29:16.553 に答える