ビルド ⇒ デバッグの開始 ⇒ 実行
でデバッグをやっているのですが、
static float *ABC;
:::::::::::::::
ABC = (float *) malloc(10 * 256 * 50 * 30 * sizeof(float));
if (ABC == NULL)
{
printf(Memory Kakuho Dekizu! \n);
exit(10);
}
ABCOK:;
として、
無事ABCOKのラベルのところまで通り抜けて来たので
安心して、
ウオッチでABCと指定してメモリを見たところ、
何故かフロートで1つしか展開できていないのですが。
10*256*50*30個分の浮動小数点値が見れると思ったのですが、
何がおかしいのでしょうか?
逆に言うとそのようになっていないと先が進まないのですが。
ポインタで宣言しているのに配列のようにウォッチしたい、ということでしょうか。例え
ばクイックウォッチで「*(ABC+nn)」みたいにして評価することは出来ますか?
tibさん
ありがとうございます。
意図としてはその通りです。
今、わざと変数を
*(ABC+100) = 8.3;
というようなことをやって
本当に反映されているのか確かめてみました。
確かに反映されています。
確保されているということですね。
但し、メモリの一つ一つずつでは無くて、
ずらーっと、
*ABCから*(ABC+1000)まで1000個分
といったようにまとめて一気にメモリの中味を
覗くことは出来ないのでしょうか?
ちなみに今気付きましたが、
実際の計算上では
ABC[D] = 345;
という使い方をしていますが、
*(ABC+D) = 345;
という使い方をしないといけない
ということですね。
それで、
ABC[D]としても見えなかったのではないか、と。
C言語としては「ABC[D]」と「*(ABC+D)」は等価です。
同様に「&(ABC[D])」と「(ABC+D)」も等価です。
言語としては等価だがVC++のwatch機能としては違いがあるというだけ、と解釈するのが
自然ではないでしょうか。
ところで他の方からも指摘を受けているようですが、あなたが質問した(と思われる)ス
レッドのうち未解決のものがいくつかあるようですが、それらはどうなっていますか?
とりあえず,デバッガはABCの指す先がfloat型のオブジェクトなのか,
float型のオブジェクトの配列なのかはわかりません,というか知る術がありません。
なので,ABCの指す先にfloatが一つしかないように見えるのでしょう。
あまり,ウォッチを過信しないことです。
すみません。
さっそく済みのマーキングしておきます。
今、上記のものがイコールであるということを確認しました。
ただ、どうしてもひっかかることがあって、
ABC = (float *) malloc(10 * 256 * 50 * 30 * sizeof(float));
でメモリは確保されているようなのに、
あざ実地で使うとなると、
ABC[1012]まではメモリが見れているのに、
ABC[1013]より高いメモリにおいては、何故か
全ての領域、
ABC[1013] CXX0030: Error: 式を評価できません
ABC[385530] CXX0030: Error: 式を評価できません
というコーションがウオッチで出て来ます。
(1012までは、*(CepEachS+1012) -1.99840e+018
というように大丈夫なのに )
そういうことで計算がここでハンドルされていない例外は
TEST.exeにあります。 0xC0000005;ACCESS VIOLATION
というメッセージが出て止まるようなのです。
10 * 256 * 50 * 30で取ったのだし、
ここでメモリが確保出来なかったというエラーがMALLOC
でエラーが出ていないはずだから、
これら上から1013とか285530等のエリアは
十分読み書き出来ると思うのですが、
どうなのでしょうか?
困ってしまいました。
ABC = (float *) malloc(10 * 256 * 50 * 30 * sizeof(float));
を
int cnt;
cnt = 10 * 256 * 50 * 30 * sizeof(float);
ABC = (float *) malloc( cnt);
とするとうまく確保できました。
> さっそく済みのマーキングしておきます。
「どうやって解決したか」が抜けていますよ。
それ無しに「済」のマークだけつけても意味がありません。
でもって,_msizeを使って確保したメモリサイズを確かめてみてはどうでしょう。
おかしければ,HeapAllocなどに逃げる,という緊急手段があります。
追記
ABC = (float *) malloc(10 * 256 * 50 * 30 * sizeof(float));
の場合は、メモリの確保ができませんでした。
メモリウォッチで確認したら参照できませんでした。
??なぜかは、私も不明です。 明日また調べてみます。
何回もすみません、
自宅のWin98の環境では、
ABC = (float *) malloc(10 * 256 * 50 * 30 * sizeof(float));
とすると確保できず、
会社のWin2000では成功しました。???
ちなみにfree後のメモリ状態をWin98で見たら
cnt = 10 * 256 * 50 * 30 * sizeof(float);
ABC = (float *) malloc( cnt);
の場合ですがfree後も一部のエリアが参照できました。???
これって私の場合は、Win98の問題なんですかね。
詳しい方がいらっしゃったら私も知りたいです。
Win98のバグ???
mallocの引き数がsize_t(unsigned int)型だからうまくいっていないのでは?
ごめんなさい。↑
ちょっとボケてintを16bitで計算してました。
実際32bitなんで大丈夫でした。