代入したのに,代入されてないんです.

[戻る]
merlo 2002/05/04(土) 21:14:06
exchg[exchg_num][0]=m_obj_nmbrn[i*m_bi_wid+(j-1)];
if(exchg[exchg_num][0]!=m_obj_nmbrn[i*m_bi_wid+(j-1)])
     MessageBox("強烈にバグってる");

これで,メッセージボックスが出てくるのって,おかしいですよね・・・
でも,出てきます・・・(T_T)

わけわかんないです・・・涙

これって,ありえますか?
解決方法なんてないですよね・・・うぅ

win2k MFC ダイアログ

テン 2002/05/04(土) 21:32:25
左辺と右辺のオブジェクトが比較演算子!=を別の意味に解釈すことはありえる?
operator!=で別の意味に解釈さすことは可能?
あとはわかりません。

merlo 2002/05/04(土) 21:36:38
operatorはいじくってないんです.

merlo 2002/05/04(土) 21:46:21
unsigned int exchg[800][2]

とか

unsigned int exchg[1000][2]

とかって,予め多めに準備しておく配列の大きさを
変えるたびに,エラーの様子が変わってきます

merlo 2002/05/04(土) 21:49:39
void C**Dlg::OnButtonNmbring() 

この関数内で上述の配列を宣言しています

PS

JPEGファイルをDIBに変換し,
画像の中にあるボール(複数個)を認識するのが
目的です.

この関数の役割は,
認識対象物をあるまとまりとして捉え,
数字を割り振る作業を担っているものです.

merlo 2002/05/04(土) 22:06:18
また

exchg[exchg_num][0]=m_obj_nmbrn[i*m_bi_wid+(j-1)];
if(exchg[exchg_num][0]!=m_obj_nmbrn[i*m_bi_wid+(j-1)])
     MessageBox("強烈にバグってる");

でなくても

exchg[exchg_num][0]=m_obj_nmbrn[i*m_bi_wid+(j-1)];
CString wkss;
wkss.Format("%d %d って一緒だよね?(T_T) ",
             exchg[exchg_num][0],m_obj_nmbrn[i*m_bi_wid+(j-1)]);
MessageBox(wkss);

ってやっても,やっぱり違うことがわかるんです.

com-a 2002/05/04(土) 23:42:56
exchgとかの変数は動的変数ですか?
静的(static)に変えてみたらどうなりますか?
あと、malloc()を使ってみたらどうなりますか?

ちょっとカンですけど。。。

merlo 2002/05/05(日) 00:38:05
静的です.
unsigned int exchg[1000][2];
↓
初期化

こんな感じでやってましった

明日,動的生成 NEW関数 変数はヘッダのあそこで宣言
(あそこっていうか,メンバ関数?です)

でやってみます

merlo 2002/05/05(日) 00:44:54
昔,VCで,(Cでもいえると思うけど)
関数内で容量の大きい配列を宣言するとよく
ばぐった経験があるので,
あまり大きな配列を宣言したときは,
ひやひやです.
これって,具体的に上限はどこっていうの
あるんですか?

駄犬 [E-Mail] 2002/05/05(日) 02:13:33
書いてないので念のため。

1.m_obj_nmbrnの型、配列数は?
2.exchg_num、i*m_bi_wid+(j-1) それぞれの値は?

merlo 2002/05/05(日) 17:00:13
1.m_obj_nmbrnの型、配列数は?

unsigned int m_obj_nmbrn[500〜1000ぐらい][2];

2.exchg_num、i*m_bi_wid+(j-1) それぞれの値は?

上述の宣言時配列大きさ800〜1000を変えると,
ちょっと,かわってきちゃってなんとも言えませんが
例えば,


exchg_numの初期値は初期化により0なのは当然で
そこに

i*m_bi_wid+(j-1)(=17)を代入すると
次の行で exchg_numが5 とかになってます(T_T)

テン 2002/05/05(日) 18:25:26
気になることがあるのですが
unsigned int m_obj_nmbrn[500〜1000ぐらい][2]; <−2次元配列
ungigned int exunschg[1000][2]; <−同じく2次元配列

