excesselementsinchararrayinitializer的意思是:在char数组初始化时,设置了多余的元素。如:
constcharChDay[]={//这里定义的是一个一维字符数组,并进行初始化,一维数组的元素只能是单个的字符,而下面的数据却是字符串,所以,在编译时会报错误。
};
正确的代码应该为:
constchar*ChDay[]={//定义一个字符串数组(字符指针数组),其元素为字符串(字符指针)
或,定义成二维数组,因一个汉字最多占三个字节,初始化数据中,最长的只有两个汉字,所以,可以进行如下定义:
constcharChDay[][7]={//列宽最大为7(两个汉字加一个字符串结束符)
DimWeekName(7),MonthAdd(11),NongliData(99),TianGan(9),DiZhi(11),ShuXiang(11),DayName(30),MonName(12)
DimcurTime,curYear,curMonth,curDay,curWeekday
DimGongliStr,WeekdayStr,NongliStr,NongliDayStr
Dimi,m,n,k,isEnd,bit,TheDate
PrivateSubForm_Load()
curTime=Now()
MonthAdd(0)=0
MonthAdd(1)=31
MonthAdd(2)=59
MonthAdd(3)=90
MonthAdd(4)=120
MonthAdd(5)=151
MonthAdd(6)=181
MonthAdd(7)=212
MonthAdd(8)=243
MonthAdd(9)=273
MonthAdd(10)=304
MonthAdd(11)=334
NongliData(0)=2635
NongliData(1)=333387
NongliData(2)=1701
NongliData(3)=1748
NongliData(4)=267701
NongliData(5)=694
NongliData(6)=2391
NongliData(7)=133423
NongliData(8)=1175
NongliData(9)=396438
NongliData(10)=3402
NongliData(11)=3749
NongliData(12)=331177
NongliData(13)=1453
NongliData(14)=694
NongliData(15)=201326
NongliData(16)=2350
NongliData(17)=465197
NongliData(18)=3221
NongliData(19)=3402
NongliData(20)=400202
NongliData(21)=2901
NongliData(22)=1386
NongliData(23)=267611
NongliData(24)=605
NongliData(25)=2349
NongliData(26)=137515
NongliData(27)=2709
NongliData(28)=464533
NongliData(29)=1738
NongliData(30)=2901
NongliData(31)=330421
NongliData(32)=1242
NongliData(33)=2651
NongliData(34)=199255
NongliData(35)=1323
NongliData(36)=529706
NongliData(37)=3733
NongliData(38)=1706
NongliData(39)=398762
NongliData(40)=2741
NongliData(41)=1206
NongliData(42)=267438
NongliData(43)=2647
NongliData(44)=1318
NongliData(45)=204070
NongliData(46)=3477
NongliData(47)=461653
NongliData(48)=1386
NongliData(49)=2413
NongliData(50)=330077
NongliData(51)=1197
NongliData(52)=2637
NongliData(53)=268877
NongliData(54)=3365
NongliData(55)=531109
NongliData(56)=2900
NongliData(57)=2922
NongliData(58)=398042
NongliData(59)=2395
NongliData(60)=1179
NongliData(61)=267415
NongliData(62)=2635
NongliData(63)=661067
NongliData(64)=1701
NongliData(65)=1748
NongliData(66)=398772
NongliData(67)=2742
NongliData(68)=2391
NongliData(69)=330031
NongliData(70)=1175
NongliData(71)=1611
NongliData(72)=200010
NongliData(73)=3749
NongliData(74)=527717
NongliData(75)=1452
NongliData(76)=2742
NongliData(77)=332397
NongliData(78)=2350
NongliData(79)=3222
NongliData(80)=268949
NongliData(81)=3402
NongliData(82)=3493
NongliData(83)=133973
NongliData(84)=1386
NongliData(85)=464219
NongliData(86)=605
NongliData(87)=2349
NongliData(88)=334123
NongliData(89)=2709
NongliData(90)=2890
NongliData(91)=267946
NongliData(92)=2773
NongliData(93)=592565
NongliData(94)=1210
NongliData(95)=2651
NongliData(96)=395863
NongliData(97)=1323
NongliData(98)=2707
NongliData(99)=265877
curYear=Year(curTime)
curMonth=Month(curTime)
curDay=Day(curTime)
If(curMonth10)Then
Else
EndIf
If(curDay10)Then
curWeekday=Weekday(curTime)
WeekdayStr=WeekName(curWeekday)
If((curYearMod4)=0AndcurMonth2)Then
TheDate=TheDate+1
isEnd=0
m=0
Do
If(NongliData(m)4095)Then
k=11
k=12
n=k
If(n0)Then
ExitDo
bit=NongliData(m)
Fori=1TonStep1
bit=Int(bit/2)
Next
bit=bitMod2
If(TheDate=29+bit)Then
isEnd=1
Loop
If(isEnd=1)Then
m=m+1
curYear=1921+m
curDay=TheDate
If(k=12)Then
If(curMonth=(Int(NongliData(m)/65536)+1))Then
ElseIf(curMonth(Int(NongliData(m)/65536)+1))Then
If(curMonth1)Then
NongliDayStr=MonName(curMonth)
NongliDayStr=NongliDayStrDayName(curDay)
MsgBoxNongliStrNongliDayStr
EndSub
我刚好有资源,这是我原创的程序,里面的数据压缩方式、转换、参考点等,都是自行设计的,能够准确地将公历转农历,将农历转公历,同时还提供一个自行设计的农历库,附带例程,还有农历信息提取工具,可以自定义年份区间(1600-7000)。
农历信息提取器生成的头文件(这里限于篇幅,只取10年跨度)
/*****************************************************
*农历信息(查表方式)*
*****************************************************/
#ifndef_LUNARDATA_H
#define_LUNARDATA_H
#defineSTART_YEAR1600//定义数据起始年份(公历)
#defineEND_YEAR1610//定义数据终止年份(不包含该年)
shortiPreLeapIndex=-1;//起始年份以前的农历闰月索引,对应iPreMonth中的序号,如果是-1则代表无闰月。
//从起始年份前一年的农历十月开始,每月初一对应在起始年份中的年内序数,
//序数小于零代表起始年份之前。
shortiPreMonth[3]={-44,-15,15};
//每年农历正月初一的日期在公历年内的序数(年内序数指定元旦为0)。
unsignedcharuLunarNewYearOrdinal[10]={
44,33,22,41,30,48,37,27,46,34//1600-1609
//月份大小数组,从“START_YEAR”的正月到“END_YEAR”前一年的(闰)十二月。
//每年十二或十三个月用两个字节表示,最高两位定为10,后面从正月开始到十二月,包含闰月。月份小的在前,
//100或1xxxxxxxxxxxxx
//1012个月为0,13个月为1从正月到十二月,月份天数29天则为0,月份天数30天则为1。
//注意,如果没有闰月,月份位为12位,总长度是15位,有闰月,月份位为13位,总长度是16位。
unsignedshortLunarMonthDX[10]={
0x4A5D,0x492D,0xB92B,0x4A95,0xB695,0x46AA,0x4AD5,0xAAB5,0x44BA,0x4A5B//1600-1609
//闰月数组,用4位表示一个农历年内的闰月信息,一个字节表示相邻两年。
//xxxxxxxx
//年份①年份②
unsignedcharLeapMonth[5]={
0x00,0x20,0x90,0x06,0x00//1600-1609
//24节气数组,一年用12个字节表示,即每个月用一个字节(注意:此压缩算法适用于公元1600以后的数据)。
//如1901年的节气为:
//1月2月3月4月5月6月7月8月9月10月11月12月
//6,21,4,19,6,21,5,21,6,22,6,22,8,23,8,24,8,24,8,24,8,23,8,22
//9,6,11,4,9,6,10,6,9,7,9,7,7,8,7,9,7,9,7,9,7,8,7,15
//小寒大寒立春雨水惊蛰春分清明谷雨立夏小满芒种夏至小暑大暑立秋处暑白露秋分寒露霜降立冬小雪大雪冬至
//这样每月两个节气对应数据都小于16,每月用一个字节存放,高位存放第一个节气数据,低位存放第二个节气的数据,可得下表:
unsignedcharSolarTerms[120]={
0x96,0x96,0x87,0x97,0x87,0x97,0x87,0x96,0x96,0x96,0x96,0x96,//1600
0xA6,0xA5,0x87,0x87,0x87,0x87,0x87,0x97,0x96,0x97,0x96,0x96,//1601
0x96,0xA5,0x88,0x87,0x88,0x87,0x87,0x87,0x96,0x87,0x96,0x97,//1602
0x96,0xA6,0x78,0x87,0x78,0x87,0x88,0x87,0x97,0x87,0x96,0x87,//1603
0x96,0x96,0x87,0x97,0x87,0x97,0x87,0x96,0x96,0x96,0xA6,0x96,//1604
0xA6,0xA5,0x87,0x87,0x87,0x87,0x87,0x97,0x96,0x96,0x96,0x96,//1605
0x96,0xA5,0x88,0x87,0x88,0x87,0x87,0x87,0x96,0x87,0x96,0x97,//1606
0x96,0xA5,0x78,0x87,0x78,0x87,0x88,0x87,0x97,0x87,0x96,0x87,//1607
0x96,0x96,0x87,0x97,0x87,0x96,0x87,0x96,0x96,0x96,0xA6,0x96,//1608
0xA6,0xA5,0x87,0x87,0x87,0x87,0x87,0x97,0x96,0x96,0x96,0x96//1609
//每年数九、入梅、出梅及三伏日期(以该年元旦为基准)。
//公历年内首个是三九(适用于公元1600年以后)。
//数组中,每一行表示一年,四九、五九……省略,输在每个九相差9天,同理二九省略,中伏在初伏后10天。分别对应如下(括号中的已省略):
//三九(四九五九六九七九八九九九)入梅出梅初伏(中伏)末伏一九(二九),注意:一九就是冬至。
unsignedshortExtermSeason[60]={
8,165,190,199,219,355,7,159,196,193,223,355,//1600-1601
7,164,191,198,218,355,8,159,198,193,223,355,//1602-1603
8,164,193,198,218,355,7,158,199,202,222,355,//1604-1605
7,163,194,197,227,355,8,158,189,202,222,355,//1606-1607
8,163,196,197,227,355,7,167,190,201,221,354//1608-1609
#endif//_LUNARDATA_H
其实很简单,你的程序中定义一些数组,保存一些重要参数即可,下面是JAVASCRIPT的,看懂了你就可以用C来写:
varlunarInfo=newArray(
0x04bd8,0x04ae0,0x0a570,0x054d5,0x0d260,0x0d950,0x16554,0x056a0,0x09ad0,0x055d2,
0x04ae0,0x0a5b6,0x0a4d0,0x0d250,0x1d255,0x0b540,0x0d6a0,0x0ada2,0x095b0,0x14977,
0x04970,0x0a4b0,0x0b4b5,0x06a50,0x06d40,0x1ab54,0x02b60,0x09570,0x052f2,0x04970,
0x06566,0x0d4a0,0x0ea50,0x06e95,0x05ad0,0x02b60,0x186e3,0x092e0,0x1c8d7,0x0c950,
0x0d4a0,0x1d8a6,0x0b550,0x056a0,0x1a5b4,0x025d0,0x092d0,0x0d2b2,0x0a950,0x0b557,
0x06ca0,0x0b550,0x15355,0x04da0,0x0a5d0,0x14573,0x052d0,0x0a9a8,0x0e950,0x06aa0,
0x0aea6,0x0ab50,0x04b60,0x0aae4,0x0a570,0x05260,0x0f263,0x0d950,0x05b57,0x056a0,
0x096d0,0x04dd5,0x04ad0,0x0a4d0,0x0d4d4,0x0d250,0x0d558,0x0b540,0x0b5a0,0x195a6,
0x095b0,0x049b0,0x0a974,0x0a4b0,0x0b27a,0x06a50,0x06d40,0x0af46,0x0ab60,0x09570,
0x04af5,0x04970,0x064b0,0x074a3,0x0ea50,0x06b58,0x055c0,0x0ab60,0x096d5,0x092e0,
0x0c960,0x0d954,0x0d4a0,0x0da50,0x07552,0x056a0,0x0abb7,0x025d0,0x092d0,0x0cab5,
0x0a950,0x0b4a0,0x0baa4,0x0ad50,0x055d9,0x04ba0,0x0a5b0,0x15176,0x052b0,0x0a930,
0x07954,0x06aa0,0x0ad50,0x05b52,0x04b60,0x0a6e6,0x0a4e0,0x0d260,0x0ea65,0x0d530,
0x05aa0,0x076a3,0x096d0,0x04bd7,0x04ad0,0x0a4d0,0x1d0b6,0x0d250,0x0d520,0x0dd45,
0x0b5a0,0x056d0,0x055b2,0x049b0,0x0a577,0x0a4b0,0x0aa50,0x1b255,0x06d20,0x0ada0)
//======================================传回农历y年的总天数
functionlYearDays(y){
vari,sum=348
for(i=0x8000;i0x8;i=1)sum+=(lunarInfo[y-1900]i)1:0
return(sum+leapDays(y))
}
//======================================传回农历y年闰月的天数
functionleapDays(y){
if(leapMonth(y))return((lunarInfo[y-1900]0x10000)30:29)
elsereturn(0)
//======================================传回农历y年闰哪个月1-12,没闰传回0
functionleapMonth(y){
return(lunarInfo[y-1900]0xf)
//======================================传回农历y年m月的总天数
functionmonthDays(y,m){
return((lunarInfo[y-1900](0x10000m))30:29)
直接给你整个工程吧,实现了星期计算、公历转农历、农历转公历、节气查询。非常不错的代码,你要的年份范围可以自己决定,支持从公元1600年到公元6400年的四千八百年数据。数据经过我精心设计的原创压缩算法压缩,体积非常小,效率很高。
密码:n51c(之前的不知啥原因被HX了,原创的都会被这样,鉴于需要的朋友很多,重新更换了链接)。
如果需要开发日历的完整开发包(支持更长年份),可私信。