1 (изменено: Mikki, 2013-04-27 21:43:22)

Тема: AHK: использование функций из swedll32.dll (Астрологические расчеты)

(added 26.04.2013. обновил название темы и аттачмент)

Доброго вечера.
Пожалуйста перепишите обращение к dll-функции c паскаля на AHK:

{расчет положения of planets, asteroids, lunar nodes and apogees}
function swe_calc(tjd         : double;    {Julian day number}  
                    ipl         : Integer;   {planet number}
                    iflag       : Longint;   {flag bits}
                    var xx      : double;    {first of 6 doubles}
                    sErr        : PChar      {Error-String}
                    ): Longint; stdcall; far; external 'swedll32.dll' name '_swe_calc@24';

Спасибо.

Сайт авторов

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

2

Re: AHK: использование функций из swedll32.dll (Астрологические расчеты)

#NoEnv 

    SetWorkingDir, %A_ScriptDir%
    hSwiss := DllCall("LoadLibrary", Int, "swedll32.dll")
    MsgBox, % hSwiss "`n`nError: " ErrorLevel
    tjd:=20000
    ipl:=0
    iflag:=1
    
    result:=DllCall("swedll32.dll\_swe_calc@24", Double, tjd, Int, ipl, Int, iflag, Double, xx, str, sERR) "`n`nError: " ErrorLevel
     
    MsgBox, % xx "   err=" sERR "   result=" result
     
     DllCall("FreeLibrary", "UInt", hSwiss)

Выдает на втором DllCall Errorlevel = 0xC0000005
В справке написано, что это "нарушение прав доступа"

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

3 (изменено: creature.ws, 2013-04-27 01:38:12)

Re: AHK: использование функций из swedll32.dll (Астрологические расчеты)

LoadLibrary при однократном вызове библиотечной функции не требуется. Параметр LoadLibrary — строка, не Int. PChar это указатель на Char, не "Str". Откуда взялась переменная "xx"? FreeLibrary нет необходимости использовать. hSwiss - может уместиться в Uint, но в актуальной версии autohotkey правильнее использовать "Ptr".

4 (изменено: Mikki, 2013-04-27 01:49:23)

Re: AHK: использование функций из swedll32.dll (Астрологические расчеты)

LoadLibrary нужна т.к. функция будет вызываться многократно. Заменил Int на Srt - спасибо. Str заменил на Char * . Переменная xx - это результат работы функции _swe_calc@24.

= ошибку больше не пишет, но  xx все равно пустой.

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

5

Re: AHK: использование функций из swedll32.dll (Астрологические расчеты)

Предварительно под xx следует выделить место. VarSetCapacity(xx, 8, 0)

6 (изменено: Mikki, 2013-04-27 21:38:07)

Re: AHK: использование функций из swedll32.dll (Астрологические расчеты)

В первом посте темы я вложил dll. Ниже приведен скрипт который я пробую, но xx не получаю от длл-функции

#NoEnv 

/*
  function swe_calc(tjd         : double;    {Julian day number}     {расчет положения of planets, asteroids, lunar nodes and apogees}
                    ipl         : Integer;   {planet number}
                    iflag       : Longint;   {flag bits}
                    var xx      : double;    {first of 6 doubles}
                    sErr        : PChar      {Error-String}
                    ): Longint; stdcall; far; external 'swedll32.dll' name '_swe_calc@24';

*/
    SetWorkingDir, %A_ScriptDir%
    hSwiss := DllCall("LoadLibrary",str, "swedll32.dll")
    MsgBox, % hSwiss "`n`nError: " ErrorLevel
    tjd:=20000
    ipl:=0
    iflag:=1
    
    VarSetCapacity(xx, 8)
    VarSetCapacity(sERR, 256)
    result:=DllCall("swedll32.dll\_swe_calc@24", Double, tjd, Int, ipl, Int, iflag, Double, xx, Char *, sERR) "`n`nError: " ErrorLevel
     
    MsgBox, % xx "   err=" sERR "   result=" result
     
     DllCall("FreeLibrary", Ptr, hSwiss)

Извините, что гружу вас этим, но на дэлфях писать после AHK невмоготу.

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

7

Re: AHK: использование функций из swedll32.dll (Астрологические расчеты)

Что-то ни dll, ни doc не хотят грузиться, так что ограничусь теорией.

Если функция пишет в хх, то ей нужен указатель на хх, а не значение хх. Если число одно, то VarSetCapacity по идее не нужна, просто указать для параметра тип Double *.

Или, учитывая {first of 6 doubles}, там должно быть 6 чисел такого типа? Если да, то выделять под них место через VarSetCapacity (8 * 6 = 48 байт) и после вызова функции считывать их через NumGet.

8

Re: AHK: использование функций из swedll32.dll (Астрологические расчеты)


#NoEnv 

