我想在 Fortran 90 中获得一个灵活的(编译时间定义的)存储顺序。为此,我尝试使用 C++ 预处理器,包括一些 boost pp 头文件。
因此,例如,不要像这样访问 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 脚本,但您还有其他建议吗?)