GetHitKeyStateAll_2関数について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
cppb

GetHitKeyStateAll_2関数について

#1

投稿記事 by cppb » 16年前

はじめまして。
先日プログラミング(C++)を始め、C言語~ゲームプログラミングの館~で勉強させて頂いています。

勉強していて少し詰まったところが。
int GetHitKeyStateAll_2(int KeyStateBuf[/url]){
        char GetHitKeyStateAll_Key[256];
        GetHitKeyStateAll( GetHitKeyStateAll_Key );
        for(int i=0;i<256;i++){
                if(GetHitKeyStateAll_Key==1) KeyStateBuf++;
                else                            KeyStateBuf=0;
        }
        return 0;
}

GetHitKeyStateAll_2関数(というのでしょうか?)を
GetHitKeyStateAll_2(Key)

と実行した際、Keyに[KEY_INPUT_UP]などが代入される理由がわかりませんでした。
(もちろんコピーして実行すると正しく動くのですが)
これがわかれば、もしかしてreturn以外でも値を返せる?複数返せる?と思いまして。

わかる人からすれば、おかしな質問だったりするのかもしれませんが、
教えて頂けると幸いです。

kazuoni

Re:GetHitKeyStateAll_2関数について

#2

投稿記事 by kazuoni » 16年前

関数の戻り値は0です。
引数に渡しているint型の配列に256個のキー入力に対し、
「押されていたらインクリメント」

「押されていなければ0を代入」

っと実行しているだけです。

>Keyに[KEY_INPUT_UP]などが代入される
Key[KEY_INPUT_UP]では配列名KeyのKEY_INPUT_UP番目を指しているだけです。

Mato

Re:GetHitKeyStateAll_2関数について

#3

投稿記事 by Mato » 16年前

 はじめまして。
GetHitKeyStateAll_2関数ですね。
引数として渡している、つまり、(Key)の部分の変数Keyが配列になっていますね。
配列の場合、ポインタと同じような扱いになりますので(というと語弊があるだろうか)、(returnに頼らずとも)関数内で値を変えることも可能です。

cppb

Re:GetHitKeyStateAll_2関数について

#4

投稿記事 by cppb » 16年前

回答ありがとうございます。少しわかった気はしますが、間違っているかも。

>kazuoniさん
関数の内容はわかっているつもりです。
連続で押されていたらフレーム分加算、押されていなかったら0にリセットというのを全キー分行っているんですよね。
間違っていたらすみません。

>Key[KEY_INPUT_UP]では配列名KeyのKEY_INPUT_UP番目を指しているだけです。
KEY_INPUT_UPという変数があるということでしょうか。
これはいつ発生(?)しているんでしょうか、少しわかりません。すみません。

>Matoさん
配列の場合は関数が実行されたのち、最終的な値が元の配列にも代入されるということでしょうか。
ポインタを勉強していないため、まずいかもしれません。ポインタについて学ぼうと思います。

Mato

Re:GetHitKeyStateAll_2関数について

#5

投稿記事 by Mato » 16年前

 KEY_INPUT_UPは、DxLib.hの中で#defineされていたと思いますよ。
具体的な値は忘れました、すいません。

 引数が配列の場合は、最終的に元の配列に代入されると言うより、最初から元の配列に代入されています。
ポインタは、プログラムを本格的に始めるなら避けられない壁だと思いますので、頑張って下さい。

 自分の発言を見直してみて、配列の場合は”関数内で値を変えることも可能です”って言ったのはまずかったなぁと反省。
”変なことしない限りは変わります”に変えさせて下さい。

cppb

Re:GetHitKeyStateAll_2関数について

#6

投稿記事 by cppb » 16年前

>Matoさん
#defineもいま一つわからないので、ポインタと一緒に勉強してきます。頑張ります。ありがとうございます。
ややこしい数字をKEY_INPUT_**という別名で扱えるよう、あらかじめ代入しているのですね。

>最初から元の配列に代入されています。
関数が実行し終わってからでなく、インクリメントが起きた時に外の値も変わっている
と解釈しました。(自分の中で…)

>変なことしない限りは変わります
例外もあるということで覚えておきます。

回答ありがとうございました。自分なりに解釈し、自分の中では解決しました!
間違っていたら教えて頂けると幸いです。

>↓のkazuoniさん
ありがとうございます。#defineは定数なのですね。

勉強してきました。配列の場合は値ではなく、アドレスというものが渡っていたのですね。
要するに色々な入口の一つから中身をいじくっている……ような。

すっきりしました。
kazuoniさん、Matoさん、親切にありがとうございました。

kazuoni

Re:GetHitKeyStateAll_2関数について

#7

投稿記事 by kazuoni » 16年前

>数字をKEY_INPUT_**という別名で扱えるよう、あらかじめ代入しているのですね
置き換えられるのが正しい表現のような気がしますが、そんな感じです。
ただ、代入としてしまうと、定義後も代入可能っとしてしまいそうなので、
不適切かもしれないです。

>(自分の中で…)
ちょっと勉強すればちゃんと理解できるはずですよ^^

C++なら参照渡しっという手もありますが、まずはポインタが先ですかね。

閉鎖

“C言語何でも質問掲示板” へ戻る