/*
  function swe_calc(tjd         : double;    {Julian day number}     {расчет положения of planets, asteroids, lunar nodes and apogees}
                    ipl         : Integer;   {planet number}
                    iflag       : Longint;   {flag bits}
                    var xx      : double;    {first of 6 doubles}
                    sErr        : PChar      {Error-String}
                    ): Longint; stdcall; far; external 'swedll32.dll' name '_swe_calc@24';

*/
    SetWorkingDir, %A_ScriptDir%
    hSwiss := DllCall("LoadLibrary",str, "swedll32.dll")
    MsgBox, % hSwiss "`n`nError: " ErrorLevel
    tjd:=20000
    ipl:=0
    iflag:=1
    
    VarSetCapacity(xx, 8 * 6)
    VarSetCapacity(sERR, 256)

    result:=DllCall("swedll32.dll\_swe_calc@24"
                    , Double, tjd
                    , Int, ipl
                    , Int, iflag
                    , Ptr, &xx
                    , Ptr, &sERR) "`n`nError: " ErrorLevel

    xx1 := NumGet(xx, "Double")
    sERR := StrGet(&sERR, "cp1252")

    MsgBox, xx1 = %xx1%`nsERR = %sERR%`nresult = %result%
     
     DllCall("FreeLibrary", Ptr, hSwiss)

9

Re: AHK: использование функций из swedll32.dll (Астрологические расчеты)

Выдержка из доки по этой длл:

int swe_calc ( double tjd, int ipl, int iflag, double* xx, char* serr),
where
tjd    =Julian day
ipl    =body number
iflag    =a 32 bit integer containing bit flags that indicate what kind of computation is wanted
xx     =array of 6 doubles for longitude, latitude, distance, speed in long., speed in lat., and speed in dist.
serr[256] =character string to return error messages in case of error.

Спасибо огромное YMP за "причесывание" моего кода. Начало выдавать xx (!!!)
А как получить хх2, хх3, итд?

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

10

Re: AHK: использование функций из swedll32.dll (Астрологические расчеты)

xx2 := NumGet(xx, 8, "Double")
xx3 := NumGet(xx, 16, "Double")
...

11 (изменено: Mikki, 2013-04-27 21:37:38)

Re: AHK: использование функций из swedll32.dll (Астрологические расчеты)

..учусь, учусь помалеху. Спасибо.

(added 26.04.2013. обновил название темы и аттачмент)

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

12

Re: AHK: использование функций из swedll32.dll (Астрологические расчеты)

Добавил сам обращение к функции _swe_julday@24. Подозреваю, что не правильно добавил. Но это ладно. Однако скрипт, почему-то, перестаёт выдавать xx, пока не закоментишь обращение к _swe_julday@24.

#NoEnv 


    SetWorkingDir, %A_ScriptDir%
    hSwiss := DllCall("LoadLibrary",str, "swedll32.dll")

    tt:= A_Hour+A_Min/0.6
    r_tjd:=DllCall("swedll32.dll\_swe_julday@24"
                    , Int, A_Year
                    , Int, A_MM
                    , Int, A_Mday
                    , Double, tt
                    , Int, 0) "`n`nError: " ErrorLevel
    MsgBox, r_tjd = %r_tjd% 

    tjd:=2000000
    ipl:=0
    iflag:=0
    
    VarSetCapacity(xx, 8 * 6)
    VarSetCapacity(sERR, 256)

    result:=DllCall("swedll32.dll\_swe_calc_ut@24"
                    , Double, tjd
                    , Int, ipl
                    , Int, iflag
                    , Ptr, &xx
                    , Ptr, &sERR) "`n`nError: " ErrorLevel

    xx1 := NumGet(xx, "Double")
    xx2 := NumGet(xx, 8, "Double")
    xx3 := NumGet(xx, 16, "Double")

    sERR := StrGet(&sERR, "cp1252")

    MsgBox, xx1 = %xx1%`nxx2 = %xx2%`nxx3 = %xx3%`nsERR = %sERR%`nresult = %result%
     
     DllCall("FreeLibrary", Ptr, hSwiss)
Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

13

Re: AHK: использование функций из swedll32.dll (Астрологические расчеты)

_swe_julday@24 возвращает Double. Это нужно указать в дополнительном последнем параметре при вызове функции. Календарь у нас григорианский, поэтому 5-й параметр должен быть 1. При вычислении долей часа A_Min нужно делить на 60. После этих исправлений вроде всё работает.


#NoEnv 

    SetWorkingDir, %A_ScriptDir%
    hSwiss := DllCall("LoadLibrary",str, "swedll32.dll")

    tt:= A_Hour+A_Min/60

    r_tjd:=DllCall("swedll32.dll\_swe_julday@24"
                    , Int, A_Year
                    , Int, A_MM
                    , Int, A_Mday
                    , Double, tt
                    , Int, 1
                    , Double) "`n`nError: " ErrorLevel

    MsgBox, r_tjd = %r_tjd% 

    tjd:=2000000
    ipl:=0
    iflag:=0
    
    VarSetCapacity(xx, 8 * 6)
    VarSetCapacity(sERR, 256)

    result:=DllCall("swedll32.dll\_swe_calc_ut@24"
                    , Double, r_tjd
                    , Int, ipl
                    , Int, iflag
                    , Ptr, &xx
                    , Ptr, &sERR) "`n`nError: " ErrorLevel

    xx1 := NumGet(xx, "Double")
    xx2 := NumGet(xx, 8, "Double")
    xx3 := NumGet(xx, 16, "Double")

    sERR := StrGet(&sERR, "cp1252")

    MsgBox, xx1 = %xx1%`nxx2 = %xx2%`nxx3 = %xx3%`nsERR = %sERR%`nresult = %result%
     
     DllCall("FreeLibrary", Ptr, hSwiss)

