Вместо 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 идет именно в инклуд с учётом директивы препроцессора.

Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Ренату просто скорее всего не до этого.Не думаю что вопрос не решаемый,просто маловато опыта.
Суть вопроса(чтобы не писать заново привожу как есть тексты лс отправленных Ренату Фатхуллину):
Отправлено 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.