• 締切済み

ウォッチの値とprintfの値が違う

main関数で構造体に値をセットしています。 構造体はA,B,Cとします。 ここでCをprintfすると"97979"と正しい値が表示されます。 次にV00関数をコールし、この構造体のポインタを渡します。 ここでprintfすると"-11111"と表示されます。 ウォッチでは"97979"が出ています。 "-11111"は、構造体の1つ前のBの値です。 プログラムは"-11111"と判断して処理が続行され 正常に流れません。 どうしたらよいのでしょうか?

みんなの回答

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.3

とりあえずソースコードですね。 (1)structを含んだ構造体の定義 (2)構造体に代入している部分 (3)V00を呼び出しているコード。 (4)VOOの入り口のコード。 (5)値をprintfしている部分。 は最低欲しいです。

taku_pon
質問者

お礼

コードの先頭に #pragma pack(4) と書いてあるせいでした。 お騒がせしました。

taku_pon
質問者

補足

(1)typedef struct Inprm{ char C00001[10]; char C00002[10] in_data_t C00003; } typedef struct InData { int iAAA; char cBBB[40]; double dCCC; }in_data_t; (2) p はCSVから取得した文字列のポインタ indtはin_data_tのポインタ   何番目の文字列かでcaseになっています。 int ibuffer; double dbuffer; case(1) ibuffer = atoi(p); indt->C00003.iAAA=ibuffer ; case(3) dbuffer = atof(p); indt->C00003.dCCC=dbuffer ; memcpy(indt->C00003.cBBB,"111111111111・・・ ",sizeof(indt->C00003.cBBB)) (3) VOO(indt) (4) int VOO(in_data_t *iprm) (5) VOOの開始直後に   printf("%d\n",iprm->C00003.iAAA); printf("%s\n",iprm->C00003.cBBB); printf("%f\n",iprm->C00003.dCCC); こんな感じです。 ちゃんと書くといろいろ問題になりそうなので 簡単に抜粋しました。

全文を見る
すると、全ての回答が全文表示されます。
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

リリースビルドでデバッグしてませんか? かならずデバッグビルドでウォッチしください。

taku_pon
質問者

補足

アクティブな構成の設定はDebugになっています。

全文を見る
すると、全ての回答が全文表示されます。
  • arain
  • ベストアンサー率27% (292/1049)
回答No.1

とりあえず、関係する箇所のソースを提示してください。 (変数・構造体の定義、関数の呼び出し方、ウォッチの場所とウォッチしている内容など)

taku_pon
質問者

補足

