Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 27.10.2015, 16:48
yarockiisergei yarockiisergei вне форума
Прохожий
 
Регистрация: 25.07.2008
Сообщения: 23
Версия Delphi: 6
Репутация: 10
По умолчанию Помогите перевести из C++ в Паскаль

Есть выражение uint64_t result = *(uint64_t*)(&ts);
Как оно будет выглядеть в Delphi???
Вот вся функция

struct TTimeStamp
{
int Time; // The Time field indicates the number of milliseconds that have elapsed since midnight.
int Date; // The Date field indicates the number of calendar days since the start of the calendar (the number of days since 1/1/0001 plus one).
};

uint64_t __fastcall DateTimeToInt64( TDateTime Value )
{
TTimeStamp ts = DateTimeToTimeStamp( Value );
uint64_t result = *(uint64_t*)(&ts);
return result;
}
Ответить с цитированием
  #2  
Старый 27.10.2015, 19:21
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, наверное, можно попробовать так:
Код:
type
  TTimeStamp = packed record
    Time Integer;
    Date Integer;
  end;

function DateTimeToInt64(Value : TDateTime) : Cardinal; // 64-bit unsigned int
var
  ts : TTimeStamp;
begin
  ts.Date := DaysBetween(EncodeDate(1,1,1),DateOf(Value))+1;
  ts.Tme := MilliSecondOf(TimeOf(Value));
  Result := Cardinal(ts);
end;
Ответить с цитированием
  #3  
Старый 29.10.2015, 09:05
yarockiisergei yarockiisergei вне форума
Прохожий
 
Регистрация: 25.07.2008
Сообщения: 23
Версия Delphi: 6
Репутация: 10
По умолчанию

Чуть поправил и все ровно не работает как нужно
Код:
function DateTimeToInt64(Value : TDateTime) : Cardinal; // 64-bit unsigned int
var
  ts : TTimeStamp;
begin
  ts.Date := DaysBetween(EncodeDate(1,1,1),DateOf(Value))+1;
  ts.Time := MilliSecondOf(TimeOf(Value));
  Result := Cardinal(ts.Date +ts.Time);
end;

А обратно как?
Есть также функция на с++
Код:
//------------------------------------------------------------------------------
// Из uint64_t в TDateTime
//------------------------------------------------------------------------------
TDateTime __fastcall Int64ToDateTime( uint64_t Value )
{
  TTimeStamp ts;
  *((uint64_t*)(&ts)) = Value;
  return TimeStampToDateTime( ts );
}

Последний раз редактировалось yarockiisergei, 29.10.2015 в 09:14.
Ответить с цитированием
  #4  
Старый 29.10.2015, 09:41
yarockiisergei yarockiisergei вне форума
Прохожий
 
Регистрация: 25.07.2008
Сообщения: 23
Версия Delphi: 6
Репутация: 10
По умолчанию

Интересует конкретно вот эта операция
Код:
*((uint64_t*)(&ts)) = Value;

Есть вот такая структура 

type TDateTime = type Double;

type TTimeStamp = record
   Time: Integer;     // Число миллисекунд прошедших с полуночи
   Date: Integer;     // Количество дней прошедших с 1 января 0001г
   end;

function Convert_my() : TDateTime
var
ts: TTimeStamp;
begin
ts:= //Как сюда положить вот это число 3160610655694693 -?
//Возможно только dt.Time dt.Date
//В с++ все вроде как просто *((uint64_t*)(&ts)) = Value; и далее TimeStampToDateTime( ts );
Convert_my:= TimeStampToDateTime( ts);
end;
Ответить с цитированием
  #5  
Старый 29.10.2015, 11:24
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от yarockiisergei
... ts:= //Как сюда положить вот это число 3160610655694693 -?..
Похоже никак, поскольку макс значение для integer = 2147483647, или может можно, но только если у переменных записи Time и Date тип поменять на Int64, где макс = 9223372036854775807
Ответить с цитированием
  #6  
Старый 30.10.2015, 15:01
yarockiisergei yarockiisergei вне форума
Прохожий
 
Регистрация: 25.07.2008
Сообщения: 23
Версия Delphi: 6
Репутация: 10
По умолчанию

Я узнал что можно вложить через указатель на структуру...
Вопрос как реализовать????
Ответить с цитированием
  #7  
Старый 30.10.2015, 17:41
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Код:
var
  ts : ^Cardinal;
begin
  New(ts);
  ts^ := 3160610655694693;
Это?
Ответить с цитированием
  #8  
Старый 02.11.2015, 08:16
yarockiisergei yarockiisergei вне форума
Прохожий
 
Регистрация: 25.07.2008
Сообщения: 23
Версия Delphi: 6
Репутация: 10
По умолчанию

Да.... спасибо все заработало.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:42.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025