こんばんは。現在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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【正規表現】【javascript】CR...
-
「オブジェクトが必要です。」...
-
Boolean型配列中のTrueの有無を...
-
ASP+アクセスでのSQLコメントに...
-
正規表現で半角数字1桁のみを全...
-
HTTPSのとき":"が"%3A"ではなく...
-
Excel VBA の ChangeFileAccess
-
別のSubで宣言されている変数を...
-
Linux バイナリ実行できない "...
-
https化に伴う .htaccess の記...
-
Vb.netのグローバル変数の宣言...
-
同じIDで定義した要素の配列を...
-
ActiveXobjectが作成できない
-
jspからjavascriptの変数引継ぎ
-
google apps scriptの終了のさせ方
-
関数でy=g(x)のgとは何の略です...
-
ジェネレーターの作り方
-
javascriptの基本的なことだと...
-
JavaScript を使ってpkゲームを...
-
ASP.NETのコントロールの値をJa...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Linux バイナリ実行できない "...
-
【正規表現】【javascript】CR...
-
ASP+アクセスでのSQLコメントに...
-
Boolean型配列中のTrueの有無を...
-
Excel VBA の ChangeFileAccess
-
ボタンをクリックすると数が増...
-
static constメンバ変数(配列)...
-
HTTPSのとき":"が"%3A"ではなく...
-
Vb.netのグローバル変数の宣言...
-
【Jquery】changeイベント毎にa...
-
C# .NET DataGridView の行を追...
-
javascriptで文字挿入でtoggle...
-
「オブジェクトが必要です。」...
-
引数付きコンストラクタでコン...
-
onclick指定関数の引数へローカ...
-
-(ハイフン)_(アンダーバー)の...
-
Inherits EventArgsの初期化
-
こんなこともJavaScriptで可能...
-
ifreamをリロードしたい
-
複数ファイルで使うグローバル...
おすすめ情報