こんばんは。現在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を探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・2024年に成し遂げたこと
- ・3分あったら何をしますか?
- ・何歳が一番楽しかった?
- ・治せない「クセ」を教えてください
- ・【大喜利】看板の文字を埋めてください
- ・【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・【穴埋めお題】恐竜の新説
- ・我がまちの「給食」自慢を聞かせてっ!
- ・冬の健康法を教えて!
- ・一番好きな「クリスマスソング」は?
- ・集合写真、どこに映る?
- ・自分の通っていた小学校のあるある
- ・フォントについて教えてください!
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ボタンをクリックすると数が増...
-
アンカーリンクをクリックさせ...
-
【Jquery】changeイベント毎にa...
-
javascriptで文字挿入でtoggle...
-
Excel VBA の ChangeFileAccess
-
HTTPSのとき":"が"%3A"ではなく...
-
Boolean型配列中のTrueの有無を...
-
Ruby on Rails ; model validat...
-
C# .NET DataGridView の行を追...
-
JQueryの繰り返し処理が動かな...
-
onclick指定関数の引数へローカ...
-
Linux バイナリ実行できない "...
-
Javascriptグローバル変数の値...
-
Vb.netのグローバル変数の宣言...
-
VC++のちらつき防止方法
-
同じIDで定義した要素の配列を...
-
ASP.NET MVCでObjectをjsに渡す
-
window.openでタイトル名の指定
-
C#テキストボックスの文字を配...
-
jspからjavascriptの変数引継ぎ
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【正規表現】【javascript】CR...
-
Boolean型配列中のTrueの有無を...
-
ASP+アクセスでのSQLコメントに...
-
HTTPSのとき":"が"%3A"ではなく...
-
Linux バイナリ実行できない "...
-
MFCのキャプション変更
-
Excel VBA の ChangeFileAccess
-
Vb.netのグローバル変数の宣言...
-
「オブジェクトが必要です。」...
-
【Jquery】changeイベント毎にa...
-
static constメンバ変数(配列)...
-
ボタンをクリックすると数が増...
-
同じ型【ハイフンと数字】だけ...
-
C# .NET DataGridView の行を追...
-
正規表現で半角数字1桁のみを全...
-
2次元のJSON形式の配列の展開
-
複数ファイルで使うグローバル...
-
C言語でクロージャを記述する
-
引数付きコンストラクタでコン...
-
c言語についての質問です。
おすすめ情報