ページ 11

C言語の構造体についての質問です

Posted: 2017年10月16日(月) 01:24
by おさかなさん

コード:

#include <stdio.h>

typedef struct Three{
  double a;
  double b;
  double c;
} Three;


Three Scan(void);
double CULC(Three t);

int main(void)
{
  Three t;
  double result;

  t.a = Scan();
  t.b = Scan();
  t.c = Scan();

  result = CULC(t);
  printf("3つの数の積は%fです\n", result);

  return 0;
}


//数の入力
Three Scan(void)
{
  Three t;
  printf("3つの数を入力:\n");
  scanf("%lf %lf %lf", &t.a, &t.b, &t.c);
  printf("a = %lf\n", t.a);
  printf("b = %lf\n", t.b);
  printf("c = %lf\n", t.c);

    return (t);
  
}

//積の計算
double CULC(Three t)
{
  double result;

  result = t.a * t.b * t.c;

  return (result);
}


3つの数を読み込んでその積を出すコードで、構造体の練習用につくってみました。
ですが、main関数の
t.a = Scan();
t.b = Scan();
t.c = Scan();

の部分に、 型 ‘double’ への型 ‘Three’ からの代入時に互換性のない型です とエラーメッセージが出てしまいます。
どのように直せばうまくコンパイルできるのでしょうか?
原因というか仕組みも知りたいです。

Re: C言語の構造体についての質問です

Posted: 2017年10月16日(月) 02:01
by みけCAT
Scan関数はThree型のデータを返すので、

コード:

  t.a = Scan();
  t.b = Scan();
  t.c = Scan();
のように分けて代入しようとするのではなく、

コード:

  t = Scan();
のようにThree型の変数に直接代入するようにするといいでしょう。

Re: C言語の構造体についての質問です

Posted: 2017年10月16日(月) 07:30
by Math
つまりWindows10、VS2017では

コード:

#include <stdio.h>

typedef struct tagThree {
	double a;
	double b;
	double c;
} Three;


Three Scan(void);
double CULC(Three t);

int main(void)
{
	Three t;
	double result;
	//////////////////////////
	t=Scan();
	//t.a = Scan();
	//t.b = Scan();
	//t.c = Scan();
	//////////////////////////

	result = CULC(t);
	printf("3つの数の積は%fです\n", result);

	return 0;
}


//数の入力
Three Scan(void)
{
	Three t;
	printf("3つの数を入力:\n");
	scanf("%lf %lf %lf", &t.a, &t.b, &t.c);
	printf("a = %lf\n", t.a);
	printf("b = %lf\n", t.b);
	printf("c = %lf\n", t.c);

	return (t);

}

//積の計算
double CULC(Three t)
{
	double result;

	result = t.a * t.b * t.c;

	return (result);
}

コード:

D:\z17c\c\1016>c

D:\z17c\c\1016>rem コンパイル後リンク

D:\z17c\c\1016>cl /TC c1.c
Microsoft(R) C/C++ Optimizing Compiler Version 19.11.25508.2 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

c1.c
Microsoft (R) Incremental Linker Version 14.11.25508.2
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:c1.exe
c1.obj

D:\z17c\c\1016>rem 実行結果

D:\z17c\c\1016>c1.exe
3つの数を入力:
2 4 6
a = 2.000000
b = 4.000000
c = 6.000000
3つの数の積は48.000000です

D:\z17c\c\1016>
となりますね。

Re: C言語の構造体についての質問です

Posted: 2017年10月17日(火) 11:51
by おさかなさん
まとめて表記したところうまくいきました。
ありがとうございました!