• ベストアンサー

複素数<complex.h>のErrorに関して

初めて質問させて貰います。 質問するにあたり至らない点もあるかもしれませんが、その際は御指摘頂ければ随時訂正していきたいと考えています。 プログラムに関しては素人と考えてください。 複素数を使った計算プログラムを書きたく思い、色々と調べたところcomplexをincludeすれば複素数が定義できるという所まで調べられました。 早速調べたとおりにプログラムを書いてみたのですが、エラーが発生してしまいます。 エラーの示すことも、何故エラーがでたのかも分かりません。 よろしければ、御助言の方よろしくお願いします。 使用ソフト→ Microsoft Visual C++ 2008です。 以下プログラム(num001.cppで保存)→ #include<stdio.h> #include<complex.h> ~以下略 という感じでプログラムを書いたのですが、コンパイルしてみると、以下のようなエラーが発生してしまいます。 以下発生したエラーです→ num001.cpp C:\program\C++5.5\include\complex.h : warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。 データの損失を防ぐために、ファイルを Unicode 形式で保存してください。 C:\program\C++5.5\include\complex.h(3) : warning C4068: 不明なプラグマがありました。 C:\program\C++5.5\include\stdcomp.h : warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。 データの損失を防ぐために、ファイルを Unicode 形式で保存してください。 C:\program\C++5.5\include\compnent.h : warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。 データの損失を防ぐために、ファイルを Unicode 形式で保存してください。 C:\program\C++5.5\include\rw/stddefs.h : warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。 データの損失を防ぐために、ファイルを Unicode 形式で保存してください。 C:\program\C++5.5\include\rw/stddefs.h(3) : warning C4068: 不明なプラグマがありました。 C:\program\C++5.5\include\stdcomp.h : warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。 データの損失を防ぐために、ファイルを Unicode 形式で保存してください。 C:\program\C++5.5\include\rw/stdwind.h : warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。 データの損失を防ぐために、ファイルを Unicode 形式で保存してください。 C:\program\C++5.5\include\rw/stdwind.h(3) : warning C4068: 不明なプラグマがありました。 C:\program\C++5.5\include\rw/stdwind.h(208) :warning C4068: 不明なプラグマがありました。 C:\program\C++5.5\include\rw/stddefs.h(181) :warning C4068: 不明なプラグマがありました。 C:\VC\INCLUDE\xlocale(342) : warning C4530: C++ 例外処理を使っていますが、アンワインド セマンティクスは有効にはなりません。/EHsc を指定してください。 C:\program\C++5.5\include\complex.h(1488) : warning C4068: 不明なプラグマがありました。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.7

まあ、そうですね。C++に行くのも一つの手かも。 ただ、目的にも依りますが、「CからC++に言語を変える」んだったら、いっその事、複素数を最初からサポートしている別言語に変えても良いかもしれませんね。見る限り、オイラーの公式exp(iπ)計算したいだけかもしれませんし。 例えばPython Python: http://www.python.jp/Zope/ だと、 cametan@cametan-laptop:~$ python Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41) [GCC 4.3.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import cmath # 複素数ライブラリをインポート >>> cmath.exp(cmath.pi * 1j) #オイラーの公式 (-1+1.2246063538223773e-16j) >>> とたった2行で結果が出ます。 Ruby: http://www.ruby-lang.org/ja/ でも cametan@cametan-laptop:~$ irb irb(main):001:0> require 'complex' # 複素数クラスを導入 => true irb(main):002:0> Math.exp(Math::PI * Complex::I) => Complex(-1.0, 1.22460635382238e-16) irb(main):003:0> と実質二行ですね。 ANSI Common Lispだと、 CL-USER> (exp (* pi #c(0 1))) ; オイラーの公式 #C(-1.0d0 1.2246063538223773d-16) CL-USER> とたったの一行。 (実装は例えばWindowsならCLISP: http://clisp.cons.org/ とか) Schemeでも、 Welcome to MzScheme v4.2.1 [3m], Copyright (c) 2004-2009 PLT Scheme Inc. > (exp (* pi 0+1i)) ; オイラーの公式 -1.0+1.2246063538223773e-16i > とまたもや1行です。 (実装は例えばWindowsならPLT Scheme: http://www.plt-scheme.org/ とか) まあ、これ考えてみるとcomplex.h探してコンパイルしなきゃなんない、って面倒って言えば面倒ですよね。 他にも、数値演算専用のMatlabと言う言語のクローン、GNU Octaveってのがあって、Windowsでは Octave Workshop: http://www.unige.ch/math/folks/loisel/www.math.mcgill.ca/loisel/octave-workshop/ と言う統合環境があるんですが、これでも、 cametan@cametan-laptop:~$ octave GNU Octave, version 3.0.1 Copyright (C) 2008 John W. Eaton and others. This is free software; see the source code for copying conditions. There is ABSOLUTELY NO WARRANTY; not even for MERCHANTIBILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, type `warranty'. Octave was configured for "i486-pc-linux-gnu". Additional information about Octave is available at http://www.octave.org. Please contribute if you find this software useful. For more information, visit http://www.octave.org/help-wanted.html Report bugs to <bug@octave.org> (but first, please read http://www.octave.org/bugs.html to learn how to write a helpful report). For information about changes from previous versions, type `news'. octave:1> exp(pi * 1i) # オイラーの公式 ans = -1.0000e+00 + 1.2246e-16i octave:2> と、1行で済みますね。 (Octaveに関しては、以下の参考リンクを参照して下さい) まあ、本当に目的にも依るんですが、場合によっては単に「数値計算したい」ってだけならC系で組むより別の言語でやった方が簡易に結果を見れる場合もあります。 参考までに。

