スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

グローバル変数の続き~

では、今日は予定通りグローバル変数をどうやって使っていくのか
勉強していきたいと思います!
とりあえず例題でも・・・・

int g;

main()
{
g = 10;
func() ;
}

void func()
{
g = 20;
}


まずは1行目から。
このint g;
これがグローバル変数の宣言部分になるそうです。(わかるって・・・?><;

一番上にかかれてますねぇ?
うん。気づきやすい!

一般的に目立つように!と上部に書くことが多いんだって!(目立ちたがりですか。。
そして一番上!ということはもちろん関数の外部で宣言しているってことになりますねー。

こんな風に一番上に書いてあって、しかも!関数の外部に変数の宣言を書いているとなんかあれですね、
まるでその下に書いてある関数ならどこからでも使えるぜ!みたいな鼻息荒いセリフが聞こえてきそうですね~(ぇえ!?

でも実際にすべての関数から使用できるというのがグローバル変数らしいですよ!
ふむふむ。口だけじゃないってことか。。。

ん・・・・でもさ?グローバル変数がファイルのどこにある関数からもアクセスできるとしましょう!
じゃぁさ、そのファイル以外。いわゆるほかのファイルの関数からってどうなの?
すべての関数からアクセス可能さ!っていうくらいだからできるんだよね・・・?

しらべてきました。
ここに別のファイルで宣言されているグローバル変数にアクセスしようとしています。

void func2()
{
g = 30;
}


この結果が↓↓↓↓
コンパイルエラー(`Д´)
なんじゃそりゃーーー!!!
なんでだろう・・・・・・調べてきます。

(カッチコッチカッチコッチ・・・・・・・・・もうしばらくお待ちください)

なんと!
コンパイルしようとしたとき
コンパイラさんは(さん付け・・・?)プログラムのどっかに g というグローバル変数があるのなんてしらないよ!っていってるようです。
ぁあー。。。。なるほど?
そのファイルで宣言されてないと気づけない?
ってことでコンパイラさんにとってみたらそんな変数宣言されてないよーってことになるのかな?
ふむふむ。

おっと。でもこのファイルじゃないところで g っていうグローバル変数を宣言してあってそれにアクセスしますよー。っていうことをコンパイラさんに教えることで使えるようになるんだって!
じゃぁ教え方調べてきます。

extern int g;

void func2()
{
g = 30;
}


extern int g;この部分が他のファイルにグローバル変数が存在してますよーって教えてるんだって!
こうやってexternで教えてあげるとコンパイラさんは「なるほど。どっかにそういう変数があるんだね」
って思ってコンパイルしてくれるんだって~。
もちろんexternで教えてあげればコンパイルしてくれるけど本当にどこかにその変数がなきゃだめらしいです(当たり前だよね・・・
なかった場合は最終段階でそのグローバル変数を見つけられなくてリンクエラーになっちゃうらしいです。(リンクエラーってなんだろ;;

そして!グローバル変数の特徴は最初に0に初期化されているってことらしいです。
なんでかしら・・?
ローカル変数はプログラムが動いている間何度も作られのでそのとびに初期化なんてやってられない!時間の無駄じゃないか!ってことでやってないらしいんですよ。
でもグローバル変数はプログラムの最初から最後までいるわけで初期化されるのも一度きり!ってことで変数の内容を初期化しているんですねー。
もちろん0以外でもOKらしいですよ~
そんなときはグローバル変数を宣言するときついでに指定しちゃえばその値で初期化してくれるそうです。
int g;
だった宣言を
int g = 5;
とかにしたら5で初期化されるってわけですね!なるへそー。

はぁ。。グローバル変数の使い方おわりっ!!!
今日はつかれた><
また明日からも、、、、がんばるぞー('A`)おー。


おい!リンクエラーについてわからないままだろぉ!!!って声がどこからか聞こえてくる・・・
うぅ;;調べればいいんでしょう(´・ω・`)

リンクエラーって「ソースプログラムの文法がすべて合っているときだけ出るエラーです」って書いてありました。
なんじゃそりゃ?と(笑
どう読んでも日本語がおかしいです。。。
どういうことなのかしら!
つまりはプログラムって文法があっていれば作れるってものじゃないんだよ!ってことらしいです。

っていうことはどういう意味ですか?と思った私はさらに突っ込んで調べますよ。
例えば今回のグローバル変数の例ででたエラーみたいに
関数の呼び出しとかにつかってる文法はあってるのに呼んだ関数が実際にはどこにもなかった!とか。(そりゃエラーですって。。
たくさんのファイルをコンパイルしようとすると、そのコンパイルが全部無事に終わったらコンパイラさんはそのたくさんのプログラムをくっつけてひとつのプログラムにしようとするらしいです(つなげるからリンクってことか。
こんなときに関数が足りなかったりすると
くっつけれないよ!→リンクできないって!→リンクエラー
ってなるみたいです。

よし。。。。リンクエラーもわかったし今日は本当におわり!
もう勘弁してください><

たおれてきます('A`)
スポンサーサイト

グローバル変数

今日は変数の種類の続きからですー。
さて、2個目はなんていう名前の変数だったっけ(間があきすぎて忘れたなんて言えませn

そうそう、グローバル変数ですね!
グローバル変数ってなんでしょうか・・・
グローバルっていうと
なんていうんですかねぇ。大きく!とか壮大に!世界的な!みたいなイメージがあるんですが。。

実際この殺伐とした(久しぶりにいいましたね)プログラムの世界ではどんな意味を持つのでしょうか。

プログラムが始まったときから終わるまでずっと存在しているもの。
どの関数からもアクセスすることができる
ほかのグローバル変数との名前の重複はだめ。


こんなルール?意味?のようです。
前回のローカル変数にくらべると大きい。壮大。世界的な!そんなイメージで大まかには当たってる気がしなくもないですね!

プログラムってある程度大きいものになってくるとそのプログラムが今どういった状態なのかっていうのが大事になってくるそうです。
ふむふむ。確かに大きい仕事って進行状況やどこで時間ロスがあったのかなど色々しっておかなくちゃうまくことが進まなかったりしますよね~
こういうのってプログラムでも現実でもおなじなのかー。

つまり、動かすにあたって(プログラムを)どこででも必要な重要データってひとつや二つとはかぎらない!
いっぱいあったら呼び出すだけでややこしくてわからなくなっちゃうじゃない!
っていうことにならないように大事なことはグローバル変数として宣言しておくと
プログラムのあらゆるところからアクセスすることができる!ということみたいです。

なるほどー。世界的な変数!(規模がおおきいな)それがグローバル変数なのですね。

グローバル変数の詳しい書き方などは又後日にでも。。。
久しぶりにプログラムとにらめっこしたら頭から煙が・・・・・・・

今日はおわりっ!
明日もがんばるぞー('A`)おー。

最近

最近ゲーム製作の方にかかりっきりで
C言語の勉強が少しおろそかになっちゃったりしています><;

blogの更新まで滞っていました・・・面目ない。

気を取り直して・・・!
今日は変数の種類について少し。

まず、変数は3つに分けることができるそうです。
寿命や有効範囲を基準として
「ローカル変数」
「グローバル変数」
「スタティック変数」

この3つだそうです。
ふむふむ。。

では特長を詳しく見ていきたいと思います(*^▽^*)ノ

まずは
「ローカル変数」
これは一番よく使われる変数だそうです。
この変数の特徴は「我が命関数とともにあり」だそうです
なんじゃそりゃ?と思った方。わかりますw
私も最初この言葉を見てなんじゃそりゃ?と思いましたから!!!!

つまりは関数の中で宣言されることによって始まり関数が終わった瞬間に消えてなくなるそうです。
宣言された関数の中でのみ有効な変数ということですね。
このような特徴から
関数が2度目に呼ばれたときは変数の中に以前呼ばれたときの値は残っていないのです
2度目に呼ばれたときは以前の値は破棄されていて不定になっているというわけですね

残りの2種類はまた明日にでも・・・
きっと更新しますよ!

では、
明日もがんばるぞー('A`)おー。


ポインタ渡し

前回の続き。関数のポインタ渡しについてです。
間が開きすぎてもう前のわすれたYO!なんて言わないでください><

まずポインタ渡しってどんなときに使いたいの?
これは前回の最後にかきましたよね!
ほかの関数に変数の内容を変化させてほしい!」という場合に使えるのです。

では実際に見ていきましょう

void increment(int *p)
{
   (*p)++;
}

main()
{
   int unm;
   num = 10;
   increment(&num);

   printf("num=%d",num);
}

さてこの例題ですがまずは1行目から
void increment(int *p)
*をつけることで格納されている場所を渡すことができましたよね。
そして
   (*p)++;
ここで「場所」の中の値をインクリメントしています

このように実行するとnum=11と表示されます

indremenr()関数が呼ばれたとき内部ではどのようになっていたのか見ていきましょう
前回と違って今度はintの変数ではなくポインタ変数であるPがつくられました(つまりは変数の場所を格納する変数が作られたわけです)
そのPの中にmain()の中の変数numの場所がコピーされました
つまりは場所さえわかっていればアスタリスク『*』をつけることでそれを変数そのものとして扱うことができちゃうわけです。
ってことはですよ。ポインタ変数を渡せばどこからでも変数の場所がわかるのでそのものの値を読んだり書いたりできちゃうってことですね。
上記のことから
(*p)++;
と書くことでPの中身であるnumそのものに対して演算(++)を行っているわけです。

ということで、ほかの関数の中で変数の中身を書き換えたいときはポインタ変数にその変数の場所を格納して渡す!
これを覚えておきましょう><

さて、明日からも
がんばるぞー('A`)おー。

関数を作るときの注意

昨日関数の作り方を勉強しましたね?
その関数を作るときに注意しなきゃいけないことが一つあるそうです。

* 引数には 「変数そのもの」 ではなく 「変数に入っている値」 が渡るということです。

変数そのものじゃなくて値を渡してる・・・?いまいちピンときませんよね。

まずはこの文章の意味を理解するべく
「ある変数の値を1だけ増加してくれる」関数を作ることを例として考えていこうと思います。
この関数は1増加させるので 増分という意味の increment() というものを作ろうと思います。

使い方としてはそのままですね。変数の値を1増やす。というものです。
では見ていきましょう

a = 10;
increment(a);


このincrement()を作るときにまず最初に思いつくのが
次のようなプログラムではないでしょうか?(C言語に詳しくない人が)

void indrement(int a)
{
  a++;
}


なんだか合ってそうですよね?
ではコレを使用したプログラムで実験を行ってみましょう

void indrement(int a)
{
  a++;
}

main()  //メイン関数
{
  int num;

  num = 10;           //10を代入
  increment(num);       //ここでインクリメント関数を呼ぶ

  printf("num =%d",num)   //ここでnumを表示(11と表示されるはず)
}


結果は num=10 と表示されます。
予想では11になるはずだったのですがなぜでしょうか?変数numの内容は変わっていません。

これが引数には 「変数そのもの」 ではなく 「変数に入っている値」 が渡るということです。

main()メイン関数の中にnumという変数がありましたね。
そこでは10という値が代入されていました。

ここまでは大丈夫ですよね?

問題はここからですね。
関数increment()が呼ばれました。
その時にincrement()に渡された 変数num が increment()の中でそのまま使われるように思ってしまいますがそうではないのです

実はこのときincrement()関数の中では 変数num ではなく まったく違った新しい変数(例えば変数a)が作られているのです。(ぇえええ?
そしてその新しく作られたaに numの中に格納されていた値「10」が 代入 されていたのです。

プログラムをみるとmain()にあった変数numがincrement()にそのまま渡されているように思いますが実際にはaはincrement()の中に新しく変数が作られたものであってそこに「10」という値がコピーされているだけ。なのです。

なのでincrement()関数の中で a に対して演算をしてもmein()関数の中の 変数num には何の影響もないというわけです。


でも今回のincrement()関数のように「ほかの関数に変数の内容を変化させてほしい!」という場合だってあるはずですよね?

そういったときにはポインタ渡しといって「ポインタ変数」を使うみたいですよ!

詳しくはまた明日。
がんばるぞー('A`)おー。
プロフィール

しー

Author:しー
*使用ソフト*
メタセコ
Blender
modo

カレンダー
09 | 2017/10 | 11
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
WEB拍手
カテゴリ
最新コメント
検索フォーム
リンク
ブロとも申請フォーム

この人とブロともになる

いらっしゃいませ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。