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

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

新規登録して質問してみよう
ただいま回答率
85.48%
ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

Q&A

解決済

3回答

10457閲覧

C言語 1次元配列 ポインタ

uv-

総合スコア26

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

0グッド

0クリップ

投稿2016/12/16 09:39

実数値の入った配列(要素数任意)を指すポインタと、その配列の要素数を引数をして、平均を出力とする関数問とmain関数を作成し、下記の要素数10の配列の平均を画面に出力する問題です。

1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0

#include<stdio.h>
int func(double *data, int num,double *heikin);
int main(void)
{
double hairetu[10]={1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0};
double average=0;

average=func(double *data,10,&average);
printf("average=%lf",average);

return 0;

}

int func(double *data, int num,double *heikin)

{
int i;
double *heikin=0.0;
for( i=0;i<num;i++)
{*heikin+=data[i];
}
*heikin/=num;
return 0;
}

のようにプログラミングしたところ、下記のようにエラーがでました。
御指摘いただきたいです。

c: In function ‘main’:
c:9: error: expected expression before ‘double’
c:9: error: too few arguments to function ‘func’
c: In function ‘func’:
c:21: error: ‘heikin’ redeclared as different kind of symbol
c:17: error: previous definition of ‘heikin’ was here
c:21: error: incompatible types in initialization

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

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

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

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

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

guest

回答3

0

c: In function ‘main’:
main関数のエラーです。
c:9: error: expected expression before ‘double’
9行目にdoubleなんて使ってるよ。
c:9: error: too few arguments to function ‘func’
9行目のfunc関数の引数の数が合わないよ。doubleって使っててエラーになってるから。

c: In function ‘func’:
func関数のエラーです。
c:21: error: ‘heikin’ redeclared as different kind of symbol
21行目のheikin変数が再定義されてるよ。
c:17: error: previous definition of ‘heikin’ was here
そのheikinn変数が元々宣言されているのは17行目だよ(引数名)
c:21: error: incompatible types in initialization
21行目のdouble型のポインタなのに、数値の0を入れてるよ。

投稿2016/12/16 09:54

ttyp03

総合スコア16998

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

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

uv-

2016/12/16 10:14

意味を全て訳してくださり、ありがとうございます。 助かります。
guest

0

ベストアンサー

average=func(double *data,10,&average);

この行は関数呼び出しではありません。また、この関数は

  • 第一引数は配列の先頭ポインタ
  • 第二引数は配列の個数
  • 第三引数は平均を入れる変数へのポインタ
  • 戻り値は 0 固定

なので、戻り値を average で潰してはいけません。あと func の中で double *heikin となっていますが、こちらも変数宣言であってはいけません。

#include <stdio.h> int make_average(double *data, int num, double *heikin); int main(void) { double hairetu[10]={1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0}; double average=0; make_average(hairetu,10,&average); printf("average=%lf",average); return 0; } int make_average(double *data, int num, double *heikin) { int i; *heikin = 0.0; for( i=0;i<num;i++) { *heikin+=data[i]; } *heikin/=num; return 0; }

投稿2016/12/16 09:54

編集2016/12/16 10:04
mattn

総合スコア5030

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

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

uv-

2016/12/16 10:12

丁寧な解答ありがとうございます。 分からない部分があるので質問させていただきます。 double average=0としていることと、宣言した関数の戻り値が0なことは関連しているのでしょうか。何度もごめんなさい。よろしくお願いします。
mattn

2016/12/16 10:35 編集

答えから言いますと関係ないです。 コードを見せて頂く限り、この関数の戻り値は関数が成功したか失敗したかを返す目的で 0 (正常の意味?)を返しているのだと思います。また double average = 0 している部分ですが、average のアドレスを渡しているのでもし関数内で `*heikin` が更新されない問題があった場合には初期化されていない値が入る可能性があります。 ※現状のコードは無いですが、今後修正などしていくとその様な問題に直面する事がありますので、癖付けた方が良いです。 もしこの関数を「呼び出し成功とか失敗とかいいのでとりあえず平均値を戻り値として返す関数にしたい」という事であればもう少しシンプルに書けます。 コード: http://ideone.com/qDwzcZ
guest

0

ご参考まで

#include<stdio.h>↲ ↲ void func(double *data, int num,double *heikin); ↲ ↲ int main(void) ↲ { ↲ double hairetu[10]={1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0};↲ double average=0;↲ ↲ func(hairetu,10,&average); ↲ printf("average=%lf\n",average);↲ return 0;↲ }↲ ↲ void func(double *data, int num, double *heikin)↲ { ↲ int i; ↲ for(i=0;i<num;i++) {↲ *heikin+=data[i]; ↲ } ↲ *heikin/=num; ↲ return;↲ }↲

投稿2016/12/16 14:33

A.Ichi

総合スコア4070

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問