TGDZ 计算 之 CMAKE实现.
这几天在学习cmake,搞得头大,这玩意混合了不同编译器需要生成的文件系列不同,cmake前后版本的策略与兼容性问题,构建概念与CMAKE语法上的费解,感觉比以前学正则表达式还要困难,网上找的教程几乎多多少少都有问题,不是这里出错就是那里功能不再提供了. 为了让自己对CMAKE理解深入一点,决定用CMAKE把天干地支计算的功能写一下,花好久才把以下的程序调通过了.
以下代码放在CMakelists.txt文件中,用UTF8编码保存. 在文件所在的目录命令行上,命令行以cmake -P CMakelists.txt命令运行通过. 是为记.2025-5-18
点击查看
cmake_minimum_required(VERSION 3.30)
set(ttgg 甲乙丙丁戊己庚辛壬癸)
set(ddzz 子丑寅卯辰巳午未申酉戌亥)
function(YearToTGDZ year)
set(tg "" PARENT_SCOPE)
set(dz "" PARENT_SCOPE)
if (${year} GREATER 0)
set (i 3)
else()
set (i 4)
endif()
set(y ${year})
math(EXPR y ${y}-${i})
set(g 0)
set(z 0)
math(EXPR g "3*(${y}%10-1)") #每个天干地支汉字用UTF-8表示时长度为3个字节.
math(EXPR z "3*(${y}%12-1)")
string(SUBSTRING ${ttgg} ${g} 3 tg)
string(SUBSTRING ${ddzz} ${z} 3 dz)
set(y2tResult ${tg}${dz} PARENT_SCOPE)
message(${tg};${dz})
endfunction()
function(TGDZtoYear tgdz baseYear)
string(LENGTH ${tgdz} tgLen)
if(NOT tgLen EQUAL 6)
return()
endif()
string(SUBSTRING ${tgdz} 0 3 strTG)
string(SUBSTRING ${tgdz} 3 3 strDZ)
#message(${strTG}${strDZ})
string(FIND ${ttgg} ${strTG} tgindex)
string(FIND ${ddzz} ${strDZ} dzindex)
math(EXPR tgindex "${tgindex}/3")
math(EXPR dzindex "${dzindex}/3")
#message(${tgindex}," ",${dzindex})
math(EXPR m "${tgindex}-${dzindex}")
if (m LESS 0)
math(EXPR m "12+${m}")
endif()
set(t2yResult 0 PARENT_SCOPE)
math(EXPR t2yResult "${baseYear}+${m}*5+${tgindex}")
message(${t2yResult})
endfunction()
function(CalcBaseYear year)
set(bY 0 PARENT_SCOPE)
if(${year} GREATER 0)
set(bY 1984)
else()
set (bY -57)
endif()
while(bY GREATER ${year})
math(EXPR bY ${bY}-60)
endwhile()
set(y 0)
math(EXPR y ${year}-60)
while(bY LESS_EQUAL y)
math(EXPR bY ${bY}+60)
endwhile()
message(${bY})
#bY变量就是返回值.
endfunction()
#示例
message("2025年的甲子元年是:")
CalcBaseYear(2025)
message("甲子元年1924年之后的丙辰年是:")
TGDZtoYear("丙辰" 1924)
message("2025年是农历哪年?")
YearToTGDZ(2025)
# 这个语言的语法真是丑爆了,我用过的唯一比它更丑的就是以前在ChemFinder中内嵌的CAL脚本.
# 在Cmake 3.31和Notepad3环境中编写通过测试. 2025-5-18


浙公网安备 33010602011771号