ショッピングモール  掲示板ランキング


【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板1こちら


管理者用メニュー    ツリーに戻る    ホームページ    使用可能タグ一覧

No.2644

変数の制御の仕方を教えてください。
投稿者---masher(2004/09/07 15:11:50)


以下のようなプログラムを組んでみたのですが、n=0にしていないにもかかわらず、n++によってnが10になり、

  if (n==10){n=0; printf("0:continue else:end");scanf("%d",&m);}

の{ }の部分が実行されてしまいます。ところが、
  
   /*printf("nは%dです。\n",n);*/
  
の一行を生かすと今度は先の{ }の部分が実行されなくなります。
これは一体どういうことなのでしょうか?
コンパイラはboland c++,WindowsはXPです。 
宜しくお願いします。(質問の仕方、ソースの張り方がいまだまずいかもしれませんが、これがせいいっぱいです。)

#include <stdio.h>
#include <stdlib.h>

int main(void){
    int a,i,n,m;
    m=0;
    printf("*");
    for (i=0;i<1000;i++){
        a=rand() % 100;
        /*printf("nは%dです。\n",n);*/ 
        if (a>66) {printf("*\n");n++;}
        if (a<=66) {printf("*");}
        if (n==10){n=0; printf("0:continue   else:end");scanf("%d",&m);} 
        if (m!=0) break;
    }   
return 0;
}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:変数の制御の仕方を教えてください。 2645 ホワイト 2004/09/07 15:59:09
<子記事> Re:変数の制御の仕方を教えてください。 2646 Sciggepy 2004/09/07 15:59:49


No.2645

Re:変数の制御の仕方を教えてください。
投稿者---ホワイト(2004/09/07 15:59:09)


nは何のためにあるのでしょうか?


この投稿にコメントする

削除パスワード

No.2648

Re:変数の制御の仕方を教えてください。
投稿者---masher(2004/09/07 16:55:38)


>nは何のためにあるのでしょうか?
nはa>66の連続が途切れた時にゼロにセットするものです。



この投稿にコメントする

削除パスワード

No.2646

Re:変数の制御の仕方を教えてください。
投稿者---Sciggepy(2004/09/07 15:59:49)


nが値を入れられる前に使われているので、動作は未定義です。
nが使われる前に、値を入れてください。



この投稿にコメントする

削除パスワード

No.2647

Re:変数の制御の仕方を教えてください。
投稿者---ホワイト(2004/09/07 16:05:27)


こういうこと?

#include <stdio.h>
#include <stdlib.h>

int main(void){
    int a,i,m,n=0;
    m=0;
    printf("*");
    for (i=0;i<1000;i++){
        a=rand() % 100;
        /*printf("nは%dです。\n",n);*/ 
        if (a>66) {
        printf("*\n");n++;
    }
        else{
        printf("*");
    }
        if (n==10){
        n=0;
        printf("0:continue   else:end");
        scanf("%d",&m);
    } 
        if (m!=0){
         break;
    }
    }   
return 0;
}



この投稿にコメントする

削除パスワード

No.2649

Re:変数の制御の仕方を教えてください。
投稿者---masher(2004/09/07 16:58:13)


ということなのですが、私の書いたソースでは(誤って)変数の宣言後にnに0は代入されていません。それでも、正常に?動いてしまったことを問題にしています。


この投稿にコメントする

削除パスワード

No.2650

Re:変数の制御の仕方を教えてください。
投稿者---ぽけらっと(2004/09/07 17:07:08)


スタック変数のnがたまたま0だったのでは?
初期化するのが基本ですけどね・・・



この投稿にコメントする

削除パスワード

No.2651

Re:変数の制御の仕方を教えてください。
投稿者---ホワイト(2004/09/07 17:27:12)


>スタック変数のnがたまたま0だったのでは?
>初期化するのが基本ですけどね・・・

なるほどやっと質問の意味が理解できました。
で・・上のとおりだと思います。


この投稿にコメントする

削除パスワード

No.2654

Re:変数の制御の仕方を教えてください。
投稿者---masher(2004/09/07 18:00:35)


>>スタック変数のnがたまたま0だったのでは?
>>初期化するのが基本ですけどね・・・
>
>なるほどやっと質問の意味が理解できました。
>で・・上のとおりだと思います。
すみません、分かりづらくて。気をつけます。


この投稿にコメントする

削除パスワード

No.2653

Re:変数の制御の仕方を教えてください。
投稿者---masher(2004/09/07 17:59:54)


>スタック変数のnがたまたま0だったのでは?
>初期化するのが基本ですけどね・・・
ご回答ありがとうございます。自分でも「たまたま0だった」のではと思いまして、nの値を確かめるべくprintf("nの値は\n",n);を書き加えてみたのですが、今度はnの値は23845674(←今出先ですので値そのものは不正確です)となり、従って、n==10の条件も満たさなくなってしまったのです。
(単なる)変数とスタック変数は違うと言うことなのでしょうか?



この投稿にコメントする

削除パスワード

No.2652

Re:変数の制御の仕方を教えてください。
投稿者---Sciggepy(2004/09/07 17:34:43)


-Sオプションを指定し、ASMで出力

printf("nは%dです。\n",n);をコメントアウトしてコンパイル
; EDI = n(この部分はコメントです。)

コメントアウトを外してコンパイル
; EBX = n    //nに対応するレジスタが変わっている
nに対応するレジスタは、最初から最後まで同じだったので、レジスタが変わったことが原因のようです。



この投稿にコメントする

削除パスワード

No.2655

Re:変数の制御の仕方を教えてください。
投稿者---masher(2004/09/07 18:02:29)


> nに対応するレジスタは、最初から最後まで同じだったので、レジスタが変わったことが原因のようです。

回答ありがとうございます。レジスタが同じだった・変わったとは具体的にどのようなことなのでしょうか?




この投稿にコメントする

削除パスワード

No.2656

Re:変数の制御の仕方を教えてください。
投稿者---Sciggepy(2004/09/07 18:46:09)


変数は、宣言によって、どこに値が格納されるかが決まります。
関数内部で何もつけず(または、autoをつけて)宣言した変数は、自動変数といい、動的にメモリ(スタック領域)を使います。
それとは別に、staticやexternをつけて宣言した変数は、プログラムが終了するまで、同じメモリ領域を使います。
しかし、それらの値を使うには、プロセッサに値を入れる必要があります。そして、その入れ物がレジスタ(記憶用の素子?)です。
レジスタの数は少ないので、必要な値をレジスタに割り当て、必要なくなったら別の値を入れられるようにする必要があり、それらの作業はコンパイラが行います。(最近のコンパイラでは、使用頻度の高い変数は、スタックに入れずに特定のレジスタを使い続けるようにする機能もあります。)ソース中で変数名が同じでも、使用頻度や位置によって、割り当てられるレジスタは変化することが多いです。事実、最初のプログラムでも、コメントアウトを外したかどうかで使用されるレジスタが変化しています。これは処理系依存なので、他のコンパイラでどうなるかは不明です。場合によっては、値ならざるものが入っていることもあるので、未定義の自動変数の値を使用するのは危険です。



この投稿にコメントする

削除パスワード

No.2657

Re:変数の制御の仕方を教えてください。
投稿者---masher(2004/09/07 19:05:48)


>変数は、宣言によって、どこに値が格納されるかが決まります。...omission...未定義の自動変数の値を使用するのは危険です。

詳しい解説、大変ありがとうございます。おかげさまで良く理解することが出来ました。変数一つとっても深いのですね。助かりました。




この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    ホームページ    レンタル掲示板サービス




掲示板提供:Real Integrity