トップページ > 過去ログ > 記事閲覧
アロー演算子のエラー
名前:k−n 日時: 2008/01/07 22:18

アロー演算子に関しての質問です。 struct SPos{ float x; float y; } SPos *pPos; static float Woldx; int main{ Woldx = 3; pPos->x = Woldx; } 簡単に言うとWoldxのアドレスをpPos.xに入れたいのですが、 ビルドは通るのですがデバッグをすると 以下のエラーが発生します test.exe の 0x005231b9 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00000000 に書き込み中にアクセス違反が発生しました。 おそらく pPos->x = Woldx; でエラーが発生していると思うのですが pPos->x = &Woldx; に変更をすると error C2440: '=' : 'float *__w64 ' から 'float' に変換できません。 というエラーが発生し、ビルドができません。 拙い説明で申し訳ありません。 わかる方がいれば教えてください。 よろしくお願いします

Page: 1 |

Re: アロー演算子のエラー ( No.1 )
名前:TNT 日時:2008/01/08 00:10

まず、SPos pPosは構造体へのポインタであるので、使用するには構造体の実体が必要です。 例えば SPos sp; SPos *pPos; pPos = &sp; といった具合に、ポインタは実体を得なければ使用できません。 (というより、上の例は初期化されていないポインタを使っており危険です) この場合ではSPosをポインタにする必要はありません。代わりに実体として定義します。 WoldxのアドレスをpPos.xに入れるとするなら、xがポインタとなるので、 struct SPos{ float *x; float *y; }; SPos pPos; static float Woldx; int main{ Woldx = 3; pPos.x = &Woldx; } となります。 アロー演算子は、ポインタが構造体やクラスを指しているときに使用します。 (その構造体・クラスのメンバ変数/関数を参照する際にアロー演算子を使用する) (補足) やりそうな勘違い、ということで一つ追記しておきます。 WoldxのアドレスがpPos.xに格納された訳ですが、pPos.xでWoldxの内容を参照するのは pPos->xではありません。*(pPos.x)がWoldxの中身を指します。 (見ての通りあまりきれいな参照の仕方では無いわけで、実際には少々工夫をしたりするのですが…)
Re: アロー演算子のエラー ( No.2 )
名前:meigin 日時:2008/01/07 23:58

実体が無いからだと思います。 SPos pPos; pPos.x = Woldx; とすれば通ると思います それとも SPos gPos; SPos *pPos = &gPos; かな? 目的に応じて、使い分けて下さい 簡単に言うと、何処に入れて良いのか解らない ので、エラーです。 入れる場所を教えてあげれば、 エラーは出なくなります
Re: アロー演算子のエラー ( No.3 )
名前:Sura 日時:2008/01/08 02:13

プログラムの原型を留めるようにするには new 及び delete を使うとよいと思います。 struct SPos{ float x; float y; } SPos *pPos; static float Woldx; int main{ pPos = new SPos; Woldx = 3; pPos->x = Woldx; delete pPos; }
Re: アロー演算子のエラー ( No.4 )
名前:憂煉 日時:2008/01/08 00:50

Woldxのアドレスをxに入れるなら struct SPos{ float *x; float y; } xをポインタにする必要があります 他の部分は既に回答が出てるので省略
Re: アロー演算子のエラー ( No.5 )
名前:k−n 日時:2008/01/09 16:31

ありがとうございます。 おかげで解決いたしました。

Page: 1 |