ありがとうございます。 もう少し分かったことがあります。 問題箇所の構造体は、 int iAAA; char cBBB[40]; double dCCC; となっています。 データはCSVファイルのため、読み取ったときはchar型になっています。 main関数で、iAAAに12を代入。iAAAはatoiで代入しています。 cBBBに"111111111111111111111111111111111111111 "を代入。 cBBBは定数のため、memcpyで代入しています。 dCCCに40527を代入しています。 dCCCはatofで代入しています。 これを関数に引き渡すと壊れてしまいます。 iAAAは12437040が表示されます。 cBBBは111111111111111111111111111111111111111 111が表示されます。 dCCCは0.000000が表示されます。 ウォッチでは正しい値が表示されます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • printfの有無で値が変化する

    int CYCL; int DCYCL=100; int ttime=2000; int t; main(){ while(CYCL<=DCYCL){ for(t=0;t<=ttime;t++){ .......................... if(CYCL==DCYCL){ ................. } if(CYCL==DCYCL){ ................. } ......................... } CYCL++; } } のようなプログラムを作っています。しかしなぜかttimeに-23878728というような よくわからない値が代入されているというエラーが起きていることに気づきました。 そこでprintfを用いて以下のようにエラー場所の探索を行いました。 main(){ while(CYCL<=DCYCL){ for(t=0;t<=ttime;t++){ .......................... printf("a ttime=%d\n",ttime); if(CYCL==DCYCL){ ................. printf("b ttime=%d\n",ttime); } if(CYCL==DCYCL){ printf("c ttime=%d\n",ttime); ................. printf("d ttime=%d\n",ttime); } ......................... } CYCL++; } } するとprintf("c DCYCL=%d\n",DCYCL);とprintf("d DCYCL=%d\n",DCYCL); の間のどこかにあることがわかりました。 出力結果は a ttime=2000 b ttime=2000 c ttime=3000 d ttime=-2382272 そこでprintf("a ttime=%d\n",ttime);をけしてプログラムをまわしたところ b ttime=2000 c ttime=-2382272 d ttime=-2382272 というふうにprintfをはさむことで値が変わってしまうようになってしまいました。 この問題はどうすれば解消できるのでしょうか? もとのプログラムを張りたいのですが、10000行近くあり、張ることが出来ません。 またttimeに値を代入するようなことは始めの宣言時以外一切やっていません。 どなたかご教授お願いいたします。

  • 値を変数に代入してprintfで表示しようとしてもうまくいきません

    値を変数に代入して、printfで表示しようとしてもうまくいきません。 ソースのどこが悪いか教えていただけないでしょうか? 変数の値を1個ずつ表示する場合は、正常になります。 問題は、1行で表示する場合に1個目の値は出るのですが正常な表示にはなりません。 //ソース開始 #include <stdio.h> #include <windows.h> int main() { LARGE_INTEGER i64,h64; LONGLONG work,h,m,s; QueryPerformanceCounter(&i64); QueryPerformanceFrequency(&h64); //起動時間をミリ秒取得 work = i64.QuadPart*1000 / h64.QuadPart; //時間をhに入れる h = work / 1000 / 3600; //分をmに入れる m = (work / 1000 - h * 3600) / 60; //秒をsに入れる s = work / 1000 - h * 3600 - m * 60; //表示 printf("%d時間%02d分%02d秒\n",h,m,s); printf("%d時間\n",h); printf("%d分\n",m); printf("%d秒\n",s); printf("%d秒\n",work); return 0; } //ソースここまで //実行結果 289時間00分55秒 289時間 55分 54秒 1043754590秒 続行するには何かキーを押してください . . . //理想の表示結果 1行目が以下のようになってほしい 289時間55分54秒

  • 配列

    適当な記述ですが、次を見てください。 void roll(int *c) { int n, b2[8]; if(t<3) { for(n=0; n<8; n++) b2[n]=c[n]; for(n=0; n<8; n++) c[b2[n]]=7-n; for(n=0; n<8; n++) printf("%d",c[n]); printf("\n"); t++; roll(c); } else t=0; } int main() { int b[]={3,6,4,0,7,2,5,1}; roll(b); for(n=0; n<8; n++) printf("%d",b[n]); //36407251が表示されるようにしたい。 return(0); } rollが何の関数かは省略しますが、rollにmainのb(ポインタ?)を渡し、ある処理をして,それでmainに戻ってきた時にb[]を表示すると、36407251が表示されません。 ポインタを引数にするってことはポインタでさしてるとこをrollで操作してるわけですよね? そうすれば変わって当然だとはおもいます。 でも関数1で関数2に配列1を渡し、その関数2の中でで配列1の値が変化しても、元の関数1にもどれば配列1のまま変化していないようにするにはどうすればいいですか? やはり もう1つ配列を用意しなきゃだめなのでしょうか。

  • printfの使い方

    #include <stdio.h> main() { printf("正しい?"); int a; int b; int c; printfをこのように使うと int がここでは 宣言できないとなってしまうのは何故ですか?

  • 構造体とポインタ

    演習問題を解いていて「構造体ポインタの指定の方法」で理解できない部分があったので、質問させていただきます。 その内容は、メイン関数で「scanf」で入力させた値を仮引数として計算する関数に送って計算し、メイン関数で表示処理を行うというものを、構造体とポインタを使って作るというものです。 とりあえずプログラムは以下のとおりになりました。 (字下げしたものが、下部のURL先にあります) #include <stdio.h> /***構造体***/ struct test{ int a; int b; }syoki[2] = { {0,0}, {0,0} }; /***値をプラスする関数***/ void kansu(struct test *no){ no->a++; no->b++; } /***メイン関数***/ void main(){ int nomber; //無限ループ for(;;){ printf("値を追加する番号を指定してください\n"); printf("(入力する値は、0か1)→"); scanf("%d", &nomber); //関数を呼び出す kansu(&nomber); //画面表示 printf("入力番号: %d\n",syoki); printf("値1: %d\n",syoki->a); printf("値2: %d\n",syoki->b); } } VisualStudio.NETのエラー内容では 「'int *__w64 ' から 'test *' に変換できません」 と表記されています。おそらくメイン関数で指定した「nomber」がint型では駄目だというのはわかるのですが、それでは他に何を指定すればいいのかわからないのです。 もしよければ、アドバイスをいただけると嬉しいです。 よろしくお願いします。

  • printf()関数の括弧を二重にして、printf((~~~))とし

    printf()関数の括弧を二重にして、printf((~~~))として コンパイル/実行すると、実行時セグメンテーション違反が発生します。 コンパイル時には警告も発生しますが、このセグメンテーション違反が なぜ起こるのか理由がよくわかりません。ご回答いただけるとありがたいです。 以下、サンプルコードと実行例です。よろしくお願いいたします。 ---mytest.c---- 1 #include <stdio.h> 2 3 int main(void){ 4 5 //printf("test:%d", 1)ではもちろんコンパイル/実行に成功する。 6 printf(("test:%d", 1)); 7 return 0; 8 } 【コンパイル/実行結果/gccバージョン】 #gcc main.c main.c:6:警告:passing argument 1 of printf makes pointer from integer without a cast #./a.out セグメンテーション違反です # gcc --version gcc (GCC) 4.1.2 20070925 (Red Hat 4.1.2-27) ・ ・

  • printf() だけで文字列を表示できる??

    1: int printf(char *, ...); 2: main() 3: { 4: printf("Hello, world.\n"); 5: } C で書かれた上のプログラムが正常にコンパイルでき、しかもHello, world. と表示することが理解できません。どなたか教えていただけないでしょうか。 1行目でprintf のプロトタイプ宣言を書き、その実体は書いていません。これをコンパイルしたとき、「printf() は知らない」と言われると思いましたが、そうはならず、Hello, world. を表示しました。 また、1行目の関数宣言の引数を変更すると、「ビルトイン関数と型が一致しない」と言われます。その「ビルトイン関数」というのは文字通りビルトインされていて任意に使用できるようになっているのでしょうか。 コンパイラはgcc version 3.4.4 です。

  • 構造体の自作関数内で入力した値の返し方

    こんばんはm(_ _)m C言語の構造体に関する質問です。 (当方初心者なので用語等見苦しい点があると思いますがご了承&指摘をお願いします。) 日付を元号に直したりする構造体のプログラムでmain関数ではなく自作関数内で値を入力する問題を解いていまして… #include<stdio.h> typedef struct{ int year; int month; int day; }date; date put_date(date x) /*ここで日付を入力*/ { date x;       printf("年:"); scanf("%d",x.year); printf("月:″); scanf("%d",x.month); printf("日:"); scanf("%d",x.day); return x; } int main(void) { date x; x.year=0; /*問題では関数外で宣言した変数では足りないため         に他の自作関数で変数を使いまわすために必要な処         理で初期化しました。*/ put_date(x);     gen(x); /*西暦の日付を元号で表す自作関数でここへput_date        で取得したx,y,zを送りたいのですがmainに来た時点        でput_dataで入力した値が出ませんでした。(元号に        直す関数は省略いたしました)*/ } put_date内でprintfしましたところx,y,zの値が入力した通りに出ましたが、main内ではx.year=0,x.month=12,x.day=0という値になってしまいます。 put_dateで入力した値をmain関数内だけでなく他の自作関数内でも使用したいのですがどうすればよろしいでしょうか?

  • 構造体ポインタで構造体全体を参照 [C言語]

    構造体へのポインタで参照先の構造体全体を参照するには *構造体ポインタ名 でいいでしょうか?これで構造体同士の値のコピーはできるみたいなのですが、printfで*構造体名を表示すると参照先の構造体と値が違ってきてしまいます。 printf("*pkou=%d,kou=%d",*pkou,kou); //pkouは構造体kouへのポインタ 《結果》 *pkou=-23135123,kou=1257234 (値は適当ですがこんな感じです) 友人へ「"*構造体ポインタ名"とすると参照先の構造体全体を表している」と言ってしまっていいでしょうか。回答よろしくお願いします。

  • printf("%lf",5/3); は 0.000000 ?

    Cを勉強中です。 main(){ printf("%lf",5/3); } をBorland C++ 5.5.1コンパイラで コンパイルして実行すると、 0.000000 と表示されてしまいます 1.666666 と表示するには、何が足りないのでしょうか。

このQ&Aのポイント
  • WiFiをソフトバンクairから@Niftyに変更後、プリンターをWiFiに接続までは確認できたが、パソコンからプリンターが見つかりません。何が問題でしょうか?
  • Windows10を使用しているパソコンに無線LANで接続されたブラザー製のMFC-L8610CDWプリンターがパソコンから見つからない問題について相談です。
  • プリンターのネットワーク設定を変更した際に、パソコンからプリンターが見つからないというトラブルが発生しています。ご対応方法を教えてください。
回答を見る