• 締切済み

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

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

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

余談だけど, このプログラムの makeArray にバグがいることは分かってますよね? そもそも makeArray で sinMakeArray とか定義したら外にあるやつにアクセスできないんだけど, それをおいたとしても.

mayakanatan2204
質問者

お礼

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

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

makearray.hをインクルードしているソースファイルが他にもあるんでしょう。 ヘッダファイルで実体を定義している場合、そのヘッダファイルを複数のソースでインクルードすると多重定義になります。 定義の仕方次第にはなりますが、多重定義になればリンク時にエラーとなるでしょう。 どれ(どのソースファイル内の実体)を使えばいいのか判別できませんから。 なお…この場合のインクルードガードは期待する動作をしませんのでご注意を。 # 翻訳単位が異なりますから想定しているインクルードガードと動作が異なります。

mayakanatan2204
質問者

お礼

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

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

とりあえず本題以前に確認したいんだが, この質問のタイトルの 「識別子が定義されていません」 と本文中にある 「_sinMakeArray は既に main.obj で定義されています」 とは一体どのような関係がある? ちなみに角度の単位の「ラジアン」のスペルは radian だからね.

mayakanatan2204
質問者

お礼

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

mayakanatan2204
質問者

補足

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

関連するQ&A

  • 2つのcppファイルから

    1つのexeファイルを作る必要性が出てきました。 (現在質問中の質問に関連しています。) 例えば file.cpp: #include<iostream> using namespace std; void Output(int x) { cout<<x<<endl; } void main(void) { for(int i=0;i<9;Output(i++)); } をコンパイルリンクすれば済むことを file1.cpp: #include<iostream> using namespace std; void Output(int x) { cout<<x<<endl; } file2.cpp: void main(void) { for(int i=0;i<9;Output(i++)); } という風に分かれているファイルをコンパイルリンクしなければならないのです。 cpp -e file.exe -c file1.cpp -c file2.cpp ではエラーになります。 どうすれば良いのでしょうか?

  • 教えてください

    #include<iostream> using namespace std; int main() { int i; double a[5]; for(i = 0; i < 5; i++){ a[i] = 0.0; } for(i = 0; i < 5; i++) cout << "a[" << i << "] = " << a[i] << "\n"; return 0; } どこが違うんでしょうか? 出力を0.0にしたいんですけど ならないので教えてください。

  • 【C++】複素数で配列を使いたい

    昨日QNo.3714177で「複素数complex.hがおかしいのでしょうか?」 と言うタイトルで質問させて頂いた、C言語初心者です。 お世話になっております。 今日一日中やっており、C++も少しは理解できるようになったぞっと思った矢先、またまた、問題が発生しました。 複素数の中で、配列を使おうとするとエラーが発生します。 ソースは以下の通りです。上段に私が書いたもの、下段に前回の質問時に教えて頂き、動いたものを記載しております。 どこが間違えているのか教えて頂きたく思います。 よろしくお願い致します。 ============================================================================================================ #include <iostream> #include <iomanip> #include <complex> using namespace std; int main () { int i; for (i=0; i<3; i++) { std::complex <double> Z[i] (i,i); std::cout << "Z[" << i << "]= " << Z[i] << "\n"; } return 0; } //ここより下のみでは動きます。 #if0 #include <iostream> #include <complex> int main() { std::complex<double> x(1.2, 3.4); std::complex<double> y(5.6, 7.8); std::cout << "x = " << x <<"\n"; std::cout << "x = " << y <<"\n"; } #endif ============================================================================================================ Borland C++ 5.6 for Win32 Copyright (c) 1993, 2002 Borland keisan.cpp: エラー E2313 keisna.cpp 11: 定数式が必要(関数 main() ) エラー E2034 keisna.cpp 11: 'int' 型は 'complex<double>[1]' 型に変換できない(関数 main() ) エラー E2293 keisna.cpp 11: ) が必要(関数 main() ) *** 3 errors in Compile ***

  • 関数呼び出しについて

    今cygwin 上でC++の勉強をしているのですが 以下の2つのプログラムの違いがよくわかりません どなたかよろしくお願いします <プログラム1> #include<iostream> using namespace std; int a(); int main(){ cout << abs();  return 0;} int a(){ cout << "test\n";  return 1;} <プログラム2> #include<iostream> using namespace std; int a(int i); int main(){ cout << a(1);  return 0;} int a(int i){ cout << "test\n";  return i;} プログラム1では関数a()内の"test"が出力されるのですが プログラム2ではa(int i)内の"test"は出力されません。 この違いはどこにあるのでしょうか? 同じプログラムでint a() と int a(int i)を double a() と double a(double d)にすると この違いは生じません。なぜaの戻り値をint に設定したときだけ この違いが生じるのでしょうか?

  • 初心者です。エラーが分かりません。

    エラーが二つ出てしまいます。 自分ではよく分からなく、図々しく質問しました。 誰か助けてください。 #include<iostream> using namespace std; double fan(double,double angle=360.0); /* angleはデフォルト360 */ double fan(double r, double angle){ return 3.1415926*r*r*angle/360.0; /* 面積を返す */ } int main(void){ double r,angle; cout << "半径を入力してください。 : "; cin >> r; cout << "角度を入力してください。 : "; cin >> angle; cout << "半径 : " << r << " 角度 : " << angle << endl; cout << "面積 : " << fan(r,angle) << endl << endl; cout << "半径 : " << r << " の円なら" << endl; cout << "面積 : " << fan(r) << endl; return 0; }

  • アドバイスお願いします

    二つの顔文字を横移動しながら交互に変換したいんですけど 横移動しながら変換できるようにはなったんですけど 一番最初に顔文字が残ってしまい不自然なんですけどどうすれば消えるでしょか?アドバイスお願いします #include<iostream> using namespace std; int main() { int i,k,t; char str[] = "(~~)"; char str2[] = "(<>)"; for(i = 1; i < 10; i++){ cout << " "; for(k = 0; k < i; k++){ cout << " "; } for( t = 0; t < 2000; t++ ) if( i % 2 == 0 ){ cout << str; cout << '\r'; }else{ cout << str2; cout << '\r'; } } cout << "\n"; return 0; }

  • 配列の要素

    #include <iostream> using namespace std; int main() { int n[10] ={1,2,3,4,5,6,7,8,9,10}; int i; for(i = 0; i < 10; i++){ cout << "a[" << i << "] = " << n[i] << endl; } return 0; } ここまでは完成することはできたのですが この要素の並びをシャッフルしてランダムな順に並び変える方法がわかりません。

  • c++での入出力がうまくいきません;

    初心者ですが独習c++でプログラミングについて勉強している者です。 なんとか環境設定もできたと思いきや、うまくコンパイルすることができなくて困っています。具体的には、 #include <iostream> using namespace std; int main() { int i, j; double d; i = 10; j = 20; d = 99.101; cout << "値を表示: "; cout << i << ' ' << j << ' ' << d; return 0; } という値を表示するプログラムではコンパイルもうまくいったのですが、次の #include <iostream> using namespace std; int main() { int i; cout << "値を入力: "; cout >> i; cout << "入力した値: " << i << "\n"; return 0; } という入力のプログラムをコンパイルしようとすると、コマンドプロンプトに演算子が使われたクラス ostream では int型の定義が存在しないとなりコンパイルエラーとなってしまいます。 理由が考えてもわからないので、質問してみました。 どのようにすれば、このエラーを解消できるのか知りたいので、どうかご意見をよろしくお願いします。

  • 単純挿入法を入れたいんですけど・・・

    #include <iostream> #include <iomanip> #include <cstdlib> //rand関数を使うので using namespace std; void Sort(int *s, int n); //プロトタイプ int main() { const int N = 100; int a[N], i, r, temp; for(i = 0; i < N; i++) a[i] = i; for(i = 0; i < N; i++){ r = rand() % N; temp = a[i]; a[i] = a[r]; a[r] = temp; } cout << "整列前\n----\n"; for(i = 0; i < N; i++) cout << setw(4) << a[i]; cout << '\n'; Sort(a, N); cout << "整列後\n----\n"; for(i = 0; i < N; i++) cout << setw(4) << a[i]; cout << '\n'; return 0; } void Sort(int *s, int n) { //この部分を補って完成させること }

  • C++でどうすればcoutで表示できるのですか?

    C++についての質問です coutで表示するときに kannsuu関数の返り値を main関数とmain関数の cout << ++kannsuu(i) << endl; の部分を変更せずに kannsuu関数のみを変更して インクリメントして「2」と表示したいのですが どのようにすればいいですか? #include <iostream> using namespace std; int kannsuu(int i) {return i;} int main() { int i = 1; cout << ++kannsuu(i) << endl; return 0; }

専門家に質問してみよう