質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.37%
C

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

Q&A

解決済

3回答

5728閲覧

構造体とポインタが絡んだC言語の関数について

kk_22

総合スコア3

C

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

0グッド

0クリップ

投稿2021/06/18 06:08

前提・実現したいこと

C言語に関する質問です。

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

void calc(int n, int d[], ANS *ans)関数の中で、変数ansに対して、

式には構造体または共用体型を使用する必要がありますが、型 "ANS *" が使用されています

というエラーが出ます。

該当のソースコード

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <time.h> 4 5typedef struct { 6 int min, max; 7 double ave; 8} ANS; 9 10/*関数プロトタイプ宣言*/ 11int data[1000]; 12void calc(int n, int d[], ANS *ans); 13 14/*メイン関数*/ 15int main(void) { 16 int n = 999; 17 int num; 18 ANS ans; 19 srand(time(NULL)); 20 num = gene(n, data); 21 calc(n, data, &ans); 22 printf("最小=%5d 最大=%5d 平均=%.2f¥n", ans.min, ans.max, ans.ave); 23 return 0; 24} 25 26/*関数*/ 27void calc(int n, int d[], ANS *ans) { 28 ans.max = 0; 29 ans.min = 10000; 30 int sum = 0; 31 for (int i = 0; i < sizeof(d); i++) { 32 if (ans.max > d[i]) { 33 ans.max = d[i]; 34 } 35 if (ans.min < d[i]) { 36 ans.min = d[i]; 37 } 38 sum += d[i]; 39 } 40 ans.ave = (double)sum / 999; 41}

###試したこと
void calc関数の一行目に

struct ANS *ans;

を追記するなどしました。

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

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

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

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

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

guest

回答3

0

ANS *ans に対して,
ans.max とかいう記述がおかしい,という話.
ans->max とすべきところ.文法の問題なので復習されたい.

投稿2021/06/18 06:14

編集2021/06/18 06:15
fana

総合スコア11954

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

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

0

環境はどうなっているのでしょうか? コンパイラとか。

Visual studio 2019 でコンパイルすると、

error C2231: '.max': 左のオペランドが 'struct' へのポインターです。'->' を使用してください。

calc() の引数では、ANS *ansとなっているのに、ans.max としているのは間違いですね。
ans->max または、 (*ans).max とすべきですね。 (同様の問題、複数個所)

投稿2021/06/18 06:18

pepperleaf

総合スコア6385

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

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

pepperleaf

2021/06/18 06:43

最後に"(同様の箇所 複数)" と書いたつもりが消えてる。どうした? 修正画面には現れるのに。 (と書くと現れるか?)
guest

0

ベストアンサー

calc内でansの型はANS*なので要素にアクセスするならans->maxとか(*ans).maxとしなければいけません。

ちなみに質問とは違いますが、sizeof(d)はいくらでしょう?

投稿2021/06/18 06:15

編集2021/06/18 06:27
neconekocat

総合スコア443

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

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

pepperleaf

2021/06/18 06:29

残念 "*ans.max"は NG "(*ans).max" しないとダメですね。 "sizeof(d)" は気づかなかった。 ポインタサイズだったと思うけど、、と思って、修正、コンパイルと思ったが、 不足関数(gene)があるので、コンパイルできない。
neconekocat

2021/06/18 06:38

*の方は書いた後に思い出して修正しました。
kk_22

2021/06/18 07:02

すみません、院試の過去問で久々にC言語に触れてエラー処理できなくて詰まっていました。 Pythonのlen(d)みたいに、sizeof(d)で配列の長さを返すものだと思っていました。 大変助かりました。ありがとうございました。
neconekocat

2021/06/18 07:08

補足するとsgzeofが配列の長さを返すのも正しい認識です。 引数として配列を渡した場合は単なるポインタとして扱われるため、要素数を取得できなくなるというものです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問