掲示板ランキング  東洋ハーブ(秋ウコン(秋うこん))  東洋ハーブ(クスリウコン)


掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.6381

関数に渡す際の型の変換がうまくいきません
投稿者---スティッチ(2006/09/03 16:53:48)


 #include <stdio.h>
 #define LIST struct list

 LIST{
     char name[21];
     float tall;
     float weight;
 };
 void data(LIST *);
 float BMI(LIST);
 char *judge(float);
 void prn(LIST *, float, char *);

 main()
 {
     LIST b;
     LIST *a = &b;
     float c;
     char d;
     data(a);
     c = BMI(a);←ココ
     d = judge(c);←ココ
     prn(*a, c, d);←ココ
 }
 void data(LIST *a)
 {
     printf("名前? ");
     scanf("%s", a -> name);
     printf("身長? ");
     scanf("%f", &a -> tall);
     printf("体重? ");
     scanf("%f", &a -> weight);
 }
 float BMI(LIST a)
 {
     float b, x, y;
     x = a.tall / 100;
     y = a.weight;
     b = y / x / x;
     return(b);
 }
 char *judge(float a)
 {
     if(a < 20)
         return("Thin\n");
     else if(a < 25)
         return("Standard\n");
     else
         return("Overweight\n");
 }
 void prn(LIST *n, float b, char *j)
 {
     printf("名前 %s\n", n -> name);
     printf("BMI値 %.2f\n", b);
     printf("判定 %s\n", *j);
 }

ココ、と矢印をつけたところに関して、型があわないと出ます。
アドレス渡し、値渡し、と気をつけて関数に渡しているつもりなのですが、
どう正せばよいのかわかりません。
アドバイスよろしくお願いいたします。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:関数に渡す際の型の変換がうまくいきません 6382 επιστημη 2006/09/03 17:14:45
<子記事> Re:関数に渡す際の型の変換がうまくいきません 6383 nano 2006/09/03 17:37:28


No.6382

Re:関数に渡す際の型の変換がうまくいきません
投稿者---επιστημη(2006/09/03 17:14:45)


#include <stdio.h>
#define LIST struct list

LIST{
  char name[21];
  float tall;
  float weight;
};
void data(LIST *);
float BMI(LIST);
char *judge(float);
void prn(LIST *, float, char *);

なのだから、

  LIST b;
  LIST *a = &b;
  float c;
  char d;

  c = BMI(a);←ココ
BMIの引数はLISTなのにLIST*を渡している

  d = judge(c);←ココ
judgeの戻りはchar*なのにcharで受けている

  prn(*a, c, d);←ココ
prnの第一引数はLIST*なのにLISTを渡している




この投稿にコメントする

削除パスワード

No.6384

どうもありがとうございました。
投稿者---スティッチ(2006/09/03 17:42:07)


επιστημηさん、明確なアドバイスどうもありがとうございました。
おかげでプログラムを仕上げることができました。


この投稿にコメントする

削除パスワード

No.6383

Re:関数に渡す際の型の変換がうまくいきません
投稿者---nano(2006/09/03 17:37:28)


> #define LIST struct list

typedefを使う方が自然でありましょう。
> void prn(LIST *, float, char *);

第一引数をポインター変数にする必要性は、特にありません。
> main()

言語規約上、main関数の戻り値はint型です。
終了時には、何らかの値を戻してあげましょう。
>     LIST b;

変数bの位置づけがよくわかりません。不要のはずです。
>     LIST *a = &b;

変数aは、ポインター変数である必要性がありません。
>     char d;

変数dは、ポインター変数でなければなりません。
>     data(a);

data関数には、aのアドレスを渡してください。
>     c = BMI(a);←ココ
>     d = judge(c);←ココ

上の2行は修正不要となります。
>     prn(*a, c, d);←ココ

第一引数は、aとしてください。
> void prn(LIST *n, float b, char *j)

第一引数を、ポインター変数でなくしてください。
>     printf("名前 %s\n", n -> name);

n.nameとしてください。
>     printf("判定 %s\n", *j);

*jではなく、jです。



この投稿にコメントする

削除パスワード

No.6385

どうもありがとうございました。
投稿者---スティッチ(2006/09/03 18:05:19)


nanoさん、どうもありがとうございました。
いただいたアドバイスのおかげで、プログラムがすっきりしました。

d = judge(c);
に関しては、アドレスを渡すので&cとするようですね。
本当にありがとうございました。


この投稿にコメントする

削除パスワード

No.6386

Re:どうもありがとうございました。
投稿者---nano(2006/09/03 18:26:24)


>d = judge(c);
>に関しては、アドレスを渡すので&cとするようですね。

いいえ。judge関数に渡しているのは、float型変数の「値」ですよね?


この投稿にコメントする

削除パスワード

No.6387

間違えました。
投稿者---スティッチ(2006/09/03 18:35:14)


c = BMI(a)
に関しては、アドレスを渡すので&aとするようですね。
と書きたかったのに間違えてしまいました。
judge関数に渡すのは、おっしゃる通りに値です。


この投稿にコメントする

削除パスワード

No.6388

Re:間違えました。
投稿者---nano(2006/09/03 18:50:30)


>c = BMI(a)
>に関しては、アドレスを渡すので&aとするようですね。

私が提示した内容では、BMI関数に渡すのはLIST型変数の値です。
&は不要です。

[基本的な考え方]
LIST型の変数aが関連する関数群のうち、
aのメンバーに値を代入するのはdata関数だけである。
したがって、data関数にはaのアドレスを渡す。
他の2つの関数(BMIとprn)は、aの内容を読み取るだけなので、
アドレスを渡す必要は特にない(渡すようにしても、間違いではない)。



この投稿にコメントする

削除パスワード

No.6389

Re:間違えました。
投稿者---nano(2006/09/03 18:56:36)


>(渡すようにしても、間違いではない)。

もちろん、プロトタイプ宣言や関数(呼び出し側、呼ばれる側)の実体が
すべてそういうコーディングをしてあれば間違いではない、という意味です。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧





掲示板提供:(有)リアル・インテグリティ