アプリ版:「スタンプのみでお礼する」機能のリリースについて

昨日書いたコードを今日ビルドして実行したところ、
以下のように初期化した配列に値が代入されなくなりました。
どうも初期化前に戻っているような感じです。

y = 0;
x = 6;
int point_y[20] = { 0 };
int point_x[20] = { 0 };
c = 0;
point_y[c] = y;
point_x[c] = x;
c = c + 1;

この時点で
point_y[0] には0, point_x[0]には6が入ってほしいのですが
point_y[c]にカーソルを当てて中身を見ると
point_y[0] = 11372064;
point_y[1] = 1742984488;
といった具体です。point_x[c]の中身も同じような感じです。

何が原因か悩んでいます。
もしアドバイスいただけると助かります。
どうぞよろしくお願い致します。

A 回答 (9件)

NO6 です。



失礼しました。

原因は、リリースモードでビルドしたものを
デバッグしていたからでした。

デバッグモードでビルドしたものを
デバッグしたら、きれいに表示されました。

間違った情報で、混乱させました。

ごめんなさい。
    • good
    • 0

VC++の場合ですが、releaseモードの場合、変な値が表示されることはあったと思います。


いずれにせよ、printfで正しく表示されるのであれば、実行結果としては正しいわけで、問題ではありません。

なぜこうなるのか、ということがどうしても気になるのであれば、アセンブリ出力を追ってみるとわかるのではないかと思います。
    • good
    • 0

既に指摘されていいますが…



「この時点」というのはどこまで実行した状態です?
少なくとも、
c = 0;
が実行されていない状態で
point_y[c]やpoint_x[c]を参照した場合、内容は保証されませんよ?

cに入っている値が-78とかなら、
point_y[c]はpoint_y[-78]を参照しますし、
point_x[c]はpoint_x[-78]を参照します。

で、環境って結局なんなんでしょう???


>以下のようなコードを書いて、
>デバッガーで
>b64out
>をチェックすると、先頭部分が
>フフフ。。。
>となっていて、変換に失敗しているのかなと思いましたが、

どの時点で確認したのでしょう?
VSでデバッグ構成でビルドすると未初期化のローカル変数は0xCC(デバッガで見ると半角のフに見える)で埋められていたかと記憶していますが。
https://www.ipa.go.jp/security/awareness/vendor/ …
の「(4) /RTCs [Visual Studio 2005, Windows]」にもちょこっと書かれていますけど。

掲示されたコードだとおそらく
base64_encode(p, (p+num), (char *)b64out);
から戻って来るまでは値は不定(未初期化:デバッグ構成だと0xCCで埋まっていますし、リリース構成だと本当の意味で不定)になっているかと思われますが…。


VSのデバッグで(ウォッチの)値が変になる…という現象に出くわしたことはないですね。
# 自分が組み込んだ不具合以外では。
現状、仕事で使用しているHEWの方がブレークポイントで止めた時に表示される値がおかしい…ということはありますが。
スコープ内のハズなのにそんな変数は無い。とか言われたり。
# たぶん使い方とかの問題だと思いますけど…(最適化掛かっていたりするのもあるやも知れん)
    • good
    • 0

私は、とても優れたコンパイラ VS2005 を使っています。


(高いお金を払って買ったものです。)

以下のようなコードを書いて、
デバッガーで
b64out
をチェックすると、先頭部分が
フフフ。。。
となっていて、変換に失敗しているのかなと思いましたが、
さらに、このデータを使って次の操作をすると、
正確に変換されていたことが確認できました。

もしかしたら、MSのコンパイラを使っていませんか?
そうなら、あきらめましょう。
MSには勝てませんから。

int num, i;
char b64out[512];
char plain[256];
sprintf_s(plain, sizeof(plain), "%s\t%s\t%s", oc_Sender, oc_Sender, oc_POP3password);
num = (int)strlen(plain);
char* p = plain;
for (i = 0; i<num; i++)
if (p[i] == _T('\t'))
p[i] = 0;
base64_encode(p, (p+num), (char *)b64out);

でも、最近は無料になったから、許してやることにします。
    • good
    • 0

> printfで出力したところ、正常に値が入っていることを確認できました。


> ただ、デバックしてカーソルを当てるとやはり8桁や10桁の乱数?が入っているので

ということなら、デバッガーの使い方を間違えていませんか?
ちゃんと目的の位置
> point_y[c] = y;
> point_x[c] = x;
> c = c + 1;
まで実行した*後*に中身を見ていますか?

それから、intの配列を0で初期化するのは、C言語では
> int point_y[20] = { 0 };
> int point_x[20] = { 0 };
で全く問題ありません。
C++言語なら
int point_y[20] = {};
int point_x[20] = {};
でも良いです。
    • good
    • 0

Tacosanさんの言うとおり、int point_y[20] = { 0 }; で全て 0 で初期化されるはず。

わざわざ 0 を20個並べる必要はありません。
    • good
    • 0

ああ, #2 は自分で矛盾したこと書いてるな.



int point_y[20] = { 0 };
で point_y の全要素を 0 で初期化してるから, ここを通っていればどの要素も 0 じゃないとおかしい.

ということで, あとはあなたがどのような操作をしたかによる. つまり
「point_y[c]にカーソルを当てて中身を見る」
までの具体的な操作を全部書いてもらわないとどうにもならない.

書いてもらったらどうにかなるかといわれると, それは困るところだ.
    • good
    • 0

とりあえず


point_y[1]
がおかしいのは「おかしいのが当然」だな. それ以上は具体的な情報がないとどうにもならん. 例えば, 最低限
・実際に実行できる完全なプログラム
・動かした環境
がないと答えようがない.

ちなみにだが, 配列の初期化では「不足する要素は 0 で初期化」なので
int point_y[20] = { 0 };
は「point_y の全ての要素を 0 にする」という効果を持つぞ>#1.
    • good
    • 0

見たところおかしいところはありません。



一応、念のためですが、
x,y ともに intですね?
int point_y[20] = { 0 }; は、point_y[0] のみ初期化する意図ですね?0~19すべて初期化するのであれば、
{0,0,0, … } と0を20個書いてください。

ところで、”この時点”というのがどの時点か分かりませんが、恐らくなんらかのデバッガだと思いますが、

ステップ実行で見るなら、
c=c+1;
まで実行させてから変数の内容を確認してみてください。

もっと確実なのは、printf()文を入れて出力させる方法です。
    • good
    • 0
この回答へのお礼

ありがとうございました。
配列を20個ぶんゼロで初期化し、
printfで出力したところ、正常に値が入っていることを確認できました。
ただ、デバックしてカーソルを当てるとやはり8桁や10桁の乱数?が入っているので
とても不思議です。

お礼日時:2015/01/24 23:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!