ページ 11

構造体のメンバを関数で初期化・・・

Posted: 2013年3月05日(火) 21:46
by syosinsya
こんばんは、今回初めて投稿させていただきます。よろしくお願いします。
C言語始めてまだ2カ月の初心者です。構造体について勉強中、メンバの初期化と表示を関数を使って行う処理として下のコードを書いたところ
「Run-Time Check Failure #3 The variable 'hu' is being used without being initialized 」という実行時例外が出ました。
英文の内容から、初期化していませんという内容だとは思うのですが・・・どこを直せばきちんと動くでしょうか?

#include<stdio.h>

typedef struct{
int age;
}human;

void input(human hu);
void output(human hu);

int main()
{
human hu;
input(hu);
output(hu);

return 0;
}

void input(human hu){
hu.age =5;
}
void output(human hu){
printf("%d\n",hu.age);
}
[/code]

Re: 構造体のメンバを関数で初期化・・・

Posted: 2013年3月05日(火) 21:56
by box
構造体のメンバーではない、単なるint型の変数を初期化するような
input関数のコードは書けますか?

Re: 構造体のメンバを関数で初期化・・・

Posted: 2013年3月05日(火) 22:14
by syosinsya
素早いお返事ありがとうございます。
おっしゃられた関数くらい・・・と思って書いてみたのですが・・・やはり同じようにダメです。
今気づいたのですが、値渡しをしてるので、元の変数には影響を及ぼさない、つまり初期化できていないということでしょうか?

Re: 構造体のメンバを関数で初期化・・・

Posted: 2013年3月05日(火) 22:16
by box
syosinsya さんが書きました: 今気づいたのですが、値渡しをしてるので、元の変数には影響を及ぼさない、つまり初期化できていないということでしょうか?
さようでございます。
ていうか、C言語の関数はすべて値渡しです。
その値が、即値なのかはたまた即値ではなくて別の種類の値(今回必要なのはたぶんこちら)なのか、
ということです。

Re: 構造体のメンバを関数で初期化・・・

Posted: 2013年3月05日(火) 22:24
by syosinsya
もしコメントいただけなければ、構造体に問題が・・・と勘違いしてずっと先に進めないところでした。
助言を踏まえたうえで、最初のプログラムについても考えてみます。
本当に助かりました。ありがとうございます。

Re: 構造体のメンバを関数で初期化・・・

Posted: 2013年3月05日(火) 23:19
by syosinsya
ちなみに解決したコードは以下の通りです。
関数内で値を変えると呼び出し元の変数の中身も変わるように、引数をただの構造体変数からポインタ変数にすることで解決しました。

コード:

#include<stdio.h>

typedef struct{
	int age;  
}human;

void input(human *hu);  //←引数をポインタ変数に変更
void output(human hu);

int main()
{
	human hu ;
	human *phu; 
	phu = &hu;

	input(phu);  //アドレスで呼び出す
	output(hu);

	return 0;
}

void input(human *hu){  //←引数をポインタ変数に変更
	hu->age =5;   //->記号を使ってアクセス
}
void output(human hu){
	printf("%d\n",hu.age);
}

Re: 構造体のメンバを関数で初期化・・・

Posted: 2013年3月06日(水) 00:12
by box
syosinsya さんが書きました:

コード:

	human hu ;
	human *phu; 
	phu = &hu;

	input(phu);  //アドレスで呼び出す
まあこれでもいいのかもしれませんが、どうせならphuを使わずに

コード:

	human hu ;

	input(&hu);
と書く方が簡単でありましょう。参考までに。