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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
syosinsya
記事: 4
登録日時: 13年前

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

#1

投稿記事 by syosinsya » 13年前

こんばんは、今回初めて投稿させていただきます。よろしくお願いします。
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]

box
記事: 2002
登録日時: 15年前

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

#2

投稿記事 by box » 13年前

構造体のメンバーではない、単なるint型の変数を初期化するような
input関数のコードは書けますか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

syosinsya
記事: 4
登録日時: 13年前

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

#3

投稿記事 by syosinsya » 13年前

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

box
記事: 2002
登録日時: 15年前

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

#4

投稿記事 by box » 13年前

syosinsya さんが書きました: 今気づいたのですが、値渡しをしてるので、元の変数には影響を及ぼさない、つまり初期化できていないということでしょうか?
さようでございます。
ていうか、C言語の関数はすべて値渡しです。
その値が、即値なのかはたまた即値ではなくて別の種類の値(今回必要なのはたぶんこちら)なのか、
ということです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

syosinsya
記事: 4
登録日時: 13年前

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

#5

投稿記事 by syosinsya » 13年前

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

syosinsya
記事: 4
登録日時: 13年前

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

#6

投稿記事 by syosinsya » 13年前

ちなみに解決したコードは以下の通りです。
関数内で値を変えると呼び出し元の変数の中身も変わるように、引数をただの構造体変数からポインタ変数にすることで解決しました。

コード:

#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);
}

box
記事: 2002
登録日時: 15年前

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

#7

投稿記事 by box » 13年前

syosinsya さんが書きました:

コード:

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

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

コード:

	human hu ;

	input(&hu);
と書く方が簡単でありましょう。参考までに。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

閉鎖

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