ページ 11

メンバの間接参照について

Posted: 2009年8月03日(月) 23:12
by チルチル
malloc関数で確保した構造体に対して

p->x+cos(p->Angle+PI)*(p->Length/2)+cos(p->Angle+PI/2)*(p->Width/2);

のような処理を行うと強制終了してしまいます

float x1=cos(p->Angle+PI)*(p->Length/2);
float x2=cos(p->Angle+PI/2)*(p->Width/2);
p->x+x1+x2;

のように分けたりすると大丈夫なのですが・・

何か思い当たる事はないでしょうか?

C++ DXライブラリを使用しています

Re:メンバの間接参照について

Posted: 2009年8月03日(月) 23:37
by box
> p->x+cos(p->Angle+PI)*(p->Length/2)+cos(p->Angle+PI/2)*(p->Width/2);
>
> のような処理を行うと強制終了してしまいます

強制終了してしまうプログラムのソースコードすべてを載せていただけますか?

ところで、

> p->x+cos(p->Angle+PI)*(p->Length/2)+cos(p->Angle+PI/2)*(p->Width/2);

も、分割した

> p->x+x1+x2;

これも、演算結果をどこにも代入していません。それでよいのでしょうか?
本題と直接関係はありませんが、気になります。

Re:メンバの間接参照について

Posted: 2009年8月04日(火) 18:22
by チルチル
ソースコードは約1万行あるので全部乗せるのは無理でしょうね・・
肝心な部分だけ抜き出してみましょうかね・・

代入を行っていないのは、代入するから強制終了するのか、式に問題があるのかを判断するためです
どうも式に問題があるようですね・・

Re:メンバの間接参照について

Posted: 2009年8月04日(火) 19:25
by ねこ
落ちる時の各値チェックしたら良いんじゃないの?
malloc部分も構造体も書かないんじゃ分からないよ。

Re:メンバの間接参照について

Posted: 2009年8月04日(火) 19:47
by チルチル
各値チェックですか・・
DrawFormatString関数とWaitKey関数でやってみます
少々お待ちください

Re:メンバの間接参照について

Posted: 2009年8月04日(火) 21:30
by バグ
そんな手の込んだ事しなくても、問題のありそうなところにブレイクポイントを置いて、値を確認すればいいだけかと…

Re:メンバの間接参照について

Posted: 2009年8月04日(火) 21:57
by チルチル
ん?ブレイクポイントとは何でしょうか?

値を確認する前に怪しい所をコメントアウトしてみたら
なぜかmalloc関数で確保したVERTEX構造体配列
Vertex[i*6+3]とVertex[i*6+1]の一部のメンバに値を代入すると強制終了しました
他は大丈夫みたいなんですけど・・

Re:メンバの間接参照について

Posted: 2009年8月04日(火) 22:09
by 初級者
ブレークポイント
ブレイクポイント

あたりのキーワードでググってみましょう。

Re:メンバの間接参照について

Posted: 2009年8月04日(火) 22:26
by チルチル
調べてみるとBorlandの場合は別にソフトが必要のようですね
私の場合は先輩の環境をコピーしたのでBorlandが展開されている場所もわからないし
以前によくわからないまま同じような事をやった時に開発環境が異常を起こした事があったので
パッと導入するのは無理ですね・・

あと何でか分からないんですが
malloc宣言部
VERTEX *Vertex=(VERTEX*)malloc(sizeof(VERTEX)*(6*(abs(P->DrawType)==1)?Unit:Sum));を
VERTEX *Vertex=(VERTEX*)malloc(sizeof(VERTEX)*1000);に変更すると見た感じうまく行きました
もしかしたら領域確保に失敗してるのかもしれません
なぜかVERTEX Vertex[1000];ではうまく行きませんでしたが・・

Re:メンバの間接参照について

Posted: 2009年8月04日(火) 22:40
by チルチル
さらに試行錯誤すると
VERTEX *Vertex=(VERTEX*)malloc(sizeof(VERTEX)*(6*(abs(P->DrawType)==1)?Unit:Sum));を
VERTEX *Vertex=(VERTEX*)malloc(sizeof(VERTEX)*(6*((abs(P->DrawType)==1)?Unit:Sum)));に変えると
うまく動きました
条件演算子の優先度が原因だったのでしょうか・・
見たところ問題解決したようなので
もう少し試行錯誤して強制終了しないか調べてみます

Re:メンバの間接参照について

Posted: 2009年8月05日(水) 07:46
by チルチル
調べた結果、やはり条件演算子の優先度が原因でした
お騒がせしてすみません
どうもありがとうございます