Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.01.2010, 18:13   #1
Kolik317
Пользователь
 
Регистрация: 14.08.2009
Сообщений: 64
По умолчанию C++ -> Delphi

В обще программа расчета дней солнцестояний, в нете есть исходник на C++ - http://www.codeguru.com/code/legacy/...me/Seasons.zip.

Мне надо перевести тоже самое один в один в делфи... вроде перевел, правильно выдает год, месяц и время а в дне почемуто ошибается на 1-2...
Ошибка наверно в округлениях а может еще где-то...

Код:
Function calculatedate(val : real) : string;
var
	 ut:real;
	 jdn:Integer ;
 year, month, day:integer ;
 hour, minute:integer ;
 julian:boolean ;
	 x, z, m, d, y:real ;
	daysPer400Years :Integer  ;
 fudgedDaysPer4000Years :Integer ;
 LASTJULJDN:integer;
 begin
   LASTJULJDN:=2299160;
    daysPer400Years := 146097 ;
    fudgedDaysPer4000Years := 1460970 + 31 ;

  val:= val+0.5 ;

 jdn := floor(val) ;
	ut := val - jdn ;



 if jdn<=LASTJULJDN then
julian := true else
 julian := false;

x := jdn + 68569 ;

	if julian then
  begin
		x:=x+ 38 ;
		daysPer400Years := 146100 ;
		fudgedDaysPer4000Years := 1461000+1 ;
		end;

	z := floor(4 * x / daysPer400Years);
	x := floor(x - (daysPer400Years * z + 3) / 4) ;
	y := floor(4000 * (x + 1)/ fudgedDaysPer4000Years) ;
	x := floor(x - 1459 * y/ 4 + 31 );
	m :=floor( 80 * x/2447) ;
	d := floor(x - 2447 * m / 80) ;
	x := floor(m/11 );
	m := floor(m + 2 - 12 * x) ;
	y := floor(100 * (z - 49) + y + x) ;
	year := floor(y) ;
	month := floor(m) ;
	day :=floor(d) ;
	if year <= 0 then                   // adjust BC years
		year:=year-year;

	hour :=floor(ut * 24) ;
	minute :=floor((ut * 24 - hour) * 60) ;  //  Accurate to about 15 minutes c. 2000 CE.

	calculatedate:=inttostr(day)+' '+inttostr(month)+' '+inttostr(year)+' '+inttostr(hour)+' '+inttostr(minute) ;
- мой код делфи

Код:
CString CSeasonsDlg::CalculateDate(double val)
{
	CString retval ;
	double ut ;
	int jdn ;
	int year, month, day ;
	int hour, minute ;
	BOOL julian ;
	long x, z, m, d, y ;
	long daysPer400Years = 146097L ;
	long fudgedDaysPer4000Years = 1460970L + 31 ;
	
	val += 0.5 ;       //  Convert astronomical JDN to chronological
	
	jdn = (long)floor(val) ;
	ut = val - jdn ;
	julian = (jdn <= LASTJULJDN) ;
	x = jdn + 68569L ;
	
	if (julian) {
		x += 38 ;
		daysPer400Years = 146100L ;
		fudgedDaysPer4000Years = 1461000L + 1 ;
		}
	
	z = 4 * x / daysPer400Years ;
	x = x - (daysPer400Years * z + 3) / 4 ;
	y = 4000 * (x + 1) / fudgedDaysPer4000Years ;
	x = x - 1461 * y / 4 + 31 ;
	m = 80 * x / 2447 ;
	d = x - 2447 * m / 80 ;
	x = m / 11 ;
	m = m + 2 - 12 * x ;
	y = 100 * (z - 49) + y + x ; 
	year = (int)y ;
	month = (int)m ;
	day = (int)d ;          
	if (year <= 0)                   // adjust BC years
		year-- ;
	
	hour = (int)(ut * 24) ;
	minute = (int)((ut * 24 - hour) * 60) ;  //  Accurate to about 15 minutes c. 2000 CE.
	
	retval.Format("%02d-%02d-%4d %02d:%02d GMT", day, month, year, hour, minute) ;
	
	return (retval) ;
}
код c++


Может проблема тут ? 1461000L + 1.. я просто почти полный чайник в си, не пойму зачем L на конце и +1 еще.
Вложения
Тип файла: rar Unit2.rar (1.2 Кб, 3 просмотров)
Kolik317 вне форума Ответить с цитированием
Старый 16.01.2010, 18:29   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

В исходнике же указано - long, что соответствует дельфийскому longint...
mihali4 вне форума Ответить с цитированием
Старый 16.01.2010, 18:32   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

это просто Long обозначает...
а вы уверены что вам нужно Floor, а не Trunc?

там же не округление а отброс дробной части.

Михалыч, LongInt=Integer при 32х битном компиле.
но соглашусь в одном, надежнее всетаки LongInt при Long
а при Int ставим Integer
ибо так будет точное соответствие типов.при любом компиле.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 16.01.2010 в 18:43.
Пепел Феникса вне форума Ответить с цитированием
Старый 16.01.2010, 18:58   #4
Kolik317
Пользователь
 
Регистрация: 14.08.2009
Сообщений: 64
По умолчанию

Попробовал заменил тип на longint, не помогло, вместо floor не помогло ни trunc() не int()


А зачем после L еще один прибавлять? что сразу чтоли нельзя прибавить? или это что-нибудь значит


И Round тоже совсем не в тему

Последний раз редактировалось Kolik317; 16.01.2010 в 19:07.
Kolik317 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
На Delphi 7 сделать игру кто хочет стать миллионером в delphi 7 666dart666 Помощь студентам 11 04.11.2010 17:57
Программа-тест в Delphi) скиньте))а то програмку здавать преподу надо,и самой хочется понять Delphi Верчик Помощь студентам 9 02.03.2009 17:46
Delphi. Как нарисовать в Delphi два движущиеся шара с определенной скоростью? redred Общие вопросы Delphi 10 11.12.2007 10:43
Как открыть БД, написанную в Delphi если нf другой машине Delphi нет? dagarik БД в Delphi 7 22.10.2007 17:54
не StringGrid1.Cells[1,1]:='Delphi'; а вот так SG1.C[1,1]:='Delphi' Nemesisking Компоненты Delphi 7 08.09.2007 03:27