こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

識別子が定義されていませんとエラーします。

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;
}

投稿日時 - 2014-01-30 00:55:52

QNo.8453021

困ってます

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

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

そもそも makeArray で sinMakeArray とか定義したら外にあるやつにアクセスできないんだけど, それをおいたとしても.

投稿日時 - 2014-01-30 17:39:22

お礼

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

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

投稿日時 - 2014-01-30 23:31:32

ANo.2

Wr5

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

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

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

投稿日時 - 2014-01-30 09:04:28

お礼

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

投稿日時 - 2014-01-30 14:45:27

ANo.1

とりあえず本題以前に確認したいんだが, この質問のタイトルの
「識別子が定義されていません」
と本文中にある
「_sinMakeArray は既に main.obj で定義されています」
とは一体どのような関係がある?

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

投稿日時 - 2014-01-30 01:23:01

補足

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

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

投稿日時 - 2014-01-30 13:38:47

お礼

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

投稿日時 - 2014-01-30 14:47:55