Fortran 90 で柔軟な (コンパイル時に定義された) ストレージ順序を取得したいと考えています。このために、いくつかのブースト pp ヘッダーを含む C++ プリプロセッサを使用しようとしています。
したがって、たとえば、次のように 3D 配列にアクセスする代わりに、次のようにします。
myArray(k,i,j)
これが欲しい:
myArray(POINT3D(i,j,k))
コンパイル時にアクセスの順序を決定します。
今私が試したこと:
#include "boost_pp_cat.hpp"
#include "boost_pp_comma.hpp"
! ------ Define storage orders here --------- !
!Forward lookup {i,j,k} <- {1,2,3}
#define KIJ_ORDER_ARG1 k
#define KIJ_ORDER_ARG2 i
#define KIJ_ORDER_ARG3 j
! ------ Switch between storage orders ------ !
#define CURR_ORDER KIJ_ORDER
! ------ Generate all required macros ------- !
#define STOR_ORDER_ARG(storOrder, argNum) BOOST_PP_CAT(BOOST_PP_CAT(storOrder, _ARG), argNum)
#define CHOOSE_PARAM(storOrder, argNum) BOOST_PP_CAT(STOR_ORDER_ARG(storOrder, argNum), Param)
#define POINT3D(iParam, jParam, kParam) POINT3D_WITH_STORORDER(CURR_ORDER, iParam, jParam, kParam)
#define POINT3D_WITH_STORORDER(storOrder, iParam, jParam, kParam) POINT3D_WITH_STORORDER_PRE(storOrder)
#define POINT3D_WITH_STORORDER_PRE(storOrder) CHOOSE_PARAM(storOrder, 1), CHOOSE_PARAM(storOrder, 2), CHOOSE_PARAM(storOrder, 3)
これは拡大します
myArray(POINT3D(i,j,k))
に
myArray(kParam, iParam, jParam)
.
もうすぐそこ!今私の質問:
- Cプリプロセッサを使用してやりたいことをすることは可能ですか?
- そうでない場合、どのようなテクニックを使用しますか? (専用の「プリプロセッサ」Python スクリプトを独自に作成することを考えていますが、別の提案はありますか?)