Тип time_t в Visual C++ 2010. Кто сталкивался и решил проблему?

 

Ренату просто скорее всего не до этого.Не думаю что вопрос не решаемый,просто маловато опыта.

Суть вопроса(чтобы не писать заново привожу как есть тексты лс отправленных Ренату Фатхуллину): 

Отправлено Renat | 18 июля 2010 01:13

wgann 18.07.2010 01:13 правка | удалить

Здравствуйте Ренат! Заранее прошу прошу прошение за то,что пишу в личку (если это является нарушением правил ).

Вопрос возник по "следам" прочтения Вашей статьи https://www.mql5.com/ru/articles/18.

Чтобы получше разобраться как все это работает решил написать небольшую программку в которой моделируется ситуация передачи массива котировок в функции для последующей работы с ними. Делаю это пока без участия каких либо скриптов,функций и т.п. со стороны терминала.Использую Visual C++ 2010 Express,тип приложения консольное.

Алгоритм выбрал такой: чтение файла .hst с одновременным заполнением динамического массива и затем уже передача этого массива в функцию для дальнейшей обработки. И вот тут-то я и "споткнулся". Не получается нормально прочитать заголовок и первый блок структуры типа RateInfo. Такое ощущение что заголовок наезжает на котировки.Но скорее всего что-то не так делаю я.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
struct HistoryHeader
{
int version; // версия базы
char copyright[64]; // копирайт
char symbol[12]; // инструмент
int period; // период инструмента
int digits; // число знаков после запятой в инструменте
time_t timesign; // временной отпечаток создания базы
time_t last_sync; // время последней синхронизации
int unused[13]; // для будущего использования
}HstrHdr;


#pragma pack(push,1)
//---- standard representation of the quote in the database
struct RateInfo
{
time_t ctm; // current time in seconds
double open;
double low;
double high;
double close;
double vol;
};
#pragma pack(pop)

FILE *fp;
int count,elnum;
struct RateInfo rate;

printf("sizeof(struct HistoryHeader) %d\n",sizeof(struct HistoryHeader));// для себя
printf("sizeof(struct RateInfo) %d\n",sizeof(struct RateInfo));// для себя;кстати здесь почему-то не сработал \n

if((fp=fopen("C:\\Program Files\\MetaTrader - Alpari\\history\\Alpari-Demo\\EURUSD1440.hst","rb"))==NULL)
{
printf("Error opening file!\n");
return;
}
if(fp)
{
count=fread(&HstrHdr,sizeof(struct HistoryHeader),1,fp);//читаю заголовок
count=fread(&rate,sizeof(struct RateInfo),1,fp);// и то,что за ним и по идее(моей) там должна быть первая котировка

if(ferror(fp))
{
perror("Error file reading!\n");
exit(1);
}
}

fclose(fp);

printf("the last synchronization time: %s\n",ctime(&(HstrHdr.last_sync)));
printf("timesign of the database creation: %s\n",ctime(&(HstrHdr.timesign)));


printf("quote open: %f\n",rate.open);
printf("quote high: %f\n",rate.high);
printf("quote low: %f\n",rate.low);
printf("quote close: %f\n",rate.close);
printf("quote volume: %f\n",rate.vol);
printf("quote time: %s\n",ctime(&(rate.ctm)));

return 0;
}


Вывод получаю такой:

sizeof(struct HistoryHeader) 160
sizeof(struct RateInfo) 48
the last synchronization time: Thu Jan 01 03:00:00 1970

timesign of the database creation: Fri Jul 16 02:49:58 2010

quote open: 1.117000
quote high: 203.000000
quote low: 1.108300
quote close: 0.000000
quote volume: 0.000000
quote time: (null)

Я пока не смог понять что я делаю не так в коде,но обнаружил небольшое расхождение в расположении полей структуры RateInfo с расположением полей в представлении архива котировок в терминале:

MT4 Userguide.chm ----->struct RateInfo { time_t ctm; double open; double low; double high; double close; double vol; };

MT4---->Сервис----->Архив котировок------->EURUSD,Daily ------>Time: 1998.05.11 00:00; Open: 1.1125; High: 1.11700; Low: 1.10480; Close: 1.10830; Volume: 203

То есть low и high идут в другом порядке. Хотя с точки зрения типов это не существенно да и вообще такое представление может быть результатом работы какой-то функции самого терминала. Но вот у меня получается на выходе вообще какая-то какая-то белиберда.

Причем если я меняю расположение полей в RateInfo на такое:

struct RateInfo
{
double open;
double low;
double high;
double close;
double vol;
time_t ctm; // current time in seconds
};

то вывод получаю такой :

sizeof(struct HistoryHeader) 160
sizeof(struct RateInfo) 48
the last synchronization time: Thu Jan 01 03:00:00 1970

timesign of the database creation: Fri Jul 16 02:49:58 2010

quote open: 1.104800
quote high: 1.108300
quote low: 1.117000
quote close: 203.000000
quote volume: 0.000000
quote time: (null)

Возможно я уже должен был догадаться по этим результатам в чем ошибка,но пока не получается.

Прошу Вашей помощи.

Прилагаю файл .с с кодом.
 

 Отправлено Renat | 18 июля 2010 11:07

wgann 18.07.2010 11:07 правка | удалить

Похоже дело в размере по умолчанию типа time_t в Visual C++ 2010. Он равен 8,в то время как в файле значение времени занимает 4.

Вставка #define _USE_32BIT_TIME_T сразу после #include не помогает,sizeof(time_t)=8.

Файлы:
test2.txt  2 kb
 

Вместо time_t используй unsigned int

или определи такую директиву

#define _USE_32BIT_TIME_T

 
elritmo:

Вместо time_t используй unsigned int

или определи такую директиву

#define _USE_32BIT_TIME_T


См. выше последняя строка
 
wgann:

См. выше последняя строка


Вставка #define _USE_32BIT_TIME_T сразу после #include не помогает,sizeof(time_t)=8.

А почему после #include? Такие объявления надо делать как можно раньше. Дефайны обратной силы не имеют

 

У меня такие работают:

    #pragma pack(push, 1)
     struct RateInfo
      {
       unsigned long ulTimeOpen;
       double        dPriceOpen;
       double        dPriceLow;
       double        dPriceHigh;
       double        dPriceClose;
       double        dVolume;
      };
     struct HeaderFileHistory
      {
       int  nVersion;        // Версия.
       char szCopyright[64]; // Копирайт.
       char szSymbol[12];    // Инструмент.
       int  nTimeFrame;      // ТФ в минутах за период.
       int  nDigits;         // Количество знаков после запятой.
       int  nTimeSign;       // Знак времени.
       int  nLastSync;       // Последняя синхронизация.
       int  aiUnused[13];    // 
      };
    #pragma pack(pop)
 

Спасибо всем за ответы!

Как появится время проверю все эти варианты.

Еще раз спасибо! 

 
wgann:

См. выше последняя строка

Дейсвительно ктож делает такой дефайн после include. переопределение типа типа tipedef time_t идет именно в инклуд с учётом директивы препроцессора.