14

Re: AHK: использование функций из swedll32.dll (Астрологические расчеты)

YMP, еще раз - огромное спасибо.

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

15

Re: AHK: использование функций из swedll32.dll (Астрологические расчеты)

Доброго здравия читающим.

Благодаря поучениям и наставлениям опытных програмеров (т.е. Вас) программа пишется и "хомуты" убираются. Но - назрел вопрос о правильности моего подхода к концепции в целом.

Вы, как более опытные в написании многостраничного кода, что скажете об использовании Объекта в качестве массива данных?...(наверное не корректно излагаю мысль..)

Для наглядности, ниже привожу код своего скрипта. Он работающий. Для его работы надо наличие одной 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

небольшое разъяснение - в методе __New происходит расчет положения планеты (или "дома") в различных элементах астрологической карты.

off: Наверное, я ни как не могу отказаться от Delphi-йской привычки записывания через классы...

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

16 (изменено: creature.ws, 2013-05-03 03:42:22)

Re: AHK: использование функций из swedll32.dll (Астрологические расчеты)

Не претендую на звание програмёра и тем более опытного, но гребёнку else if-ов для сопоставления индекса и текстового представления считаю уместным заменять на:

ZodName := [
(Join,
"Овен    "
"Телец   "
"Близнецы"
"Рак     "
"Лев     "
"Дева    "
"Весы    "
"Скорпион"
"Стрелец "
"Козерог "
"Водолей "
"Рыбы    "
)]

MsgBox % ZodName[1]

Код вами уже написан, «аборт делать поздно», но, например, блок:

nZod := 1+aData//30
gr0 := aData-(nZod-1)*30
Grad := Floor(gr0)
min0 := (gr0-Grad)*60
Min := Floor(min0)
Sec := Floor((min0-min)*60)

— повторяется дважды без изменений в if и else, как и упомянутое сопоставление. На то есть причины?

17

Re: AHK: использование функций из swedll32.dll (Астрологические расчеты)

Mikki пишет:

Но смысл в вопроса в нужности использовать структуру class. Вроде бы Вы в своих больших скриптах не использовали его для подобных целей. Это не удобно? Захламляет? Медленнее работает?

Я лично классами не пользуюсь, потому что появились они недавно и я с ними не разбирался. Что касается скорости работы, то это надо брать во внимание для операций, выполняемых в цикле очень большое число раз — тысячи, миллионы. В остальном большее значение имеет удобство написания и чтения кода. Вообще, скорость лучше оценивать, когда программа готова. Если не устраивает, тогда и думать об оптимизации и ускорении.

18

Re: AHK: использование функций из swedll32.dll (Астрологические расчеты)

creature.ws, честно говоря надеялся на ваш отзыв )) Вы всегда представляете сжатый и (еслитакможносказать) высокотехничный код.
Вопрос по Join. Я так понял эта команда все строки сводит в одну переменную. Так можно эту команду убрать и получится:

ZodName := ["Овен    ","Телец   ","Близнецы","Рак     ","Лев     ","Дева    ","Весы    ","Скорпион","Стрелец ","Козерог ","Водолей ","Рыбы    ")]

Я прав? Вы использовали Join для красоты записи?

YMP, да..наверное я перебдел. Пере присвоений классов тут нет и смысл в их использовании нулевой. Переделаю все на процедуры и запись станет короче

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

19 (изменено: serzh82saratov, 2013-05-04 21:34:37)

Re: AHK: использование функций из swedll32.dll (Астрологические расчеты)


ZodName := ["Овен    ","Телец   ","Близнецы","Рак     ","Лев     ","Дева    ","Весы    ","Скорпион","Стрелец ","Козерог ","Водолей ","Рыбы    ")]

  у вас скобка в конце лишняя.

Также можно записать для удобства чтения с переносом строки


 ZodName := ["Овен    ","Телец   ","Близнецы"
            ,"Рак     ","Лев     ","Дева    "
            ,"Весы    ","Скорпион","Стрелец "
            ,"Козерог ","Водолей ","Рыбы    "]
loop 12
    MsgBox % ZodName[A_Index]

Для ускорения работы скрипта можете добавлять

SetBatchLines, -1

но это вы наверняка знаете.,

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

20

Re: AHK: использование функций из swedll32.dll (Астрологические расчеты)

Про Join есть и в русской справке:
Разбивка длинных строк на ряд более коротких

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

21

Re: AHK: использование функций из swedll32.dll (Астрологические расчеты)

serzh82saratov, спасибо за примеры и разъяснения.

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди