dポイントプレゼントキャンペーン実施中!

C言語初心者なのですが課題で出されたポインタを用いた平均,分散を求めるプログラムを組んでみたのですが,以下のようなエラーが出て正しく出力できません。

Undefined symbols for architecture x86_64:
"_main", referenced from:
implicit entry/start for main executable
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

ソースプログラムは以下のとおりです。詳しい方よろしくお願いいたします。

#include<stdio.h>

double in_data[5] ={1.0,2.0,3.0,4.0,5.0};
double mean = 0.0;
double var =0.0;



void variance(double in_data[],int n,double *mean,double *var){

double sum = 0.0;
for(int i=0;i<n;i++){

sum += in_data[i];

}

*mean = sum / n;

for(int i=0;i<n;i++){
*var += (in_data[i] - *mean)*(in_data[i] - *mean);
}



printf("平均:%f\n",mean);
printf("分散:%f\n",var);

}

A 回答 (3件)

*var を計算する for ループの前で


*var=0;
と初期化しておくのが大人のプログラムだと思う.

あと分散の計算を間違えてる.
    • good
    • 0

以下のようにしてください。


修正個所はコメントを入れています。
内容はチェックしていません。
-----------------------------------
#include<stdio.h>

double in_data[5] ={1.0,2.0,3.0,4.0,5.0};
double mean = 0.0;
double var =0.0;



void variance(double in_data[],int n,double *mean,double *var){

double sum = 0.0;
for(int i=0;i<n;i++){

sum += in_data[i];

}

*mean = sum / n;

for(int i=0;i<n;i++){
*var += (in_data[i] - *mean)*(in_data[i] - *mean);
}

//削除開始
// printf("平均:%f\n",mean);
// printf("分散:%f\n",var);
//削除終了

}

//追加開始
int main(){
variance(in_data,5,&mean,&var);
printf("平均:%f\n",mean);
printf("分散:%f\n",var);
return 0;
}
//追加終了
    • good
    • 0

エラーメッセージを読みとく訓練をしましょう。


上達のコツです。


C言語から実行ファイルができるまでは大きく3つの段階があります。
・マクロの展開や #includeの処理等を行う「前処理」
・前処理されたソースコードを機械語に変換する「(狭義の)コンパイル」
・複数のファイルにちらばっている機械語を一つに結び付ける「リンク」

例えば、 printf ですが、これは純粋な意味では「C言語ではありません」
このプログラムの variance 関数と同じで、誰かがC言語用に作ったものです。
それを、あなたのプログラムと「リンク」させることで、思い通りに出力させることができています。

このときの、関数名等の総称が「Symbol(シンボル)」です。
Undefined symbols というメッセージは、「シンボルが定義されていない」ということです。

リンク先があるかどうかは、実際リンクするときでないとはっきりしません。
なので、(狭義の)コンパイルではエラーにならず、リンク時にはじめて判明します。


この場合、 _main というシンボルが見つからない、と言っています。
コンパイルされた時に、関数名は、 _ を付けたシンボルになります。
つまり、 このメッセージは「 mainをリンクさせようとしたけど見つからない」 と言っています。


このメッセージを元に、プログラムを眺めてみると、確かに main 関数がありません。
C言語では、 実行のスタート地点である main 関数が無ければ、実行ファイルにはできません。
/* この言い方は正確ではありませんが、今は混乱のもとなのでそういうことにしておきます */

「ポインタを用いた平均,分散の求め方」とは無関係です。

・もし、他のファイルに main 関数が記述されているのなら、コンパイルのコマンドラインを変えて、その別ファイルのmain関数を含めるようにする必要があります
(分割コンパイル という手法です)
・もし、このファイルだけで完結するのなら、main関数を追加します。
    • good
    • 2

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このQ&Aを見た人がよく見るQ&A