• ベストアンサー

voidについて

いつもお世話になってます。 最近プログラミングの授業に全然ついていけなくて、1から勉強しようと思ってます。 今回はvoidについて質問なのですが、たとえば下のようなプログラムがあるとします(あえてabcとcdfとxyzを使い分けています。) 数字を入力するとプロトタイプ宣言した関数で足して戻り値が答え(←日本語あってますか?)ってことですよね? 私はvoid関数についてあまり理解できていないので、void関数ではどのように数字が動いているかとどれを一致させなければいけないのかをabcdefxyzを使って詳しく解説していただきたいです。 あと関数の起動の仕方(←日本語あってますか?)も教えていただきたいです。      c=tasu(a,b); printf("%lg\n",c);という方法とか      tasu(a,b); ←これだけとか )   文章ぐだぐだで申し訳ないです。 どなたかおねがいいたします。   ) #include<stdio.h> void tasu(double x, double y, double z); int main(void){ double a,b,c;      printf("1つ目の数字を入力>"); scanf("%lg", &a); printf("2つ目の数字を入力>"); scanf("%lg", &b); c=tasu(a,b); printf("%lg\n",c); return 0; } void tasu(int x, int y, int z) { d = e + f; }

質問者が選んだベストアンサー

  • ベストアンサー
  • hisa1972
  • ベストアンサー率53% (268/500)
回答No.1

void で宣言(定義)する関数は、「戻り値がない」 という意味です。 主に、処理するだけで結果を返す必要のない場合に使います。 void func(int a,int b) { printf("%d+%d=%d",a,b,a+b); return ; } また、 void tasu(double x,double y,double z); の宣言がある状態で、 void tasu(int x,int y,int z) 宣言と定義が合っていない為、文法上誤りになります。 また、main の中で、 tasu(a,b) を呼び出しているようですが、 「関数の引数が不足している」エラーが発生します。 宣言で3個の値を指定している以上、 tasu(a,b,0) などのように、ダミーの値を入れる必要があります。

その他の回答 (3)

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.4

( #3 の「補足」) >for文のところにx++やs++を入れるとエラーがでます。  「エラー」はでませんでした(BorlandC++5.5.1)。  「入れ」ただけで、正常?に実行できました。   void input_data( PERSONAL_DATA *x, int y )   {     int i;     for( i = 0; i < 10 && i < y; i++, x++ ){ 修正       ・       ・   void output_data( PERSONAL_DATA *s, int t )   {     int j;     for( j = 0; j < 10 && j < t; j++, s++ ){ 修正       ・       ・

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

・main で最後に何も値を返していない ・input_data, output_data に対する第1引数の型が間違っている (*a ではなく a であるべき, か) ・output_data で x++; という文があるが x が宣言されていない あたりは「間違い」と言えるところ. 一度コンパイルしてみましたか? コンパイルしていれば, この辺は指摘されているはずです. コンパイルしていないのであれば, コンパイルしてから出すようお願いします. あとは main の中で a=b; としている理由が不明.

346mouse
質問者

補足

修正してみました。 コンパイルは通るのですが、最後に入力したデータが人数分出てしまいます。(AさんとBさんのデータを入力するとBさんのデータが2つ出る状態…) for文のところにx++やs++を入れるとエラーがでます。 どーしたらいいでしょう? #include<stdio.h> #include<stdlib.h> typedef struct{ char name[10]; int age; double height; double weight; double bmi; }PERSONAL_DATA; void input_data(PERSONAL_DATA *x, int y); void output_data(PERSONAL_DATA *s, int t); int main(int argc, char* argv[]){ PERSONAL_DATA *a,*b; int num; if(argc!=2){ printf("Usage ./test number\n"); exit(1); } num=atoi(argv[1]); b=(PERSONAL_DATA*)malloc(sizeof(PERSONAL_DATA)*num); a=b; input_data(a,num); a=b; output_data(a,num); free(b); } void input_data(PERSONAL_DATA *x, int y){ int i; for(i=0;i<10&&i<y;i++){ printf("name%d>" ,i+1); scanf("%s" ,&x->name); printf("age%d>" ,i+1); scanf(" %d" ,&x->age); printf("height%d[m]>" ,i+1); scanf(" %lf" ,&x->height); printf("weight%d[kg]>" ,i+1); scanf(" %lf" ,&x->weight); x->bmi=x->weight/(x->height*x->height); } } void output_data(PERSONAL_DATA *s, int t){ int j; for(j=0;j<10&&j<t;j++){ printf("NAME%d:%s\n" ,j+1,s->name); printf("AGE%d:%d\n" ,j+1,s->age); printf("HEIGHT%d:%.1lf\n" ,j+1,s->height); printf("WEIGHT%d:%.1lf" ,j+1,s->weight); printf("BMI%d:%.2lf\n" ,j+1,s->bmi); } }

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

>c=tasu(a,b); このように、tasu関数の結果を変数に代入する場合は、 >void tasu(int x, int y, int z) tasu関数の戻り値の型がvoidではいけません。 >d = e + f; 変数は定義してから使わなければなりません。 もっとも、当該関数においては、x, y, zを使えばよくて、 d, e, fは不要ですね。

346mouse
質問者

補足

回答ありがとうございます。 参考にして↓のプログラム作ったのですがどうでしょうか? 問題があればご指摘おねがいします。 内容はコマンドライン引数で指定した人数分だけデータを入力して構造体にそれぞれ格納して(input_dataで) データを格納しているPERSONAL_DATA型構造体のアドレスと人数(データ数)を引数として受け取り,個人データを出力する(output_dataで)プログラムです。 おねがいします。 #include<stdio.h> #include<stdlib.h> typedef struct{ char name[10]; int age; double height; double weight; double bmi; }PERSONAL_DATA; void input_data(PERSONAL_DATA *x, int y); void output_data(PERSONAL_DATA *s, int t); int main(int argc, char* argv[]){ PERSONAL_DATA *a,*b; int num,i; char person[10]; if(argc!=2){ printf("Usage ./test number\n"); exit(1); } num=atoi(argv[1]); b=(PERSONAL_DATA*)malloc(sizeof(PERSONAL_DATA)*num); a=b; input_data(*a,num); a=b; output_data(*a,num); free(b); } void input_data(PERSONAL_DATA *x, int y){ int i; for(i=0;i<10&&i<y;i++){ printf("name%d>" ,i+1); scanf("%s" ,&x->name); printf("age%d>" ,i+1); scanf(" %d" ,&x->age); printf("height%d[m]>" ,i+1); scanf(" %lf" ,&x->height); printf("weight%d[kg]>" ,i+1); scanf(" %lf" ,&x>weight); x->bmi=x->weight/(x->height*x->height); x++ } void output_data(PERSONAL_DATA *s, int t){ int j; for(j=0;j<10&&j<t;j++){ printf("NAME%d:%s\n" ,j+1,s->name); printf("AGE%d:%d\n" ,j+1,s->age); printf("HEIGHT%d:%.1lf\n" ,j+1,s->height); printf("WEIGHT%d:%.1lf" ,j+1,s->weight); printf("BMI%d:%.2lf\n" ,j+1,s->bmi); x++ }

関連するQ&A

専門家に質問してみよう