次の問題で立ち往生しています:
次の 2 つの正しく機能するマクロがあります (Fortran90 コードに拡張)。
#define ld_dx(A) ( (A(ixp1)-A(ix ))/(dx) )
#define rd_dx(A) ( (A(ix )-A(ixm1))/(dx) )
(注: これらのマクロは、次の追加マクロに依存します。
#define ix 2:nx-1
#define ixp1 1+ix+1
#define ixm1 -1+ix-1
そして、それらは宣言にも依存します:
integer, parameter :: nx = 100, dx = 1
)
私のコードでは、これらのマクロを呼び出しで使用できます。
X = X + ld_dx(Y)
また:
X = X + rd_dx(Y)
ここで、代わりに d_dx(A,l) を記述して ld_dx(A) を呼び出し、d_dx(A,r) を記述して rd_dx(A) を呼び出せるようにしたいと考えています。したがって、例は次のようになります。
X = X + d_dx(Y,l)
また
X = X + d_dx(Y,r)
=> このシンタックス シュガーを提供できる CPP マクロを探しています (数学表記にできるだけ近づけるため)。<=
最も簡単なことは次のとおりです。
#define d_dx(A,s) s ## d_dx(A)
残念ながら、これは機能しません。CPP 変換
d_dx(Y,l)
の中へ:
l ## Y)
他の CPP 連結関連の質問を調べて、いろいろ試しましたが、わかりませんでした。助けてくれてありがとう!
サム
PS: マクロ 'ld_dx(A)' と 'rd_dx(A)' の名前を 'dl_dx(A)' と 'dr_dx(A)' に変更しても問題ないことに注意してください。だろう:
#define d_dx(A,s) d ## s ## _dx(A)
残念ながら、これはどちらも機能しません: CPP 変換
d_dx(Y,l)
の中へ:
d ## l ## _dx(Y)
1
エラー: (1) の式に右括弧が必要です
つまり、連結は単に実行されません。