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

VisualStudio2013でプログラミングしてます。
プログラミング初心者です。
以下のようなプログラムを組んだのですが、ソリューションのビルドをすると
[エラー1error LNK2005: _sinMakeArray は既に main.obj で定義されています]
[エラー1error LNK2005: _cosMakeArray は既に main.obj で定義されています]
というエラーが出ます。
何が原因かわかる方がいらっしゃいましたら教えてください。
お願いします。

■ファイル名[makearray.cpp]
#include <iostream>
using namespace std;

double getRazian(int);

void makeArray(){
double sinMakeArray[360], cosMakeArray[360];
for (int i = 0; i <= 180; i++){
double R = getRazian(i);
double R2 = R*R;
int k = 1;
double dev = 1.0;
double value = R;
double delta;
do{
R *= R2;
dev *= 2 * k*(2 * k + 1);
k++;
delta = R / dev;
value += delta*((k % 2) == 0 ? -1 : 1);
} while (delta / value > 1.0);
sinMakeArray[i] = value;
}
for (int i = 180; i <= 360; i++){
sinMakeArray[i] = sinMakeArray[i - 180] * -1;
}
for (int i = 0; i <= 90; i++){
cosMakeArray[i] = sinMakeArray[90 - i];
}
for (int i = 90; i <= 180; i++){
cosMakeArray[i] = cosMakeArray[180 - i] * -1;
}
for (int i = 180; i <= 360; i++){
cosMakeArray[i] = cosMakeArray[360 - i];
}
}

double get_sinMakeArray(int pp){
return sinMakeArray[pp];
}

double get_cosMakeArray(int pp2){
return cosMakeArray[pp2];
}

■ファイル名[main.cpp]
#include <iostream>
#include "makeArray.h"
using namespace std;

double getRazian(int degree);

int main(){
cout << getRazian(999) << '\n';
cout << get_sinMakeArray(180) << '\n';
cout << get_cosMakeArray(180) << '\n';
}

■ファイル名[makearray.h]
#ifndef MAKEARRAY_INCLUDE
#define MAKEARRAY_INCLUDE
extern"C"{
double sinMakeArray[360], cosMakeArray[360];
void makeArray();
double get_sinMakeArray(int);
double get_cosMakeArray(int);
}
#endif

■ファイル名[razian.cpp]
#include <iostream>
using namespace std;

double getRazian(int degree){
int degree2;
int degree3 = 0;
double r;
double pi = 3.1415926535;
degree2 = degree % 360;

if (degree2 <= 180){
r = degree2*pi / 180;
}
else{
degree3 = degree2 - 180;
r = degree3*pi / 180;
}
return r;
}

A 回答 (3件)

余談だけど, このプログラムの makeArray にバグがいることは分かってますよね?



そもそも makeArray で sinMakeArray とか定義したら外にあるやつにアクセスできないんだけど, それをおいたとしても.
    • good
    • 1
この回答へのお礼

御助言ありがとうございます。

makeArrayの内容をほぼ全部書き換え、sinMakeArrayのやっていた仕事を中に入れたら
欲しかった値を返してくれるようになりました。
どの範囲まで動いてくれるのかなど、曖昧になってることが多かったです。
勉強になりました。

お礼日時:2014/01/30 23:31

makearray.hをインクルードしているソースファイルが他にもあるんでしょう。



ヘッダファイルで実体を定義している場合、そのヘッダファイルを複数のソースでインクルードすると多重定義になります。
定義の仕方次第にはなりますが、多重定義になればリンク時にエラーとなるでしょう。
どれ(どのソースファイル内の実体)を使えばいいのか判別できませんから。

なお…この場合のインクルードガードは期待する動作をしませんのでご注意を。
# 翻訳単位が異なりますから想定しているインクルードガードと動作が異なります。
    • good
    • 1
この回答へのお礼

頂いた回答を参考に作り直してみましたところ正しく動かすことができました。
ありがとうございました。

お礼日時:2014/01/30 14:45

とりあえず本題以前に確認したいんだが, この質問のタイトルの


「識別子が定義されていません」
と本文中にある
「_sinMakeArray は既に main.obj で定義されています」
とは一体どのような関係がある?

ちなみに角度の単位の「ラジアン」のスペルは radian だからね.

この回答への補足

返答ありがとうございます。
すみません。
私の間違いでした。
「識別子が定義されていません」のエラーは出ていませんでした。
こちらの「_sinMakeArray は既に main.obj で定義されています」が解決してないものです。

ラジアンの指摘もありがとうございました。
以後気をつけます。

補足日時:2014/01/30 13:38
    • good
    • 0
この回答へのお礼

解決することができました。
多重定義が問題だったようです。
間違いの多い質問にもかかわらず返信をくださりありがとうございました。

お礼日時:2014/01/30 14:47

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