参考URL:
http://www.ishida-df.jp/octave/octave.html, http://octave.futene.net/
kitatabi
質問者

お礼

返答ありがとうございます。 あと、返信が遅くなってしまったこと申し訳ありません。 御助言いただいた「言語を変える」ということですが、申し訳ありません、今回はVisualStudioを使わなければいけないので、ご助言は嬉しかったのですが、今回は言語変えは無しの方向で行きたいと思います。 その他にも色々と参考まで出していただき、ありがとうございました。 これからも、よろしければ御助言などいただけたら幸いです。 それでは、ありがとございました。

その他の回答 (6)

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

VisualStudio で複素数を使いたいなら, いっそ C++ にいってしまった方が楽な気がする. というか拡張子が cpp になってるから, コンパイラは C++ だと思っているはず. #include <cstdio> #include <complex> #include <cmath> using namespace std; #ifndef M_PI #define M_PI M_PI const double M_PI = 4*atan(1.0); #endif int main(void){ complex<double> z, x; x = complex<double>(0, M_PI); z = exp(x); printf("real=%f\timag=%f\n", z.real(), z.imag()); return 0; } って感じかな. VisualStudio はもう C の規格についていく気なさそうだし.

kitatabi
質問者

お礼

返答ありがとうございます。 少し返信が遅くなってしまい申し訳ありません。 ソースの提示までしていただき非常に助かります。 cppだとC++を意味しているんですね……すいません、初めてそのことに気付きました。 一度これでやってみます。ありがとうございました。

回答No.5

どうなんでしょうねえ(笑)。 まず、僕が使ったコンパイラはgcc(GNU Compiler Collection)です。 まあ、BCCにもcomplex.hってのがある、って話が出てきましたが、それは使っていません。当然Visual C++でのコンパイルではない、のです。 紹介したminGWってのは、平たく言うと(正確じゃなく端折っていますが)、Windowsで使えるgccです。ですから、再現するにはminGWを入れるのが手っ取り早いだろう、って事ですね。 ええと、今Cの規格、って大まかに言うと3つあるんですよ。詳しくはWikipediaの記事を参照して欲しいんですが、 C言語: http://ja.wikipedia.org/wiki/C%E8%A8%80%E8%AA%9E 今、最新規格は俗称C99って言われているものらしくって、複素数型はこれで追加された模様です。 C99: http://ja.wikipedia.org/wiki/C99 ただ、ネットでザーッと検索した限り、Visual C++はどうやらC99には未対応みたいですね。残念ながら。 一応、complex.hに関する定義は、次のページで解説されています。 9. 標準ライブラリ(新規): http://seclan.dll.jp/c99d/c99d09.htm ただ、これを自分で実装するのは骨が折れるんじゃないでしょうか。メンド臭そうです(笑)。 素直に、C99対応のコンパイラを使った方が良いような気がしますね。僕はBCCは調べてないんですが、もしBCCでcomplex.hが使えるようだったら、それをダウンロードして使ってみるのが一番簡単じゃないか、とは思います。 CodeGearが買収されてから、ページ構成が変わっちゃって良く分かんなくなっちゃってんですが(笑)、多分このページ Download a Trial or Free Version : https://downloads.embarcadero.com/free/c_builder の下から2番目の「C++ Compiler 5.5」ってのがBCC5.5かな?多分。良く分かりませんが(笑)。 まあ、このページはトライアル版かフリー版の提供ページなんで、間違ってダウンロードしてもそんなに酷い結果にはならないんじゃないか、って思うんですが(笑)。 BCCは割に有名で、有志によって次のようなフリーのIDEなんかも作られているんで、Visual C++から乗り換えてもそんなに困んないと思います(少なくとも、複素数絡みが問題だとして、bccでcomplex.hを使えるとすれば)。 CPad: http://hp.vector.co.jp/authors/VA017148/pages/cpad.html#cpadintroduction 次のようなページもあるんで、参考までに。 Borland C++ Compiler のインストール: http://homepage3.nifty.com/mmgames/c_guide/p_bcc.html

