Доброго здравия читающим.
Благодаря поучениям и наставлениям опытных програмеров (т.е. Вас) программа пишется и "хомуты" убираются. Но - назрел вопрос о правильности моего подхода к концепции в целом.
Вы, как более опытные в написании многостраничного кода, что скажете об использовании Объекта в качестве массива данных?...(наверное не корректно излагаю мысль..)
Для наглядности, ниже привожу код своего скрипта. Он работающий. Для его работы надо наличие одной dll и еще 3-х файлов с данными. Но смысл в вопроса в нужности использовать структуру class. Вроде бы Вы в своих больших скриптах не использовали его для подобных целей. Это не удобно? Захламляет? Медленнее работает?
#NoEnv
#Singleinstance force
/*
S_11 - Восх.Узел
S_13 - Лилит
S_15 - Хирон
S_56 - Селена
S_57 - Прозерпина
*/
global xx, StrErr, Planet, House
VarSetCapacity(xx, 8 * 6) ; - Массив:положение планеты,
VarSetCapacity(StrErr, 256)
Arg:=2 ; + 32 * 1024 ; - использовать файлы эфемерид из папки
SetWorkingDir, %A_ScriptDir%
s=%A_ScriptDir%\EPHE\ ; - папка файлов эфемерид
EnvGet, ss, SE_EPHE_PATH
EnvSet, SE_EPHE_PATH, % s
hSwiss := DllCall("LoadLibrary",str, "swedll32.dll")
VarSetCapacity(Cuspids, 8 * 13) ; - Массив: положение куспидов
VarSetCapacity(Asc_mc, 8 * 10)
geolat:=10 ; - долгота
geolon:=25 ; - широта
Transform, hsys, Asc, p ; - система домов - Плацидус
JulDay:= swe_julday( A_Year, A_MM, A_DD) ; задание даты в формате swiss efem
result:=DllCall("swedll32.dll\_swe_houses@36" ; расчет домов
, double, JulDay
, double, geolat
, double, geolon
, int, hsys
, Ptr, &Cuspids
, Ptr, &Asc_mc )
loop, 12 {
hh := NumGet(Cuspids, A_Index * 8, "Double")
House%A_Index%:= new PlanetInfo(A_Index,hh, 1)
h_out= % h_out House%A_Index%.H_Name " - " hh " - " House%A_Index%.H_Zod " "
. House%A_Index%.H_GradZ "° " House%A_Index%.H_MinZ "' " House%A_Index%.H_SecZ """`n"
}
MsgBox, %h_out%
Loop, 16 ; расчет планет
{
if (A_Index = 11) ; расчет Хирона
result := swe_calc_ut(JulDay, 15, Arg, xx, StrErr)
else if (A_Index=12) ; расчет Прозерпины
result := swe_calc_ut(JulDay, 57, Arg, xx, StrErr)
else if (A_Index=13 or A_Index=14) ; расчет узлов
result := swe_calc_ut(JulDay, 11, Arg, xx, StrErr)
else if (A_Index=15) ; расчет Селены
result := swe_calc_ut(JulDay, 56, Arg, xx, StrErr)
else if (A_Index=16) ; расчет Лилит
result := swe_calc_ut(JulDay, 12, Arg, xx, StrErr)
else
result := swe_calc_ut(JulDay, A_Index-1, Arg, xx, StrErr)
xx1 := NumGet(xx, "Double")
xx1 := (A_Index=14) ? ((xx1>180) ? xx1-180 : xx1+180) : xx1 ;Нисходящий узел - напротив восходящего
Planet%A_Index%:= new PlanetInfo(A_Index,xx1, 0 )
p_out= % p_out A_Index " " Planet%A_Index%.Name "(" Planet%A_Index%.inHouse ") - " Planet%A_Index%.Zod " "
. Planet%A_Index%.GradZ "° " Planet%A_Index%.MinZ "' " Planet%A_Index%.SecZ """`n"
}
if Planet1.nZod in 1,2,3,4,5,6 ; расчет Колеса различается для дневного и ночного рождения
ii:=1
else
ii:=-1
dz:=ii*(( abs(Planet2.Data-Planet1.Data) >180) ? 360-abs(Planet2.Data-Planet1.Data) : abs(Planet2.Data-Planet1.Data))
pozz:= House1.H_Data+dz>360 ? House1.H_Data+dz-360 : House1.H_Data+dz ; Asc-Moon+Sun - если больше 360 - то вычесть 360
Planet17:= new PlanetInfo(17,pozz,0)
dz:=( abs(Planet5.Data-Planet7.Data) >180) ? 360-abs(Planet5.Data-Planet7.Data) : abs(Planet5.Data-Planet7.Data)
pozz:= House1.H_Data+dz>360 ? House1.H_Data+dz-360 : House1.H_Data+dz ; Asc-Mars+Sat - если больше 360 - то вычесть 360
Planet18:= new PlanetInfo(18,pozz,0)
p_out= % p_out 17 " " Planet17.Name "(" Planet17.inHouse ") - " Planet17.Zod " "
. Planet17.GradZ "° " Planet17.MinZ "' " Planet17.SecZ """`n"
p_out= % p_out 18 " " Planet18.Name "(" Planet18.inHouse ") - " Planet18.Zod " "
. Planet18.GradZ "° " Planet18.MinZ "' " Planet18.SecZ """`n"
MsgBox, ,,%p_out%
IfMsgBox, Retry
Reload
DllCall("FreeLibrary", Ptr, hSwiss)
EnvSet, SE_EPHE_PATH, % ss
ESC:: ExitApp
Return ;=================================================================================
swe_julday(1Year, 1Month, 1Day, 1Time=0, 2Time=0, STD_Gre=1) { ; Год, Месяц, День, Часы, Минуты, ГрегорианскийФлаг
1Time+=2Time/60
return DllCall("swedll32.dll\_swe_julday@24"
, Int, 1Year
, Int, 1Month
, Int, 1Day
, Double, 1Time
, Int, STD_Gre
, Double)
}
swe_calc_ut(DataJulDay, PlanetNum, AlgorFlag, ByRef xx, ByRef StrErr) {
return DllCall("swedll32.dll\_swe_calc_ut@24"
, Double, DataJulDay
, Int, PlanetNum
, Int, AlgorFlag
, Ptr, &xx
, Ptr, &StrErr)
}
class PlanetInfo
{
__New(Num, aData, p_OR_h) ;p_OR_h=0 - планеты, p_OR_h=1 - дома
{
if !p_OR_h
{
nZod:=1+aData//30
gr0:=aData-(nZod-1)*30
Grad:=Floor(gr0)
min0:=(gr0-Grad)*60
Min:=Floor(min0)
Sec:=Floor((min0-min)*60)
this.Data:=aData
this.DataZ:=gr0
this.GradZ:=Grad
this.MinZ:=Min
this.SecZ:=Sec
this.nZod:=nZod
if nZod=1
this.Zod:="Овен "
else if nZod=2
this.Zod:="Телец "
else if nZod=3
this.Zod:="Близнецы"
else if nZod=4
this.Zod:="Рак "
else if nZod=5
this.Zod:="Лев "
else if nZod=6
this.Zod:="Дева "
else if nZod=7
this.Zod:="Весы "
else if nZod=8
this.Zod:="Скорпион"
else if nZod=9
this.Zod:="Стрелец "
else if nZod=10
this.Zod:="Козерог "
else if nZod=11
this.Zod:="Водолей "
else if nZod=12
this.Zod:="Рыбы "
if nZod in 1,4,7,10
this.Cress:=1
else if nZod in 2,5,8,11
this.Cress:=2
else if nZod in 3,6,9,12
this.Cress:=3
if nZod in 1,5,9
this.Element:=1
else if nZod in 2,6,10
this.Element:=2
else if nZod in 3,7,11
this.Element:=3
else if nZod in 4,8,12
this.Element:=4
if Num=1
this.Name := "Солнце "
else if Num=2
this.Name := "Луна "
else if Num=3
this.Name := "Меркурий "
else if Num=4
this.Name := "Венера "
else if Num=5
this.Name := "Марс "
else if Num=6
this.Name := "Юпитер "
else if Num=7
this.Name := "Сатурн "
else if Num=8
this.Name := "Уран "
else if Num=9
this.Name := "Нептун "
else if Num=10
this.Name := "Плутон "
else if Num=11
this.Name := "Хирон "
else if Num=12
this.Name := "Прозерпина "
else if Num=13
this.Name := "Восх.Узел "
else if Num=14
this.Name := "Нисх.Узел "
else if Num=15
this.Name := "Селена "
else if Num=16
this.Name := "Лилит "
else if Num=17
this.Name := "Колесо Фортуны"
else if Num=18
this.Name := "Крест Судьбы "
loop, 12 { ; определение нахождения планет в домах
ind2:= (A_Index+1=13 ? 1 : A_Index+1)
H1:=House%A_Index%.H_Data
H2:=House%ind2%.H_Data
h1-h2>180 ? (this.Data-h1>0 ? h2+=360 : h1-=360) :
if (this.Data > H1) & (this.Data < H2) {
this.inHouse:=A_Index
break
}
}
} ; конец блока расчета планет
else
{
nZod:=1+aData//30
gr0:=aData-(nZod-1)*30
Grad:=Floor(gr0)
min0:=(gr0-Grad)*60
Min:=Floor(min0)
Sec:=Floor((min0-min)*60)
this.H_Data:=aData
this.H_DataZ:=gr0
this.H_GradZ:=Grad
this.H_MinZ:=Min
this.H_SecZ:=Sec
this.H_nZod:=nZod
if nZod=1
this.H_Zod:="Овен "
else if nZod=2
this.H_Zod:="Телец "
else if nZod=3
this.H_Zod:="Близнецы"
else if nZod=4
this.H_Zod:="Рак "
else if nZod=5
this.H_Zod:="Лев "
else if nZod=6
this.H_Zod:="Дева "
else if nZod=7
this.H_Zod:="Весы "
else if nZod=8
this.H_Zod:="Скорпион"
else if nZod=9
this.H_Zod:="Стрелец "
else if nZod=10
this.H_Zod:="Козерог "
else if nZod=11
this.H_Zod:="Водолей "
else if nZod=12
this.H_Zod:="Рыбы "
this.H_Name:= "Дом " (Num>9 ? Num : "0" Num)
}
}
}
Return
off: Наверное, я ни как не могу отказаться от Delphi-йской привычки записывания через классы...