「なでしこv1」開発掲示板

なでしこv1のバグや要望を書き込む掲示板

(#3044) なおるかも! - 雪乃☆雫 (2022-01-30 00:46) /中 未処理
 その後また色々やってみて、おかげさまでとっても賢くなりました!
 朔を旧暦変換、中気を二十四節気取得で無理矢理取得しているのであんまり実用的ではないケド、旧暦の計算もなでしこでいちおう出来たと思います。
 それから、元の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
#-----------------------------------------------
 どうでしょう?
旧暦変換がおかしすぎる(六曜も) / 雪乃☆雫 (2021-06-03 09:23) (#2989)/ 中 未処理
  とりあえずこんな無理矢理系でなんとかで.. / 雪乃☆雫 (2021-06-03 14:47) (#2990)/ 中 未処理
  修正 / クジラ飛行机 (2021-07-11 00:07) (#3006)/ 中 確認待ち
  惜しい! / 雪乃☆雫 (2021-07-12 02:37) (#3007)/ 中 確認待ち
  どうせなら根本的な解決を目指したい / 雪乃☆雫 (2021-07-12 12:26) (#3008)/ 中 確認待ち
  むむむ / クジラ飛行机 (2022-01-01 23:28) (#3026)/ 中 未処理
    ちょっとやってみます~ / 雪乃☆雫 (2022-01-04 16:30) (#3029)/ 中 未処理
  v3のサンプルありがとうございます! / クジラ飛行机 (2022-01-08 17:39) (#3035)/ 中 未処理
  できたような・・・? / 雪乃☆雫 (2022-01-18 01:11) (#3038)/ 中 未処理
  なおるかも! / 雪乃☆雫 (2022-01-30 00:46) (#3044)/ 中 未処理
    おぉ!!!ありがとうございます!! / クジラ飛行机 (2022-02-08 11:14) (#3049)/ 中 確認待ち
  実行ファイルを差し替え / クジラ飛行机 (2022-02-08 15:15) (#3053)/ 中 確認待ち
  確認しました☆ / 雪乃☆雫 (2022-02-09 01:25) (#3054)/ 中 解決

(#3044)へ返信する:

👆お手数ですが、いたずら防止のために、「真夏」の読み方を記入してください。

編集時に使うキーを入力(省略可能)

画像ファイル(最大300KB)を添付可能