kitatabi
質問者

お礼

再びの返答ありがとうございます。 幾つもの参照助かります。 薦められたように、一度どれかダウンロードしてコンパイルしてみます。 大して支障が無いとの御助言もありましたので、一度試して見ます。 色々と教えていただきありがとうございました。

  • php504
  • ベストアンサー率42% (926/2160)
回答No.4

それはborlandのBCC5.5用のヘッダじゃないでしょうか VisualC++では使えませんよ VisualC++のincludeパスにBCC5.5用のパスが通ってるのも不思議ですが

kitatabi
質問者

お礼

返答ありがとうございます。 なるほど、やはりVisualStudionでは使えないヘッダなのですか……。 どうしても虚数を定義して扱いたいのですが、そういった場合どうすればいいでしょうか? よろしければ教えてもらえると幸いです。 何度も聞いてしまうようで申し訳ないですが、よろしくお願いします。

回答No.3

う~~ん、そうですねえ……。 うちの環境だと確かにコンパイル出来ました。 real=-1.000000 imag=0.000000 ってのが欲しい結果でしょうか? 調べてみると、complex.hってのは、どうやらglibc(GNU C Library)の付属物のようですね。 GNU C Library: http://www.gnu.org/software/libc/ ソースコードは以下の模様です。 complex.h: http://www.google.co.jp/codesearch/p?hl=ja&sa=N&cd=2&ct=rc#bZFm81g2I8w/glibc-2.1.1/math/complex.h&q=complex.h%20lang:c 見た感じ、minGWには含まれているようなんで、「どーしてもコンパイルして動作を見たい」のなら、minGW minGW: http://www.mingw.org/ 使った方がいいかもしれませんね。 minGWのインストール/設定は次のページ辺りを参考にして下さい。 MinGW のインストール: http://www.knatech.info/Dev-mingw-install.html

kitatabi
質問者

お礼

返答ありがとうございます。 欲しい結果、まさにその通りです。 VisualStudioでcomplex.hを使えるようにする。ということはできるのでしょうか? 参照で載せていただいたURLを拝借させていただいたのですが、ちょっと自分では理解できませんでした……。 ソースを直接プログラム中に打ち込んだりしたらよいのでしょうか? よろしければ、再びの御助言お願いいたします。 よろしくお願いします。

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

残念ながら, VisualStudio 2008 に complex.h はないのですよ. ついでにいえば, ヘッダファイルがあるディレクトリに rw というサブディレクトリもありません. ところで, あなたが使っているのは C と C++ のどちら? C++ なら, complex を #include すればいいだけなんだけど.

kitatabi
質問者

お礼

返答ありがとうございます。 すいません、実はCかC++なのかもよくわかっておりません。 VisualStudioにcomplex.hは無いのですか……分かりました。 ありがとうございます。 もしよろしければ、complex.hを使わずに虚数を定義するにはどうすればいいか、御教えいただけないでしょうか? 何度も頼ってしまうようで申し訳ないですが、よろしくお願いします。

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

どのようなプログラムを書いたのですか? その C:\program\C++5.5\include\complex.h とやらの中身はどうなっているのですか?

kitatabi
質問者

お礼

早速の返信ありがとうございます。 そもそもの考えが間違っているのかも知れませんが、complex.hはVisual C++についているものではないのですか? 付属しているものと思っているのですが……。 すいません、#include<math.h>を入力し忘れました。 プログラムの全容は以下の通りです→ #include <stdio.h> #include <complex.h> #include <math.h>   int main(void){ double _Complex z, x; x=I*M_PI; z=cexp(x); printf("real=%f\timag=%f\n", creal(z),cimag(z)); return 0; } よろしくお願いします。

関連するQ&A