Для написания программы на данный момент использую Visual Studio 2015.
Предлагаю рабочий код:
//************************** НАЧАЛО
#include <iostream>
#include <iomanip>
#include <tchar.h>
#include <conio.h>
#include <Windows.h>
int main() {
setlocale(LC_ALL, "Russian");
char snam[40], serr[256];
int jday = 29, jmon = 7, jyear = 1987;
double jut = 0.47;
double tjd_ut, x2[6];
long iflag, iflgret;
double cusps,ascmc;
iflag = 256;
typedef void(PASCAL* swe_set_ephe_path)(char *path); //_swe_set_ephe_path@4
typedef int(PASCAL* swe_houses_ex)(double tjd_ut, int gregflag, double geolat, double geolon, int hsys, double *cusps, double *ascmc); // _swe_houses_ex@40
typedef double(PASCAL* swe_julday)(int god, int mes, int day, double hour, int gregflag); // _swe_julday@24
typedef long(PASCAL* swe_calc_ut)(double tjd_ut, int p, long iflag, double x2[], char serr[]); // _swe_calc_ut@24
typedef void(PASCAL* swe_get_planet_name)(int p, char snam[]); // _swe_get_planet_name@8
typedef void(PASCAL* swe_close)(void); //_swe_close@0
HMODULE hMod = NULL;
void InitLargeDLL();
hMod = LoadLibrary(_T("swedll32.dll"));// загружаем DLL
if (hMod) {
swe_set_ephe_path swe_set_path = (swe_set_ephe_path)GetProcAddress(hMod, "_swe_set_ephe_path@4");
swe_houses_ex swe_housesex = (swe_houses_ex)GetProcAddress(hMod, "_swe_houses_ex@40");
swe_julday swejul = (swe_julday)GetProcAddress(hMod, "_swe_julday@24");
swe_calc_ut swe_calcut = (swe_calc_ut)GetProcAddress(hMod, "_swe_calc_ut@24");
swe_get_planet_name swe_get_pl_name = (swe_get_planet_name)GetProcAddress(hMod, "_swe_get_planet_name@8");
swe_close sweclose = (swe_close)GetProcAddress(hMod, "_swe_close@0");
//************************************ установка эфемирид *********************************************************************************** установка эфемирид
// Установка каталога с файлами сторонних эфемирид. Помимо этого функциявыполняет дополнительные обязательные инициализации.
// Если сторонних эфемирид нет, то вызывается с нулевым значением для инициализации дополнительных процессов.
swe_set_path("C:\\sweph\\ephem");
//************************************ вычисление юлианского дня *************************************************************************** вычисление юлианского дня
// Установка даты и времени рождения.
tjd_ut = swejul(1987, 7, 29, 0.0, 0); // 1 - это грегурианский календарь, если поставить 0 - будет юлианский.
//************************************ вывод шапки таблици значений широт, долго, скоростей и т.д. планет ************************************ вывод шапки таблици
std::cout << "date at 0:00 Universal time: " << jday << "." << jmon << "." << jyear <<std::endl;
std::cout << "# " << std::setw(15) << std::left << "Планета"
<< std::setw(15) << "Долгота "//"tlongitude"
<< std::setw(15) << "Широта" //"tlatitude"
<< std::setw(15) << "Растояние" //"tdistance"
<< std::setw(15) << "Скорость длинная" //"tspeed long"
<< std::endl;
std::cout << "# " << std::endl;
//************************************ настройка вычисления домов *************************************************************************** настройка вычисления домов
swe_housesex(tjd_ut, 0, 55.5, 42.1, 1, &cusps, &ascmc);
// ********************************* вычисление положения планет в цикле ********************************************************************** вычисление положения планет в цикле
for (int p = 0; p < 14; p++) {
iflgret = swe_calcut(tjd_ut, p, iflag, x2, serr);
if (iflgret < 0)
std::cout << "Ошибка. Заданы неверные значения для расчета:" << serr << std::endl;
swe_get_pl_name(p, snam);
std::cout << "# " << std::setw(15) << std::left << snam
<< std::setw(15) << x2[0]
<< std::setw(15) << x2[1]
<< std::setw(15) << x2[2]
<< std::setw(15) << x2[3]
<< std::endl;
}
sweclose();
}
else
std::cout << "Не удалось загрузить swedll32.dll." << std::endl;
FreeLibrary(hMod);
_getch();
}
//**************************** КОНЕЦ
Этот пример делает расчеты градусов планет, скоростей для выбранной даты и времени, но ... со слишком большой погрешностью. В документации на библиотеку непрозрачно написано про установку всех параметров, которые нужно выставить, для получения корректных градусов.
С выше изложенным два вопроса:
1) Стоит ли перейти на среду Qt, чтобы вызывать функции из библиотеки на прямую? Поможет ли, или взять Райд студию, или вообще Бильдер ;-)
2) Какие функции и атрибуты использовать для верной настройки вычисления градусов планет для выбранных даты, времени и места.
Спасибо.