🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

964閲覧

構造体による関数について

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2019/10/26 19:18

編集2019/10/26 19:20

前提・実現したいこと

Record input(void) : 標準入力(キーボード)から構造体への入力
void output(Record) : 構造体内容の標準出力への出力(ディスプレイへの表示)
int main() : 構造体変数 data を定義する。 input と output をそれぞれ1回づつ呼ぶ
上記のことをしたいのですがわかりません。
ご教授のほどよろしくお願いします。

発生している問題・エラーメッセージ

error: parameter name omitted void output(Record){

C言語

1 void output(Record)

試したこと

該当部分のvoidを変更したり様々なことを試しましたがエラーがなくなることはありませんでした。

#コード
typedef struct {
char familyname[20];
char firstname[20];
int birthday[3];
int gender;
} Record;

include <stdio.h>
include "prog01.h"
Record input(void);
void output(Record);

int main(){
Record data;

Record input(void);
void output(Record);

return 0;
}

Record input(void){
Record data;
printf("データを入力して下さい\n");

printf("名前(姓) ->");
scanf("%s",data.familyname);
printf("名前(名) -> ");
scanf("%s",data.firstname);

printf("生まれた年(西暦) -> ");
scanf("%d",&data.birthday[0]);

printf("生まれた月 ->");
scanf("%d",&data.birthday[1]);

printf("生まれた日 ->");
scanf("%d",&data.birthday[2]);

printf("性別(0:男性,1:女性) ->");
scanf("%d",&data.gender);

return data;
}

void output(Record){
Record data;
printf("名前(姓):");
printf("%s",data.familyname);
printf("\n");
printf("名前(名):");
printf("%s",data.firstname);
printf("\n");
printf("生年月日:%d年 %d月%d日",data.birthday[0],data.birthday[1],data.birthday[2]);
if(data.gender==0) printf(" (男性)\n");
else printf(" (女性)\n");
}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

C

1typedef struct { 2 char familyname[20]; 3 char firstname[20]; 4 int birthday[3]; 5 int gender; 6} Record; 7 8#include <stdio.h> 9Record input(void); 10void output(Record); 11 12int main() { 13 Record data; 14 data = input(); 15 output(data); 16 return 0; 17} 18 19Record input(void){ 20 Record data; 21 printf("データを入力して下さい\n"); 22 printf("名前(姓) ->"); 23 scanf("%s",data.familyname); 24 printf("名前(名) -> "); 25 scanf("%s",data.firstname); 26 printf("生まれた年(西暦) -> "); 27 scanf("%d",&data.birthday[0]); 28 printf("生まれた月 ->"); 29 scanf("%d",&data.birthday[1]); 30 printf("生まれた日 ->"); 31 scanf("%d",&data.birthday[2]); 32 printf("性別(0:男性,1:女性) ->"); 33 scanf("%d",&data.gender); 34 return data; 35} 36 37void output(Record data){ 38 printf("名前(姓):"); 39 printf("%s",data.familyname); 40 printf("\n"); 41 printf("名前(名):"); 42 printf("%s",data.firstname); 43 printf("\n"); 44 printf("生年月日:%d年 %d月%d日",data.birthday[0],data.birthday[1],data.birthday[2]); 45 if(data.gender==0) 46 printf(" (男性)\n"); 47 else 48 printf(" (女性)\n"); 49}

投稿2019/10/26 23:49

episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2019/10/27 13:10

なんでこれがベストアンサーなんでしょね?
guest

0

構造体を引数として渡す場合はポインタを引数に渡す必要があります。エラー内容はそのことを言っているのだと思います。
最初にmain関数で宣言した変数dataを使うには以下のコードのように返り値は必要ありません。
関数にポインタを渡すことにより、関数内でdataが更新された場合、元のデータが更新されます。(コピーではないということです。)
それに合わせて、他の関数も変えてみてください。

C

1int main(){ 2 Record data; 3 4 input(&data); 5 output(&data); 6 7 return 0; 8} 9void input(Record* data) { 10... 11

補足:

コメントでご指摘いただいたように、一般的には参照渡しですが、値を渡すこともできます。
ご参考まで:値渡しか、参照渡しか

投稿2019/10/26 19:38

編集2019/10/26 20:14
ryuii

総合スコア438

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2019/10/26 19:58

〉ポインタを引数に渡す必要があります。 構造体は値渡しや復帰値として使用できます(負荷を考えればポインタのほうが良いのですが・・・) →http://flute.u-shizuoka-ken.ac.jp/~s-okubo/class/language/006.htmの「構造体と関数」
ryuii

2019/10/26 20:04

はい、そうですね。用途によってはコピーもありえますね。修正します。ありがとうございます。
dodox86

2019/10/27 02:56

細かくてすみません。参考にあげられた解説はC++のもので、参照渡しはC++での「&」について説明されています。まとめの部分で補足がありますが、C言語とC++では「参照渡し」と言う用語の扱いに注意が必要だと思います。
ryuii

2019/10/27 07:48

ご指摘ありがとうございます。そのとおりで、C言語とC++が混同していました。ポインタは、メモリに格納されているアドレスをもった変数だと思っていて、「参照渡し」という用語は、変数のメモリ上のアドレスを渡すものだと思っていました。参照渡しはC言語ではなく、C++の用語のようですね。アンパサンドもつけるかつけないかも違うようですね。なにか良い説明のリンクがあれば、おしえてください。一応、回答はのこしておきます。
dodox86

2019/10/28 00:32 編集

> なにか良い説明のリンクがあれば、おしえてください。 C言語の値渡しと何々渡しはご存じのように「call by value」と「call by reference」から来ているはずで、この言葉自体はC言語以外でも使われるものですが、「call by reference」の方はC言語では私も含めて「ポインタ渡し」「アドレス渡し」などと呼ぶことが多い気がします。 正式な、と言うより慣例的に、な感もあるので、私としては参考に成り得る外のサイト様の説明の紹介をするのは、ちょっとはばかられます。(<ちょっと大げさ) このteratailでも過去、C言語とC++の「参照」について、更に他のプログラミング言語も含めて、活発な質問回答がありました。 中にはかなり圧巻なものもあり、少なくとも個人的には興味深く、参考になりました。C言語から離れてしまいますが、「何のプログラミング言語について参照を語っているか」に注意して読むと、文化的背景が垣間見えるようで、面白いです。
ryuii

2019/10/28 01:10

ご丁寧にありがとうございます!値か参照か、C言語からはじめたので、復習しておきます。当時はメモリの容量も限られていて、1キロバイトもない感じでした。それはそれで面白かったです。今後もプログラミング自体を楽しんでいきたいものです。
guest

0

Cの構文を勉強して下さい。
例えば・・・main()内の・・・
Record input(void);
void output(Record);
↑はプロトタイプ宣言です。
また、void output(Record){・・・は、void output(Record data) なのでは?

投稿2019/10/26 19:29

編集2019/10/26 19:30
cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2019/10/26 19:47 編集

細かいことまで見ていませんが、関数呼び出し時のパラメータの記述や復帰値の受け取り方に問題が有るようです。 環境が書かれていないようですが、コンパイラの警告レベルを上げて、頭から潰しましょうd^^ 参考:「エラーメッセージの読み方と対処, 検索や質問の原則」↓ https://qiita.com/cannorin/items/eb062aae88bfe2ad6fe5
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問