
こんばんは。現在C言語を学んでいます。
課題という形で構造体で定義されたデータを関数の引数に当てはめ、データを渡すという処理を行わねばならぬのですが、関数を利用しての構造体の受け渡しが分からず苦戦しております。ご助言頂ければ幸いです。
分かりづらいかとは思いますが下記が私が簡単にですが作ったものとなります。
私の考えている動作プロットとしては
1. 構造体の形式を定義する。
2. 冒頭にて存在する関数を定義
3. main関数内にて構造体に名前を付けて定義し、値を入力より受付
4. do_it_hoge関数に構造体を引数として与え(ここが分からず)関数を呼び出す。
5. 関数内にて引数で受け取った &hoge.a,b,c等を表示するなどしたい。(受け取る方法が分からず)
関数を呼ぶ際にカッコ内に入れるのは構造体の名前のみで良いのでしょうか? (例: do_it_hoge(hoge); のように)
また呼び出される関数側の括弧は何を記述するのでしょうか?
いつもならint hogehoge, や char hoge, などと宣言しているかと思うのですが。
読みづらく、分かりにくいものかとは思いますが
どうぞ宜しくご教授頂ければと思っております。
構造体を触るのが久しぶりだったのでそちらでミスがあるかもしれません。もし何か補足等必要でしたらメッセージ頂ければ返事させていただきたいと思います。
//----------------------------------------------------------------//
//構造体HOGEHOGE定義
//----------------------------------------------------------------//
typedef struct tagHOGEHOGE {
int a,b;
int c;
}HOGEHOGE;
void do_it_hoge();//関数定義。ここでのカッコ内の定義も不明
//----------------------------------------------------------------//
// main
//----------------------------------------------------------------//
void main(){
HOGEHOGE hoge;//hogeをHOGEHOGE利用で定義
scanf("%d,%d",&hoge.a,&hoge.b);//カンマ区切りで代入
scanf("%d",&hoge.c);//数値をhoge.cへ
do_it_hoge();//←ここが分からず
}
//----------------------------------------------------------------//
// do_it_hoge 関数。構造体を引数で受け取りたい関数。
//----------------------------------------------------------------//
void do_it_hoge(){ // ←括弧内の受け方が分からず
// ここでmainで入力された &hoge.aなどを参照して表示したい
// 例: printf("hogeA:%d",&hoge.a);
}
//----------------------------------------------------------------//
No.1ベストアンサー
- 回答日時:
普通、アドレス渡しでなんとかするかと。
こんな感じ:#include <stdio.h>
typedef struct { int a,b; char *m; } Hoge_t;
void do_it_hoge( Hoge_t *h ){
printf( "Hoge: %d %d '%s'\n", h->a, h->b, h->m );
}
int main( int c, char *v[] ){
Hoge_t hoge = { 1,2, "hoge hoge" };
do_it_hoge( &hoge );
}
ここらへん基本なので、入門書とか読み直してみては。
No.5
- 回答日時:
>#4さん
>値渡しとアドレス渡しの二種類の方法があります。
いわゆる「アドレス渡し」は結局のところ
「アドレス」という「値」を渡しています。
C言語における引数の渡し方には「値渡し」だけが存在し、
いわゆる「アドレス渡し」は「値渡し」の一部であると考えるのがよいでしょう。
No.4
- 回答日時:
値渡しとアドレス渡しの二種類の方法があります。
http://www9.plala.or.jp/sgwr-t/c/sec15-4.html
が丁寧に説明されていると思うので、参考にしてください。
~上記URLより引用
【値渡し】
引数の独立性が保たれ安全なプログラムになりますが、
対象となる構造体の内容をすべてコピーするため、大きな構造体では
無駄な時間が多くなります。
【アドレス渡し】
構造体をコピーすることなく、構造体のアドレスを引数で渡すため、
サイズの大きな構造体を渡すときには値渡しより効率的です。
No.3
- 回答日時:
全然難しくないですよ。
int a;
とやればint型のaが宣言できるのと同じで、
HOGEHOGE a;
とやれば、HOGEHOGE型のaが宣言できます。
ですから、それを引数に取る関数の宣言は
void fugafuga(HOGEHOGE a)
{
で、それを呼ぶには
HOGEHOGE a;
fugafuga(a);
です。
No.2
- 回答日時:
>// ここでmainで入力された &hoge.aなどを参照して表示したい
このコメントが間違いのもとです。
mainで入力したのは、hogeのメンバーa, b, cです。
これらのメンバーのアドレスを入力したのではありません。
do_it_hoge関数の中でhogeのメンバーを参照するだけなら、
何もhogeのアドレスを渡す必要はありません。hogeそのものを渡せばじゅうぶんです。
戻り値のないdo_it_hoge関数の中で、hogeのメンバーの中身を変更するのであれば、
do_it_hoge(&hoge);
のようにhogeのアドレスを渡す必要があります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# プログラミングのペーパーテスト 実行結果がどのように表示されるか答えよ #include <stdi 1 2022/07/09 14:27
- C言語・C++・C# プログラミングのペーパーテスト 実行結果を表示せよ #include <stdio.h> int h 1 2022/07/09 15:27
- Windows 10 バッチファイルの記述法とルールについてアドバイスをお願いいたします。 1 2022/04/13 10:50
- HTML・CSS 全部のアクセスを指定したページに転送させたい 2 2022/06/28 16:33
- JavaScript JavaScriptで「〇以上▲まで」の書き方 1 2022/07/20 14:44
- XML XML同じ名前の要素を自動で集約するツール 1 2022/04/11 09:21
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Boolean型配列中のTrueの有無を...
-
static constメンバ変数(配列)...
-
ifreamをリロードしたい
-
正規表現で半角数字1桁のみを全...
-
ボタンをクリックすると数が増...
-
JQueryの繰り返し処理が動かな...
-
Linux バイナリ実行できない "...
-
HTTPSのとき":"が"%3A"ではなく...
-
hoge の謎
-
Excel VBA の ChangeFileAccess
-
Vb.netのグローバル変数の宣言...
-
複数ファイルで使うグローバル...
-
window.onloadでのfunction
-
ASP+アクセスでのSQLコメントに...
-
confirmの連続?
-
【正規表現】【javascript】CR...
-
window.openでタイトル名の指定
-
functionから別のfunctionを実...
-
idを使わずにonclickで自身の要...
-
ASP.NET MVCでObjectをjsに渡す
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Boolean型配列中のTrueの有無を...
-
Linux バイナリ実行できない "...
-
ASP+アクセスでのSQLコメントに...
-
【正規表現】【javascript】CR...
-
Excel VBA の ChangeFileAccess
-
MFCのキャプション変更
-
HTTPSのとき":"が"%3A"ではなく...
-
ボタンをクリックすると数が増...
-
C# .NET DataGridView の行を追...
-
javascriptで文字挿入でtoggle...
-
Vb.netのグローバル変数の宣言...
-
複数ファイルで使うグローバル...
-
正規表現で半角数字1桁のみを全...
-
ifreamをリロードしたい
-
-(ハイフン)_(アンダーバー)の...
-
【Jquery】changeイベント毎にa...
-
confirmの連続?
-
ArrayListの初期値の設定の仕方...
-
static constメンバ変数(配列)...
-
C言語でクロージャを記述する
おすすめ情報