WINDOWSのコンパイラー Borland C++Compiler(フリー)で 本に書いてあるソースをコンパイルできません。
4章までは
#include <stdiostream.h> を #include <iostream.>に変更するだけでコンパイル可能になったのですが、5章のベクトルのクラスを使った、harmonic5aはコンパイルできません。 以下のようなエラーが出てしまいます。
■C:\WINDOWS\Profiles\Takashi\My Documents\C\パソコン物理\harmonic5a> bcc32 harmonic5a.cpp Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland harmonic5a.cpp: 警告 W8027 vector.h 22: forを含む関数はインライン展開できない 警告 W8027 vector.h 30: forを含む関数はインライン展開できない 警告 W8027 vector.h 37: forを含む関数はインライン展開できない 警告 W8027 vector.h 50: forを含む関数はインライン展開できない 警告 W8027 vector.h 54: forを含む関数はインライン展開できない 警告 W8027 vector.h 58: forを含む関数はインライン展開できない 警告 W8027 vector.h 62: forを含む関数はインライン展開できない 警告 W8027 vector.h 74: forを含む関数はインライン展開できない 警告 W8027 vector.h 78: forを含む関数はインライン展開できない 警告 W8027 vector.h 83: forを含む関数はインライン展開できない 警告 W8027 vector.h 89: forを含む関数はインライン展開できない 警告 W8027 vector.h 96: forを含む関数はインライン展開できない 警告 W8027 vector.h 102: forを含む関数はインライン展開できない 警告 W8027 vector.h 109: forを含む関数はインライン展開できない 警告 W8027 vector.h 117: forを含む関数はインライン展開できない エラー E2034 harmonic5a.cpp 46: 'vector (*)(vector &)' 型は 'const vector (*)(const vector &)' 型に変換できない(関数 main() ) エラー E2342 harmonic5a.cpp 46: パラメータ 'f' は const vector (*)(const vector &) 型として定義されているので vector (*)(vector &) は渡せない(関数 main() ) 警告 W8004 harmonic5a.cpp 52: 'emax' に代入した値は使われていない(関数 main() ) *** 2 errors in Compile ***
お答え
もともとの質問をいただいた方は、とりあえず、vector.h を、ちょっと変更した vector_borland.h に置き換えてもらったところ、無事にコンパイルはできるようになったとのこと。以下、説明です。このなかで、「警告」でなくて本当にエラーになっているのは
エラー E2034 harmonic5a.cpp 46: 'vector (*)(vector &)' 型は 'const vector (*)(const vector &)' 型に変換できない(関数 main() )ここだけです。その上に沢山ある、エラー E2342 harmonic5a.cpp 46: パラメータ 'f' は const vector (*)(const vector &) 型として定義されているので vector (*)(vector &) は渡せない(関数 main() )
警告 W8027 vector.h 22: forを含む関数はインライン展開できないは、ボーランドのコンパイラでは扱えないということですが、警告なのでコン パイルした結果は正しくなっていると思います。
そういうわけで、ちょっとプログラムを見てみました。問題は、 vector.h の中では vfunc という型を
typedef const vector (vfunc)(const vector &);と宣言しているのに、これを使っている harmonic5a.C のほうでは、vfunc と して使われる
vector dxdt(vector & x)が、 const なしで宣言されているということです。これは、 main の
rk4(x,dxdt,h);で関数 rk4 に渡されますが、これの宣言が
void rk4(vector & x, vfunc f, double h)となっているにもかかわらず、 関数 dxdt の宣言はそうなってないというの が問題なわけです。
UNIX 上の g++ ではこれでもコンパイルできてしまうので気がついていなかっ たのですが、厳密にいえばこれはエラーになるべきところです。
プログラムをどう修正するべきかということですが、これは意外に厄介です。 結論だけをいうと(もうちょっとましな方法があるかもしれませんが、私にす ぐにわかる範囲では)
harmonic5a.C の
vector dxdt(vector & x) { vector d; d[0] = x[1]; d[1] = -k*x[0]; return d; }となっているところを、
const vector dxdt( const vector xc) ^^^^^ ^^^^^ ^ { vector d,x; ^^ x = xc; ^^^^^^^ d[0] = x[1]; d[1] = -k*x[0]; return d; }(^^^ は変更箇所の下につけてあります)とすれば、(多分)OKだと思います。 手元に Borland C++ がないので確認できないのですが。但し、これでは他の ところもいろいろ変更が必要になって大変なので、 vector.h の最後のほうの
typedef const vector (vfunc)(const vector &);
となっているところを、
typedef vector (vfunc)(vector &);
とするののほうが(コンパイラが文句をいわなければ)よいかもしれません。というわけで、 vctor_borland.h ではこの変更がなされています。上の Borland C++ 5.5.1 for Win32 では、これで文句をいわなくなると聞いています。
このコンパイラが手元にないので、こちらで完全なテストはできていませんが、これは何をエラーとみなすかの問題で、この変更によってプログラムの意味が変わるようなことはないので、、実行結果等には影響はでないはずです。
本にでてくる「赤木先生」のモデルは?アニメのエヴァンゲリオンの登場人物との関係は?
お答え赤木先生って誰よ
質問: