ポインタから逃げてましたー。
構造体を使って入出力できるアドレス帳もどきを作ってみたりしてました。
それとやっとポインタの勉強が少しだけ進みました。
ようやっとint型とchar型については思い通りの動作をするようになりました。
問題は配列変数…書いてある通りにやって便利さを確認。まだそれだけ。
それとはべつに今まで何気なく書いていたreturnに苦戦中。
わからなかったからとりあえずグローバル変数にしといた!からは本当に脱却したいです。
やっと少しだけ進展
Re: やっと少しだけ進展
どう苦戦してるのやららすとさん さんが書きました:それとはべつに今まで何気なく書いていたreturnに苦戦中。
「わからなかったから」というのは一番良くないのです。頑張って解脱(?)してくださいね~らすとさん さんが書きました:わからなかったからとりあえずグローバル変数にしといた!からは本当に脱却したいです。
Re: やっと少しだけ進展
わたくしも構造体の値でリターンして受け取ってからリターンの使い方が広がった記憶があります
単純なんですけど、こんなかんじです。
単純なんですけど、こんなかんじです。
typedef struct{
int x,y;
}position;
/*呼び出し元*/
int main(){
position pos;
//構造体に値をセットして構造体を返してもらう
pos = returnstruct(100,200);
//posに値がセットされている
printf("x = %d,y = %d\n",pos.x,pos.y);
return 0;
}
/*構造体を返す関数*/
position returnstruct(int x,int y){
position temp;
temp.x = x;
temp.y = y;
return temp;
}
Re: やっと少しだけ進展
インデントをしっかりつけてください。taketoshi さんが書きました:わたくしも構造体の値でリターンして受け取ってからリターンの使い方が広がった記憶があります
戻り値がポインタでないので、構造体コピーですね。
なので構造体を返してもらうという言葉に何か違和感があります・・・(^^;
Re: やっと少しだけ進展
>インデントをしっかりつけてください。
ごめんなさい。コピペじゃなくて直に書いたのでインデントはしょっちゃいました。
>戻り値がポインタでないので、構造体コピーですね。
ゲームで構造体を使う際等、定数セットに役立ちました
同じように、構造体をポインタ渡しして、渡した先の関数で構造体をグリグリ書き換えた時もポインタの使い方が広がった記憶が有ります。
まとまりがない文章ですが、構造体を使ってみるとリターンもポインタもよく理解できるかも!?っていう実体験です。
ごめんなさい。コピペじゃなくて直に書いたのでインデントはしょっちゃいました。
>戻り値がポインタでないので、構造体コピーですね。
ゲームで構造体を使う際等、定数セットに役立ちました
同じように、構造体をポインタ渡しして、渡した先の関数で構造体をグリグリ書き換えた時もポインタの使い方が広がった記憶が有ります。
まとまりがない文章ですが、構造体を使ってみるとリターンもポインタもよく理解できるかも!?っていう実体験です。
Re: やっと少しだけ進展
へにっくすさん
コメントありがとうございます。
引数と戻り値で詰まってました。
意外なところで解決しましたが。
解脱はちょっとわかりませんが積み重ねていきたいです。
コメントありがとうございます。
引数と戻り値で詰まってました。
意外なところで解決しましたが。
解脱はちょっとわかりませんが積み重ねていきたいです。
Re: やっと少しだけ進展
Taketoshiさん
コメントありがとうございます。
正直なところ見せて頂いたコードがどんな働きをするのか、ちゃんとわかっていません。
構造体position を定義して、メイン関数にposition型の構造体posを宣言。もう1つの関数を呼び出して、その戻り値をposで受け取り、表示でしょうか。
もう1つの関数は???でした。
構造体は見るからに便利な機能ですね。
ウィザードリィのようなものも作ってみたいので絶対に覚えたいです。
これまでもどこでとっかかりが見つかるかは検討もつかなかったので、探りながらやっていきたいです。
コメントありがとうございます。
正直なところ見せて頂いたコードがどんな働きをするのか、ちゃんとわかっていません。
構造体position を定義して、メイン関数にposition型の構造体posを宣言。もう1つの関数を呼び出して、その戻り値をposで受け取り、表示でしょうか。
もう1つの関数は???でした。
構造体は見るからに便利な機能ですね。
ウィザードリィのようなものも作ってみたいので絶対に覚えたいです。
これまでもどこでとっかかりが見つかるかは検討もつかなかったので、探りながらやっていきたいです。
Re: やっと少しだけ進展
>構造体position を定義して、メイン関数にposition型の構造体posを宣言。もう1つの関数を呼び出して、その戻り値をposで受け取り、表示でしょうか。
仰る通りその通りの機能です。
もう一つの関数は戻り値をPosition構造体で返すために と宣言し
関数内のローカル変数としてposition構造体のtemp変数を用意します。
temp変数は関数を抜けると消えてしまうので、
これのコピーをリターンしメイン関数でpos変数として受け取っています。
int型やchar型をリターンする関数は比較的解り易いのですが、
構造体やポインタを返すとなると理解するのが一気に複雑になります。
なぜなら構造体やポインタを渡す際は関数内で数値を変更する場合が多く
変数がどこで宣言されているのかを意識しないと関数を抜けると同時にデータが消えます。
>わからなかったからとりあえずグローバル変数にしといた!
ここの一文を読んでなんとなく、スコープで手こずっているのかな?と感じました。
仰る通りその通りの機能です。
もう一つの関数は戻り値をPosition構造体で返すために と宣言し
関数内のローカル変数としてposition構造体のtemp変数を用意します。
temp変数は関数を抜けると消えてしまうので、
これのコピーをリターンしメイン関数でpos変数として受け取っています。
int型やchar型をリターンする関数は比較的解り易いのですが、
構造体やポインタを返すとなると理解するのが一気に複雑になります。
なぜなら構造体やポインタを渡す際は関数内で数値を変更する場合が多く
変数がどこで宣言されているのかを意識しないと関数を抜けると同時にデータが消えます。
>わからなかったからとりあえずグローバル変数にしといた!
ここの一文を読んでなんとなく、スコープで手こずっているのかな?と感じました。
最後に編集したユーザー taketoshi on 2013年8月06日(火) 19:12 [ 編集 1 回目 ]
Re: やっと少しだけ進展
返信ありがとうございます。
関数はint Name()で宣言するものなんだと思っていました。
今charで宣言するとreturn はcharで返し、定義された構造体の場合は構造体で返す事を確かめることが出来ました。
1 メイン関数内で構造体positionの変数posを宣言。(main関数にpos.x,pos.yが存在)
2 メイン内での関数呼び出しの時にreturnstruct関数のxとyに100,200を代入(main関数にpos.x,pos.yが、returnstruct関数にローカル変数x,yが存在)
//ここからreturnstruct関数
3 returnstruct関数の中で構造体positionの変数tempを宣言し、同関数のローカル変数x,yをtemp.x,temp.yにそれぞれ代入(main関数にpos.x,pos.yが、returnstruct関数にはx,y,temp.x,temp.yが存在する)
4 returnで変数temp.x,temp.yの数値をメインのpos.xとpos.yに返す。(main関数にpos.x,pos.yが存在する。returnstruct関数は最後まで処理したのでそのブロック内の変数は消える)
このような感じでしょうか?考え考えなので箇条書きの割りにまとまっていなくてすみません。
ポインタはその部分の理解が及びません。
return以外の部分で直接その関数の外の変数をいじれるらしい、といった程度です。
構造体に至っては今初めて知った次第です。
その辺りをしばらくじっくりやる必要がありそうです。
ご指摘のとおり、スコープが気になってしまいとにかく消えない用に、と考えてグローバル変数にしていました。
ローカル変数だけで手一杯で、static変数などになってくるとお手上げ状態です。
関数はint Name()で宣言するものなんだと思っていました。
今charで宣言するとreturn はcharで返し、定義された構造体の場合は構造体で返す事を確かめることが出来ました。
1 メイン関数内で構造体positionの変数posを宣言。(main関数にpos.x,pos.yが存在)
2 メイン内での関数呼び出しの時にreturnstruct関数のxとyに100,200を代入(main関数にpos.x,pos.yが、returnstruct関数にローカル変数x,yが存在)
//ここからreturnstruct関数
3 returnstruct関数の中で構造体positionの変数tempを宣言し、同関数のローカル変数x,yをtemp.x,temp.yにそれぞれ代入(main関数にpos.x,pos.yが、returnstruct関数にはx,y,temp.x,temp.yが存在する)
4 returnで変数temp.x,temp.yの数値をメインのpos.xとpos.yに返す。(main関数にpos.x,pos.yが存在する。returnstruct関数は最後まで処理したのでそのブロック内の変数は消える)
このような感じでしょうか?考え考えなので箇条書きの割りにまとまっていなくてすみません。
ポインタはその部分の理解が及びません。
return以外の部分で直接その関数の外の変数をいじれるらしい、といった程度です。
構造体に至っては今初めて知った次第です。
その辺りをしばらくじっくりやる必要がありそうです。
ご指摘のとおり、スコープが気になってしまいとにかく消えない用に、と考えてグローバル変数にしていました。
ローカル変数だけで手一杯で、static変数などになってくるとお手上げ状態です。
Re: やっと少しだけ進展
>>このような感じでしょうか?
解釈は合っております
最新の日記でも迷われてらっしゃるご様子ですので、
お節介ついでに「pos変数の書き換え」のポインタを用いたコードを載せます
リターンで処理結果を受け取るのか、ポインタを渡して渡した関数で数値を変更するのか
最終的なpos変数内の書き換え結果は先に乗せたコードとまったく一緒です。
グローバル変数を減らすコツはスコープを意識して、
変数をどのように関数とキャッチボールするかを意識すると減っていきますよ。
解釈は合っております
最新の日記でも迷われてらっしゃるご様子ですので、
お節介ついでに「pos変数の書き換え」のポインタを用いたコードを載せます
リターンで処理結果を受け取るのか、ポインタを渡して渡した関数で数値を変更するのか
最終的なpos変数内の書き換え結果は先に乗せたコードとまったく一緒です。
#include "stdafx.h"
typedef struct{
int x,y;
}position;
/*構造体のポインタを受け取って直接書き換える関数*/
//リターンも使わないのでvoidを宣言する
void returnstruct(position *lpPos){
//ポインタを受け取って書き換えるのでtempは不要
//position temp;
//直接書き換える(ここはポインタ経由でアクセスするのでアロー演算子を用いる、アロー演算子がポインタ演算子(*)を兼ねる)
lpPos->x = 100;
lpPos->y = 200;
return;
}
int _tmain(int argc, _TCHAR* argv[])
{
position pos;
//関数に構造体のポインタを渡す
returnstruct(&pos);
//posに値がセットされている(ここは構造体にアクセスするのでドット演算子を用いる)
printf("x = %d,y = %d\n",pos.x,pos.y);
return 0;//←ここでpos変数は消滅する
}
変数をどのように関数とキャッチボールするかを意識すると減っていきますよ。