その後また色々やってみて、おかげさまでとっても賢くなりました!
朔を旧暦変換、中気を二十四節気取得で無理矢理取得しているのであんまり実用的ではないケド、旧暦の計算もなでしこでいちおう出来たと思います。
それから、元のAWKのスクリプトもだうんろーどしてみました。
それで、ひらめきまして、普通になおりそうな予感!
問題はこの部分なんですが・・・(300行目?)
//-----------------------------------------------------------------------
// 朔日行列から旧暦を求める。
//-----------------------------------------------------------------------
_state := 0; j := 4;
for i := 0 to 4 do
begin
if(Trunc(_tm0) < Trunc(_m[i, 2]))then
begin
_state := 1;
j := i;
Break;
end else
if(Trunc(_tm0) = Trunc(_m[i, 2])) then
begin
_state := 2;
j := i;
Break;
end;
end;
if (_state=0) or (_state=1) then
begin
Dec(j);
end;
Result.uruu := Trunc(_m[j, 1]);
Result.q_mon := Trunc(_m[j, 0]);
Result.q_day := Trunc(_tm0) - Trunc(_m[j, 2]) + 1;
#-----------------------------------------------
なでしこで書くと、こうゆうことだと思いますが・・・
#-----------------------------------------------
※mは朔日行列(要素数5)。tm0は対象日のユリウス日。
state=0。j=4。
iを0から4まで繰り返す
もし、INT(tm0)<INT(m[i][2])ならば、
state=1。j=i。抜ける。
違えば、もし、INT(tm0)=INT(m[i][2])ならば、
state=2。j=i。抜ける。
もし、(state=0)または(state=1)ならば、
j=j-1。
閏=INT(m[j][1])
月=INT(m[j][0])
日=INT(tm0)-INT(m[j][2])+1。
#-----------------------------------------------
元のAWKのスクリプトではカウンタのiを直接使っていて、もしに引っかからずに繰り返しが終了した時(state0)、タブンiが5になっているので-1しなければならなかったんだと思います。
しかし、こちらはiをjに代入して使用していて、jの初期値を朔日行列の要素数-1である4としているので、-1してはいけません。state1の時だけ-1すればいいので、別にstateのフラグで仕分けする必要もない感じ。
とゆうわけで、これでいけます!!!(なでしこではできました)
前回のとりあえずな修正も、2033年問題の部分以外は不要になるハズ。
#-----------------------------------------------
※mは朔日行列(要素数5)。tm0は対象日のユリウス日。
j=4。
iを0から4まで繰り返す
もし、INT(tm0)<INT(m[i][2])ならば、 // state1。対象日のユリウス日が朔日のユリウス日より前なので
j=i-1。抜ける。 // いっこ前の月(行)を参照します。(j=i-1)
違えば、もし、INT(tm0)=INT(m[i][2])ならば、// state2。対象日のユリウス日と朔日のユリウス日が同じ日なので
j=i。抜ける。 // その行を参照します。(j=i)
// state0。該当せずに繰り返しが終了した場合は、最後の行(j=4)を参照します。
閏=INT(m[j][1])
月=INT(m[j][0])
日=INT(tm0)-INT(m[j][2])+1。
#-----------------------------------------------
Delphiさんだと・・・こう・・・ですかねえ・・・?
//-----------------------------------------------------------------------
// 朔日行列から旧暦を求める。
//-----------------------------------------------------------------------
j := 4;
for i := 0 to 4 do
begin
if(Trunc(_tm0) < Trunc(_m[i, 2]))then
begin
j := i-1;
Break;
end else
if(Trunc(_tm0) = Trunc(_m[i, 2])) then
begin
j := i;
Break;
end;
end;
Result.uruu := Trunc(_m[j, 1]);
Result.q_mon := Trunc(_m[j, 0]);
Result.q_day := Trunc(_tm0) - Trunc(_m[j, 2]) + 1;
#-----------------------------------------------
うまくいったらおなぐさみ☆
自分ではなでしこでしかお試しができないので、試してみていただけたらと思います。
このあたりがOKならタブンだいじょぶそう。
#-----------------------------------------------
『2025/09/23』を旧暦変換して表示。#×2025/08/03→○2025/08/02
『2028/09/20』を旧暦変換して表示。#×2028/08/03→○2028/08/02
『2031/06/21』を旧暦変換して表示。#×2031/05/03→○2031/05/02
『2042/06/21』を旧暦変換して表示。#×2042/05/05→○2042/05/04
『2044/09/22』を旧暦変換して表示。#×2044/閏08/02→○2044/08/02
『2047/09/22』を旧暦変換して表示。#×2047/08/04→○2047/08/03
#-----------------------------------------------
どうでしょう?