- 締切済み
識別子が定義されていませんとエラーします。
VisualStudio2013でプログラミングしてます。 プログラミング初心者です。 以下のようなプログラムを組んだのですが、ソリューションのビルドをすると [エラー 1 error LNK2005: _sinMakeArray は既に main.obj で定義されています] [エラー 1 error 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; }
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- Tacosan
- ベストアンサー率23% (3656/15482)
余談だけど, このプログラムの makeArray にバグがいることは分かってますよね? そもそも makeArray で sinMakeArray とか定義したら外にあるやつにアクセスできないんだけど, それをおいたとしても.
- Wr5
- ベストアンサー率53% (2173/4061)
makearray.hをインクルードしているソースファイルが他にもあるんでしょう。 ヘッダファイルで実体を定義している場合、そのヘッダファイルを複数のソースでインクルードすると多重定義になります。 定義の仕方次第にはなりますが、多重定義になればリンク時にエラーとなるでしょう。 どれ(どのソースファイル内の実体)を使えばいいのか判別できませんから。 なお…この場合のインクルードガードは期待する動作をしませんのでご注意を。 # 翻訳単位が異なりますから想定しているインクルードガードと動作が異なります。
お礼
頂いた回答を参考に作り直してみましたところ正しく動かすことができました。 ありがとうございました。
- Tacosan
- ベストアンサー率23% (3656/15482)
とりあえず本題以前に確認したいんだが, この質問のタイトルの 「識別子が定義されていません」 と本文中にある 「_sinMakeArray は既に main.obj で定義されています」 とは一体どのような関係がある? ちなみに角度の単位の「ラジアン」のスペルは radian だからね.
お礼
解決することができました。 多重定義が問題だったようです。 間違いの多い質問にもかかわらず返信をくださりありがとうございました。
補足
返答ありがとうございます。 すみません。 私の間違いでした。 「識別子が定義されていません」のエラーは出ていませんでした。 こちらの「_sinMakeArray は既に main.obj で定義されています」が解決してないものです。 ラジアンの指摘もありがとうございました。 以後気をつけます。
お礼
御助言ありがとうございます。 makeArrayの内容をほぼ全部書き換え、sinMakeArrayのやっていた仕事を中に入れたら 欲しかった値を返してくれるようになりました。 どの範囲まで動いてくれるのかなど、曖昧になってることが多かったです。 勉強になりました。