ページ 1 / 1
関数について
Posted: 2011年12月22日(木) 15:17
by canopus
以前関数について質問したものです。
http://dixq.net/forum/viewtopic.php?t=9756&p=78721
soft屋さんから教えていただいたwebページで関数を試したんですがどうもうまくいきませんでした。
コード:
#include "DxLib.h"
int Key[256]; // キーが押されているフレーム数を格納する
// キーの入力状態を更新する
int gpUpdateKey(){
char tmpKey[256]; // 現在のキーの入力状態を格納する
GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る
for( int i=0; i<256; i++ ){
if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら
Key[i]++; // 加算
} else { // 押されていなければ
Key[i] = 0; // 0にする
}
}
return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
MessageBox(NULL,_T("test"),_T("winapp"),MB_OK);
SetWindowText("円高ゲーム");
int now = 200;
float gravity = 0.15f;
float engine = -0.30f;
float speed = 0;
int hitachi;
hitachi = LoadGraph("media/pic/hitachi05.png");
while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey()==0 ){
float raccel = 0;
DrawGraph(320,now,hitachi,TRUE);
if( Key[ KEY_INPUT_SPACE ] > 0 ){
// スペースキーが押された瞬間だけ処理ではなく押されている間中処理
raccel = engine;
}
//Key[ KEY_INPUT_SPACE ] = Key[ KEY_INPUT_SPACE ]%1;
speed +=raccel + gravity;//重力おまけ付なし
now += (int)speed;//
}
DxLib_End() ;
return 0;
}
このプログラムで関数を作れたらいいのですがどなたかこのコードで関数を試しに作ってはくれないでしょうか?(本当はもっと長いですが単純に短くコードを変更しています)
Re: 関数について
Posted: 2011年12月22日(木) 15:43
by softya(ソフト屋)
関数がどういうものか理解できていないとコードを書いても意味が無いと思いますし、gpUpdateKey()自体が関数なのですがこれ自体の機能は理解できていますか?
それとインデント(字下げ)がちゃんとしていないのはバグの元ですので是非勉強なさって下さい。 → 前にも書いてますね。
参考。チェック3 に書かれています。
「
投稿前チェックリスト(beatleさん作成)」
【追記】
まず、何処をどの様に関数化するかコンセプトと言うか明確な意図が欲しいです。
何処をどの様に関数化したいのでしょうか?文章で詳細に書いてみてください。
Re: 関数について
Posted: 2011年12月22日(木) 15:47
by 沖 滉均
canopus さんが書きました:関数を試したんですがどうもうまくいきませんでした
何をどのように試した結果、どのようにうまくいかないのでしょうか?
そもそも、canopusさんがおっしゃる関数とは何でしょう?
質問に書かれている内容ではさっぱりわかりません。
フォーラムルールを確認のうえ具体的に質問していただけませんか?
Re: 関数について
Posted: 2011年12月22日(木) 17:10
by canopus
soft屋さん沖 滉均さん返信ありがとうございます。
いつもsoft屋さんお世話になってますm(_ _)m
そうですね。
41行目の DrawGraph(320,now,hitachi,TRUE);
を関数で飛ばしてみたいのです。
>関数がどういうものか理解できていないとコードを書いても意味が無いと思いますし、gpUpdateKey()自体が関数なのですがこれ自体の機能は理解できていますか?
それとインデント(字下げ)がちゃんとしていないのはバグの元ですので是非勉強なさって下さい。 → 前にも書いてますね。
いまいちよくわかってないです。
あ、字下げはあれですね、同じ位置にしろということですかなるほど。
次からUPさせていただくときには気をつけておきます。
具体的というのは、
ある処理を一箇所においておいて、それをいろんなところから借りて使っていくような関数。
そして、別のプログラムとしてコード自体が違うファイルとしてある関数。
などこういう感じでよろしいでしょうか?
Re: 関数について
Posted: 2011年12月22日(木) 17:18
by softya(ソフト屋)
関数を作るには内部である程度まとまった処理とinputとoutputを決めなくてはいけません。
引数と戻り値も含めた関数に受け渡す値受け取る値、そして受け渡し方や受け取り方です。
そこをちゃんと設計しないと意味のあるものが出来ません。
DrawGraph(320,now,hitachi,TRUE);
を別関数にすると言っても、このままだとDrawGraph()と同じ引数を持つ別の名前の関数が出来るだけです。
コード:
int DrawGraphWoSurukansuu( int x, int y, int GrHandle, int TransFlag )
{
DrawGraph(x,y,GrHandle,TransFlag);
}
//呼び出し
DrawGraphWoSurukansuu(320,now,hitachi,TRUE);
これじゃ意味無いですよね?
Re: 関数について
Posted: 2011年12月22日(木) 17:25
by non
canopus さんが書きました:
41行目の DrawGraph(320,now,hitachi,TRUE);
を関数で飛ばしてみたいのです。
私が想像するに、hitachiで描いている画像を、スクリーン上で飛ばしたいのではないでしょうか?
(この行の実行を飛ばしたいのではなく)
現在のプログラムは、重力落下する画像を、スペースを押している間、上に上げる(逆噴射みたいに)
プログラムのようですから。
Re: 関数について
Posted: 2011年12月22日(木) 18:13
by canopus
なるほど。そういうかんじになるんですね。
>DrawGraph(320,now,hitachi,TRUE);
を別関数にすると言っても、このままだとDrawGraph()と同じ引数を持つ別の名前の関数が出来るだけです。
これじゃ意味無いですよね?
そうまったくそのとおりですが、コードが長いのでとりあえずここだけでも飛ばせればあとは真似て作れるかと思ってのことであえて、意味のないコードを作っていただきました。
冗長で長いコードそのものならば、意味のある関数が作れるコードとなっているのですが、そんな長いコードを簡略化するのも手間だし、(これでもかなり手間でしたが…)そのものをUPするわけにもいかず、・・・・また簡略化できしだい意味のある関数ができるようなコードにしておきます。(何ヶ月も先になりそうですが…)
nonさん返信ありがとうございます。
いや、違うんです。わかりづらくて申し訳ない…
実は情報技術者試験問題で20年秋の問題でして
問39
プログラム言語における関数呼出し時の引数の性質のうち,適切なものはどれか。
ア 値呼出しでは,仮引数の値を変えると実引数の値も変わる。
イ 実引数から仮引数に情報を渡す方法として,値呼出し,参照呼出しなどがある。
ウ 実引数は変数だけであるが,仮引数は変数でも定数でもよい。
エ 実引数は呼び出される関数の中だけで有効であるが,仮引数は関数の呼出し側でも有効である。
という問があるんですがこれを理解するためにCの世界に入ってきました。これを理解できればいいのですが・・・・
Re: 関数について
Posted: 2011年12月22日(木) 18:27
by softya(ソフト屋)
canopus さんが書きました:ア 値呼出しでは,仮引数の値を変えると実引数の値も変わる。
イ 実引数から仮引数に情報を渡す方法として,値呼出し,参照呼出しなどがある。
ウ 実引数は変数だけであるが,仮引数は変数でも定数でもよい。
エ 実引数は呼び出される関数の中だけで有効であるが,仮引数は関数の呼出し側でも有効である。
これなら、C言語のちゃんとして入門書を読むことと、DXライブラリもいらないので簡単なC言語でアイウエに即した関数パターンのプログラムを組んでみれば検証できると思います。
Re: 関数について
Posted: 2011年12月22日(木) 18:50
by non
全くの見当違いでしたか?想像力が落ちてるな・・・
ア 値呼出しでは,仮引数の値を変えると実引数の値も変わる。
これの検証プログラム。
コード:
#include <stdio.h>
void swap(int x,int y)
{
int temp;
printf("x=%d y=%d\n",x,y);
temp=x;
x=y;
y=temp;
printf("x=%d y=%d\n",x,y);
}
int main(void)
{
int a=5,b=8;
printf("a=%d b=%d\n",a,b);
swap(a,b);
printf("a=%d b=%d\n",a,b);
return 0;
}
Re: 関数について
Posted: 2011年12月22日(木) 19:20
by canopus
入門書はないことはないですが、読むのが億劫なので楽しくついでに覚えちゃおうとDXライブラリを始めてみました。DXLibをやっていると自然にCも分かってくるだろうと思っているので。
nonさん
5 8
5 8
8 5
5 8
になるでしょうか?・・・・っとおおもったら
実引数も変わっちゃうんですね
てことは・・・
5 8
5 8
8 5
8 5
ですかね?(x=,y=は省略しています)
Re: 関数について
Posted: 2011年12月22日(木) 19:35
by bitter_fox
canopus さんが書きました:
nonさん
5 8
5 8
8 5
5 8
になるでしょうか?・・・・っとおおもったら
実引数も変わっちゃうんですね
てことは・・・
5 8
5 8
8 5
8 5
ですかね?(x=,y=は省略しています)
実行してみましたか?
ウの検証プログラムです。
コード:
#include <stdio.h>
void func(int n, int 100)
{
println("%d", n);
println("%d", 100);
}
int main()
{
int a = 0, b = 0;
func(a, b);
}
実引数と仮引数については理解しているようなので説明は省略します。
エの「仮引数は関数の呼出し側でも有効である」の検証プログラムです。
コード:
#include <stdio.h>
void func(int n)
{
println("%d", n);
}
int main()
{
func(n);
}
Re: 関数について
Posted: 2011年12月22日(木) 20:54
by canopus
イが答えだったんですか・・・
てっきり答えとなる参照プログラムを書いてくださったのかと思いました…
イの文中に出てくる「値呼出し,参照呼出し」は
nonさんのコードでいうところの
15行目のswap(a,b);が
a,bなら 参照呼出し
5,8と直接値を与えると 値呼び出し
ということでしょうね。 あれ、合ってます??
bitter_foxさん返信ありがとうございます。
ウについては分かりました。定数では困りますね。
でも「エ」がよく分からないです。もう少し詳しい解説をよろしくお願いいたします。
「ア」もよくわからないです。すみません。
コード:
#include <stdio.h>
void swap(10,15)
{
int temp;
printf("%d %d\n",10,15);
}
int main(void)
{
swap(5,8);
printf("%d %d\n",5,8);
return 0;
}
↑「ア」はこんな感じかと思ってました。てか意味不明ですねこれでは…
ついでにCを実行する環境がないです。フリーソフトがあれば紹介よろしくお願いしますm(_ _)m
Re: 関数について
Posted: 2011年12月22日(木) 21:14
by box
bitter_fox さんが書きました:
ウの検証プログラムです。
エの「仮引数は関数の呼出し側でも有効である」の検証プログラムです。
どちらもコンパイルが通らない、でたらめなコードに見えるのは気のせいでしょうか。
Re: 関数について
Posted: 2011年12月22日(木) 21:34
by bitter_fox
canopus さんが書きました:
イの文中に出てくる「値呼出し,参照呼出し」は
nonさんのコードでいうところの
15行目のswap(a,b);が
a,bなら 参照呼出し
5,8と直接値を与えると 値呼び出し
ということでしょうね。 あれ、合ってます??
参照呼出し(参照渡し)は変数の参照を引数に渡すことを言います。
今回のケースでは、a, b, 5, 8ともに値呼び出し(値渡し)です。
http://www.geocities.jp/ky_webid/cpp/language/015.html
http://www5c.biglobe.ne.jp/~ecb/c/07_04.html
canopus さんが書きました:
ついでにCを実行する環境がないです。フリーソフトがあれば紹介よろしくお願いしますm(_ _)m
えっと、今までコンパイルを一切していなかったのでしょうか?最初の投稿のDXライブラリを使用したプログラムもでしょうか?
プログラムは実行しながら勉強しないと身に付かないと思うのですが・・・
いくつか紹介しておきます。
VC 2010 EE
http://www.microsoft.com/japan/msdn/vstudio/express/
導入法
http://cvwww.ee.ous.ac.jp/vc10inst.html
VC 2008 EE
http://www.microsoft.com/japan/msdn/vst ... t/express/
導入法
http://cvwww.ee.ous.ac.jp/vc08inst.html
しっかりと入門書で勉強することをお勧めします。
[hr][追記]
インターネット上のコンパイル・実行サービスもご利用ください。
http://ideone.com/
Re: 関数について
Posted: 2011年12月22日(木) 21:36
by softya(ソフト屋)
box さんが書きました:bitter_fox さんが書きました:
ウの検証プログラムです。
エの「仮引数は関数の呼出し側でも有効である」の検証プログラムです。
どちらもコンパイルが通らない、でたらめなコードに見えるのは気のせいでしょうか。
問題をよく読んでみてください。
ア 値呼出しでは,仮引数の値を変えると実引数の値も変わる。
イ 実引数から仮引数に情報を渡す方法として,値呼出し,参照呼出しなどがある。
ウ 実引数は変数だけであるが,仮引数は変数でも定数でもよい。
エ 実引数は呼び出される関数の中だけで有効であるが,仮引数は関数の呼出し側でも有効である。
Re: 関数について
Posted: 2011年12月22日(木) 21:38
by bitter_fox
box さんが書きました:bitter_fox さんが書きました:
ウの検証プログラムです。
エの「仮引数は関数の呼出し側でも有効である」の検証プログラムです。
どちらもコンパイルが通らない、でたらめなコードに見えるのは気のせいでしょうか。
でたらめではないですよ。選択肢に沿ったコードです。
あくまでその結果としてコンパイルの通らないコードになっているわけですが・・・w
(検証結果がコンパイル結果で現れてもいいですよね?処理系依存に関する問題は別として。)
Re: 関数について
Posted: 2011年12月22日(木) 21:45
by box
何かを検証するためのプログラムとして、コンパイルが通らないものが有効であるといえるのでしょうか。
お二方が何をおっしゃっているのか全然わかりません。
ちゃんと動くから検証できるかできないかがわかるのであって、動きもしないものでもって検証したことにはなりません。
Re: 関数について
Posted: 2011年12月22日(木) 21:46
by softya(ソフト屋)
box さんが書きました:何かを検証するためのプログラムとして、コンパイルが通らないものが有効であるといえるのでしょうか。
お二方が何をおっしゃっているのか全然わかりません。
ちゃんと動くから検証できるかできないかがわかるのであって、動きもしないものでもって検証したことにはなりません。
では、ウに関してサンプルプログラムを書いてみてください。
Re: 関数について
Posted: 2011年12月22日(木) 21:52
by box
softya(ソフト屋) さんが書きました:
では、ウに関してサンプルプログラムを書いてみてください。
遠慮しておきます。
話がかみ合いそうにないので、このトピックからは撤退します。
Re: 関数について
Posted: 2011年12月22日(木) 21:57
by softya(ソフト屋)
box さんが書きました:softya(ソフト屋) さんが書きました:
では、ウに関してサンプルプログラムを書いてみてください。
遠慮しておきます。
話がかみ合いそうにないので、このトピックからは撤退します。
うーん。
ウの問い自体が矛盾しているので検証はコンパイルレベルの問題って事なんですけどね。
Re: 関数について
Posted: 2011年12月22日(木) 22:05
by bitter_fox
box さんが書きました:ちゃんと動くから検証できるかできないかがわかるのであって、動きもしないものでもって検証したことにはなりません。
ランタイムフェーズであればそうですが、選択肢ウ・エともにコンパイルフェーズの正誤ですのでコンパイル結果で以て正誤を判断して良いかと思います。(もちろん使用するコンパイラがその正誤を含んだ言語仕様を満たしている必要がありますが。)
[hr][追記]
本当はコンパイルフェーズの正誤は言語仕様を引っ張り出して判断するのが一番ですが。(すべての正誤に当てはまるか・・・w)
[hr]
コード:
命題:Aが間違っていることを証明する。
背理法を用いる。
Aが正しいと仮定する。
Aに基づいて次のプログラムが導ける。
(プログラム略・このプログラムはAの主張を忠実に再現した物とし、Aの主張箇所を除いて間違いは存在していないものとする。)
Aは正しいのでこのプログラムも正しいはずである。
ゆえに、このプログラムは言語仕様を満たしており(1)、実行結果もAの主張と一致することになる。
(1)について、言語仕様を満たしているということは、言語仕様を満たしているコンパイラでコンパイルするとコンパイルに成功するはずである。
しかしAの主張箇所に関してコンパイルエラーが発生した。
(使用するコンパイラが言語仕様を満たしているかについては省略)
これは矛盾である。
よって、Aは正しくない、つまりAは間違っているということが証明された。
この証明って間違ってますかね?
演繹で一切間違っていないと思うのですが。
Re: 関数について
Posted: 2011年12月22日(木) 23:18
by ISLe
イ 実引数から仮引数に情報を渡す方法として,値呼出し,参照呼出しなどがある。
『など』ってありますけど、C/C++で値渡しと参照渡し以外に何かありましたっけ。
Re: 関数について
Posted: 2011年12月23日(金) 00:32
by softya(ソフト屋)
ISLe さんが書きました: イ 実引数から仮引数に情報を渡す方法として,値呼出し,参照呼出しなどがある。
『など』ってありますけど、C/C++で値渡しと参照渡し以外に何かありましたっけ。
情報処理試験によく有る なんとなくしっくり来ない って感じの問題でしょうか。
他の言語によっては値渡しと参照渡し以外もあるんですけどね。
Re: 関数について
Posted: 2011年12月23日(金) 01:35
by bitter_fox
softya(ソフト屋) さんが書きました:ISLe さんが書きました: イ 実引数から仮引数に情報を渡す方法として,値呼出し,参照呼出しなどがある。
『など』ってありますけど、C/C++で値渡しと参照渡し以外に何かありましたっけ。
情報処理試験によく有る なんとなくしっくり来ない って感じの問題でしょうか。
他の言語によっては値渡しと参照渡し以外もあるんですけどね。
canopus さんが書きました:
実は情報技術者試験問題で20年秋の問題でして
問39
プログラム言語における関数呼出し時の引数の性質のうち,適切なものはどれか。
イ 実引数から仮引数に情報を渡す方法として,値呼出し,参照呼出しなどがある。
プログラム言語一般の問題のようなのでぼかすしかないのでしょうねw
Re: 関数について
Posted: 2011年12月23日(金) 02:00
by ISLe
なるほど。
canopusさんはC言語の世界で理解したいと考えたようですが…
罪な問題ですね。
Re: 関数について
Posted: 2011年12月23日(金) 16:48
by canopus
難しいですね。
bitter_foxさんがリンクしてくれたサイトを見ても
いまいち参照呼出しと値呼び出しが理解できないです…
入門書ねぇ・・・買っても損はないかもですね。一応高専中退もんなんで1年間は勉強してるんですよ。専門書もありますが読む気になれないし…
VC2008で実行できますか、なるほどそうでしたか…
ISLeさん
ホント簡単でないですね基本情報は・・・
Re: 関数について
Posted: 2011年12月23日(金) 17:07
by non
前に載せたこっちが値渡し
コード:
#include <stdio.h>
void swap(int x,int y)
{
int temp;
printf("x=%d y=%d\n",x,y);
temp=x;
x=y;
y=temp;
printf("x=%d y=%d\n",x,y);
}
int main(void)
{
int a=5,b=8;
printf("a=%d b=%d\n",a,b);
swap(a,b);
printf("a=%d b=%d\n",a,b);
return 0;
}
で、こっちが参照渡し
コード:
#include <stdio.h>
void swap(int *x,int *y)
{
int temp;
printf("x=%d y=%d\n",*x,*y);
temp=*x;
*x=*y;
*y=temp;
printf("x=%d y=%d\n",*x,*y);
}
int main(void)
{
int a=5,b=8;
printf("a=%d b=%d\n",a,b);
swap(&a,&b);
printf("a=%d b=%d\n",a,b);
return 0;
}
Re: 関数について
Posted: 2011年12月23日(金) 17:17
by bitter_fox
canopus さんが書きました:
入門書ねぇ・・・買っても損はないかもですね。一応高専中退もんなんで1年間は勉強してるんですよ。専門書もありますが読む気になれないし…
別に入門書でなくても良いでなくても良いです。例えば入門サイトなどでも入門書と同程度の学習ができるはずですので。
一年間勉強しているんだったらポンポンと十分でないところを理解する感じで入門書を読んで行けば良いように思います。
専門書のレベルがどのレベルか分からないので、その専門書で勉強するべきかは分からないですが・・・
canopus さんが書きました:
実は情報技術者試験問題で20年秋の問題でして
問39
プログラム言語における関数呼出し時の引数の性質のうち,適切なものはどれか。
ア 値呼出しでは,仮引数の値を変えると実引数の値も変わる。
イ 実引数から仮引数に情報を渡す方法として,値呼出し,参照呼出しなどがある。
ウ 実引数は変数だけであるが,仮引数は変数でも定数でもよい。
エ 実引数は呼び出される関数の中だけで有効であるが,仮引数は関数の呼出し側でも有効である。
ちなみにこの問の出題意図は「値渡しと参照渡しの違い」と「実引数と仮引数の違い」について理解できているかという概念的な物なので、特定の言語で勉強する必要はありません。
それに単純なプログラミングの問題以外も出るので基本情報処理試験の参考書で勉強した方が良いように思います。
ただ、プログラミングの問題も出るので何か一つ言語をマスターしておく必要があります。
Re: 関数について
Posted: 2011年12月23日(金) 18:59
by ISLe
non さんが書きました:で、こっちが参照渡し
void swap(int *x,int *y);
これ↑を参照渡しと言うとポインタの理解が進まなくなるのではないでしょうかね。
初心者相手でも『値渡しで間接参照』はしっかり押さえておかないとダメだと思いますけど。
Re: 関数について
Posted: 2011年12月23日(金) 20:03
by non
ポインタ渡しってことでしょうが、Cには値渡ししかありませんっていうと、
ア 値呼出しでは,仮引数の値を変えると実引数の値も変わる。
この問いに矛盾が出るように思ったのですが・・よく読むとそうでもないですね。
確かに誤った情報でした。
改めて、参照渡しです。(ただし、C++)
コード:
#include <stdio.h>
void swap(int &x,int &y)
{
int temp;
printf("x=%d y=%d\n",x,y);
temp=x;
x=y;
y=temp;
printf("x=%d y=%d\n",x,y);
}
int main(void)
{
int a=5,b=8;
printf("a=%d b=%d\n",a,b);
swap(a,b);
printf("a=%d b=%d\n",a,b);
return 0;
}
Re: 関数について
Posted: 2011年12月25日(日) 12:06
by canopus
遅れましたが皆さんありがとうございました。
結局分かったようで分からないようで…あれですが
入門書を買って学んでいこうと思います。
ところでクラスの作り方も知りたいのですが、別トピックにした方がいいですかね?
Re: 関数について
Posted: 2011年12月25日(日) 12:12
by softya(ソフト屋)
クラスも関数が分からないとダメなので、まず関数が先だと思います。
字だらけの本が苦手なら、こんな本もあります。
「Amazon.co.jp: Cの絵本―C言語が好きになる9つの扉: アンク: 本」
まぁ、イメージ戦略と言うか細かいところを端折っているので別に本は必要なんですけどね。
こういう本とか。
「Amazon.co.jp: やさしいC 第3版 [やさしいシリーズ]: 高橋 麻奈: 本」
こんなのもありますが、私は逆に読みにくいと思いました。
「Amazon.co.jp: やさしいC++―まずは「C言語」からはじめよう!! (I・O BOOKS): 米村 貴裕, 古川 耕平: 本」
自分が読む気になる本を探してみてください。
Re: 関数について
Posted: 2011年12月26日(月) 06:54
by canopus
結局入門書を買うことにしました。
答えてくださった皆さんありがとうございましたm(_ _)m