次の代入式のところで
>exchg[exchg_num][0]=m_obj_nmbrn[i*m_bi_wid+(j-1)];
次のようなコンパイルエラーはでないのですか?

:\PRG\bug\bugDlg.cpp(181) : error C2440: '=' : 'unsigned int [2]' か
ら 'unsigned int' に変換することはできません。(新しい動作 ; ヘルプを参照)

merlo 2002/05/05(日) 22:47:52
す,すみません

unsigned int m_obj_nmbrn[500〜1000ぐらい][2];

こちらは,二次元配列ではなくて


unsigned int* m_obj_nmbrn;
m_obj_nmbrn=new unsigned int[m_bi->biHeader.biWidth*m_bi->biHeader.biWidth];

の間違いです.質問者の立場で,こういうミスをしてしまい
大変申し訳ありません.

PS (本題とは関係ないですが・・・)
m_obj_nmbrn の初期化した値は 0.
m_obj_nmbrn は,m_obj_nmbrn[**]で示すドットが白なら初期値のままの0
                        黒なら認識番号

当然のことながら,全力で自力で解決する所存ですが,
関数内における大容量配列取り扱いに関してもし
ご存知な方がいらしたら,よろしくです.

こちらの記述ミスでこのようなエラーがひょっとしたら
出ているかも知れないので,怖いです.

駄犬 [E-Mail] 2002/05/06(月) 11:21:20
うーん、結局のところm_obj_nmbrnの容量はいかほどになるのでしょう。
また、i*m_bi_wid+(j-1)が17なのでしょうか、m_obj_nmbrn[i*m_bi_wid+(j-1)]が17なので
しょうか。
落ち着いて情報を一度整理してください。

# 話をシンプルにするとこういうことですか?
unsigned int exchg[1000][2];
unsigned int* m_obj_nmbrn;
m_obj_nmbrn=new unsigned int[m_bi->biHeader.biWidth*m_bi->biHeader.biWidth];
//biWidth * biHeight?

exchg[0][0]=m_obj_nmbrn[17];
CString wkss;
wkss.Format("%d %d って一緒だよね?(T_T) ",
             exchg[0][0],m_obj_nmbrn[17]);
AfxMessageBox(wkss);  //不一致

merlo 2002/05/06(月) 15:06:02
[[解決]]
アドバイスいただきありがたく思っているのですが,
どうやら,原因不明のバグは原因不明の理由により
直ってました(T_T)

なぜ,解決したのかまったくわかりませんが,
過去ログで,この投稿をご覧になられた方に
深くお詫び申し上げます.

また,アドバイスいただいた数々の御先輩方
ありがとうございました.

merlo 2002/05/06(月) 15:07:41
お騒がせして,本当に申し訳ありませんでした.
今後ともよろしくお願いします

merlo 2002/05/07(火) 00:17:45
原因がわかりました.
配列が十分な大きさではなかった初歩的なミスでした.
プログレスバーを用いて,チェックしたら
すぐに見つかりました.

ご迷惑おかけしました.

ところで,ダイアログベースでプログラムしてますが
デバッグしようとすると(つまり,数箇所にF9を押し,
ブレイクポイントを付ける),かならず,
忠告で「ひとつ以上のブレークが設定できませんでした」
と返されます.

ダイアログベースの場合は,一番最初にくるブレイクポイントを
onPaint関数内にしなくてはならないのでしょうか

駄犬 [E-Mail] 2002/05/07(火) 18:18:30
> ダイアログベースの場合は,一番最初にくるブレイクポイントを
> onPaint関数内にしなくてはならないのでしょうか

そんなことないですよ。
ブレークポイントが意図しないところに設定されていませんか?
CTRL+Bで確認してみてください。
ちなみに私だったら、、、ブレークポイントを「すべて削除」して一から設定しなおします。
# 原因を調べるのが面倒なので。(^^;

古いスレッドには追加発言できません。