#author("2023-12-01T14:12:39+09:00","default:okazaki","okazaki")
#author("2023-12-01T15:51:00+09:00","default:okazaki","okazaki")
#menu(howto/MenuBar)

* howto/C++言語 [#rdba3503]
#contents

** 一行メモ [#qf51cdc8]
- lapack 3.4.2 パッケージだと、lapackeが complex.hを使っている。そのため C++98などでは lapackeを利用できない。 --  &new{2023-11-29 (水) 17:16:31};
-- 補足:C++からfortranなどのサブルーチンを利用する方法は一般的なので、ググればみつかるでしょう。
- lapackの dgesv_などで aや b, ipivの配列サイズが小さかった場合、segmentation faultするでは無く、fortranルーチンで "On entry to DGETRS parameter number  8 had an illegal value" などを出力してエラーストップしたりするようだ。 --  &new{2023-12-01 (金) 12:43:21};
- lapackの dgesv_などで aや b, ipivの配列サイズが小さかった場合、segmentation faultするでは無く、fortranルーチンで "On entry to DGETRS parameter number  8 had an illegal value" などを出力してエラーストップすることもある(はみ出て書き込み、その値がエラーチェックに使われた結果である)。 --  &new{2023-12-01 (金) 12:43:21};

#comment

* complex型を使ったCソースをC++でコンパイルする方法(CからC++への移行) [#ld594bda]

C++言語のcomplex型は、C言語の上位互換ではない。CからC++へ移行するためにはcomplex型まわりを修正する。
修正は下記のようにする。わりと単純で多くないようだ。

ISO C 1998 や ISO C 2011 のソースを ISO C++ 1998 や ISO C++ 2011 にするなどの方法 ( gcc, g++ version 4.8.5 で試した )。
(注) 試行錯誤して、いいだろうと見つけた方法である。

+ ヘッダファイルの変更
 #include  <tgmath.h>  //complex.hもインクルードされている
   を
 #include  <complex>
   に変更する。
//
+ complex型の定義・宣言の変更
 double complex  a;
   を
 std::complex<double>  a;
   に変更する。using std::complex; をすれば std::を略せる。
//
+ 追加
 #define  creal  real
 #define  cimag  imag
   を追加する。creal, cimagは std::real, std::imagに変更されている。また、
   この std::は何もしなくても略せる。
 const std::complex<double>  I(0.0,1.0);
   を追加する。Iは無くなっているため。
//
+ ISO C++ 1998 のときにさらに追加
 #define  fabs(z)  sqrt(real(z)*real(z)+imag(z)*imag(z))
   fabsは無いので、real,imag,sqrtで計算する。2023/11/29
g++ 4.8.5の ISO C++ 1998はなんか怪しそうなので使わない方がよい?

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS