昨日書いたコードを今日ビルドして実行したところ、
以下のように初期化した配列に値が代入されなくなりました。
どうも初期化前に戻っているような感じです。
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件)
- 最新から表示
- 回答順に表示
No.9
- 回答日時:
NO6 です。
失礼しました。
原因は、リリースモードでビルドしたものを
デバッグしていたからでした。
デバッグモードでビルドしたものを
デバッグしたら、きれいに表示されました。
間違った情報で、混乱させました。
ごめんなさい。
No.8
- 回答日時:
VC++の場合ですが、releaseモードの場合、変な値が表示されることはあったと思います。
いずれにせよ、printfで正しく表示されるのであれば、実行結果としては正しいわけで、問題ではありません。
なぜこうなるのか、ということがどうしても気になるのであれば、アセンブリ出力を追ってみるとわかるのではないかと思います。
No.7
- 回答日時:
既に指摘されていいますが…
「この時点」というのはどこまで実行した状態です?
少なくとも、
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の方がブレークポイントで止めた時に表示される値がおかしい…ということはありますが。
スコープ内のハズなのにそんな変数は無い。とか言われたり。
# たぶん使い方とかの問題だと思いますけど…(最適化掛かっていたりするのもあるやも知れん)
No.6
- 回答日時:
私は、とても優れたコンパイラ 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);
でも、最近は無料になったから、許してやることにします。
No.5
- 回答日時:
> 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] = {};
でも良いです。
No.4
- 回答日時:
Tacosanさんの言うとおり、int point_y[20] = { 0 }; で全て 0 で初期化されるはず。
わざわざ 0 を20個並べる必要はありません。No.3
- 回答日時:
ああ, #2 は自分で矛盾したこと書いてるな.
int point_y[20] = { 0 };
で point_y の全要素を 0 で初期化してるから, ここを通っていればどの要素も 0 じゃないとおかしい.
ということで, あとはあなたがどのような操作をしたかによる. つまり
「point_y[c]にカーソルを当てて中身を見る」
までの具体的な操作を全部書いてもらわないとどうにもならない.
書いてもらったらどうにかなるかといわれると, それは困るところだ.
No.2
- 回答日時:
とりあえず
point_y[1]
がおかしいのは「おかしいのが当然」だな. それ以上は具体的な情報がないとどうにもならん. 例えば, 最低限
・実際に実行できる完全なプログラム
・動かした環境
がないと答えようがない.
ちなみにだが, 配列の初期化では「不足する要素は 0 で初期化」なので
int point_y[20] = { 0 };
は「point_y の全ての要素を 0 にする」という効果を持つぞ>#1.
No.1
- 回答日時:
見たところおかしいところはありません。
一応、念のためですが、
x,y ともに intですね?
int point_y[20] = { 0 }; は、point_y[0] のみ初期化する意図ですね?0~19すべて初期化するのであれば、
{0,0,0, … } と0を20個書いてください。
ところで、”この時点”というのがどの時点か分かりませんが、恐らくなんらかのデバッガだと思いますが、
ステップ実行で見るなら、
c=c+1;
まで実行させてから変数の内容を確認してみてください。
もっと確実なのは、printf()文を入れて出力させる方法です。
ありがとうございました。
配列を20個ぶんゼロで初期化し、
printfで出力したところ、正常に値が入っていることを確認できました。
ただ、デバックしてカーソルを当てるとやはり8桁や10桁の乱数?が入っているので
とても不思議です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 引数 戻り値のあるメソッド 3 2023/02/12 06:23
- 英語 "by a ~ 0.5 percentage point"が単数となる理由等について 2 2023/05/11 10:41
- ポイントサービス・マイル docomoポイントについてです。 今まで9000pointあったのが いきなり120pointにな 6 2022/07/01 10:59
- スーパー・コンビニ イオンカードで、レジでWAON POINTを使って支払いたい時、電子マネーWAONカードのように機械 1 2023/03/12 05:44
- C言語・C++・C# 未解決の外部シンボル _printfが関数_mainで参照されました 1 2022/09/18 15:28
- ポイントサービス・マイル マイナンバーPOINTについて 1 2022/12/24 08:20
- Excel(エクセル) RANK.EQとCOUNTIFSの組み合わせで同ポイントの場合、違う条件を加えて順位を付けたい。 1 2022/08/30 19:49
- ポイントサービス・マイル WAON POINTと、WAONポイントは、違うのですか。 2 2023/07/07 20:50
- 英語 英語の関係代名詞の問題について Monday is the day ( ) we feel blue 1 2022/06/25 21:00
- 電子マネー・電子決済 イオン系の、WAON POINTカード(赤色のカード)のWAON POINT残高は、 電子マネーWA 1 2023/07/31 18:41
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複数桁10進数の*桁目だけを抽出...
-
「指定されたキャストは有効で...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語での奇数の和
-
C言語での引数の省略方法
-
【C++】関数ポインタの使い方
-
足して100になるような乱数のア...
-
C言語
-
C言語 エラーの原因がわからな...
-
比較回数と交換回数表示について
-
数字列を3桁ごとにカンマで区切...
-
C言語のサイコロシミュレート
-
acceptをalarmでタイムアウトさ...
-
「{ } で囲むだけ」は正しい?
-
銀行のATMを想定したプログラム
-
未解決の外部シンボル _printf...
-
if と配列の組み合わせ
-
ラップ関数とはどんなものですか?
-
signal関数の使い方
-
インライン展開されているか確...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
「指定されたキャストは有効で...
-
C言語 配列と関数の練習問題
-
複数桁10進数の*桁目だけを抽出...
-
(int *)の意味
-
if と配列の組み合わせ
-
ラップ関数とはどんなものですか?
-
卒業研究でよく分からないとこ...
-
【C++】関数ポインタの使い方
-
c言語
-
足して100になるような乱数のア...
-
C言語初心者です、、、お助けく...
-
数字列を3桁ごとにカンマで区切...
-
C言語 エラーの原因がわからな...
-
実数の整数部,小数部の取得
-
課題でつまってます・・・
-
商と剰余を同時に求める(C言語)
-
C言語の配列をC++のvectorに高...
-
std::set<int> で、ある値が何...
おすすめ情報