Ошибки, баги, вопросы - страница 717

 
sergeev:
curwords = NULL
почему тогда на Print("next======",curwords.m_next!=NULL);    не выдаёт ошибку?
 
fellow:
почему тогда на Print("next======",curwords.m_next!=NULL);    не выдаёт ошибку?

потомучто

curwords.m_next!=NULL


Вы обнуляете ссылки при создании объектов?

ведь она ж родимая не NULL при создании имеет.

И ваапще, разработчики вам дали функцию CheckPointer.  пользуйтесь.

 
MoneyJinn:
Удаляется элемент с индексом 0, а должен удаляться самый последний элемент массива, то есть с индексом (n-1), где n - размер массива.     
Подождите. Сначала Вы писали, что "Ошибка ArrayResize() при уменьшении размера массива, когда ArraySetAsSeries() = true". Т.е. у Вас самый "свежий" элемент имел индекс 0. Правильно?
 

обнулил 

int OnInit()
{
firstwords.m_next=NULL; firstwords.m_prev=NULL;  

 результат тот же

сам попробуй 

 
fellow:

сам попробуй 

че мне пробовать :) 

у меня все нормально работает :))

 

Иконки можно настроить и отобразить нужные.

Терминал пишет в папку Пользователя.Я указываю ключ /portable в ярлыке. 

 
fellow:

обнулил 

int OnInit()
{
firstwords.m_next=NULL; firstwords.m_prev=NULL;  

 результат тот же

сам попробуй 

Пожалуйста, напишите в сервисдеск. Укажите ОС, битность и билд терминала. Приложите исходники, на которых проблема воспроизводится постоянно - будем разбираться.

Общайтесь с разработчиками через Сервисдеск!
Общайтесь с разработчиками через Сервисдеск!
  • www.mql5.com
Ваше сообщение сразу станет доступно нашим отделам тестирования, технической поддержки и разработчикам торговой платформы.
 
Yedelkin:

ОК. Тогда я возьму на себя наглость. Итак, в описании функции Print() сказано, что "Данные типа double выводятся с точностью до 16 десятичных цифр после точки". На самом деле оказалось, что функция Print() выводит несколько округлённые данные:

 

ND 0 victorg2 (EURUSD,M1) 11:04:42 Print(b)=200.0
MP 0 victorg2 (EURUSD,M1) 11:04:42 Print(DoubleToString(b,16))=199.9999999999999716

 

Спасибо за поднятую тему, в справку добавлен новый, более полный пример для функции Print:

Пример:

void OnStart()
  {
//--- выведем DBL_MAX с помощью Print(), это равносильно PrintFormat(%%.16G,DBL_MAX)
   Print("---- как выглядит DBL_MAX -----");
   Print("Print(DBL_MAX)=",DBL_MAX);
//--- теперь выведем число DBL_MAX с помощью PrintFormat()
   PrintFormat("PrintFormat(%%.16G,DBL_MAX)=%.16G",DBL_MAX);
//--- Вывод в журнал "Эксперты"
// Print(DBL_MAX)=1.797693134862316e+308
// PrintFormat(%.16G,DBL_MAX)=1.797693134862316E+308
 
//--- посмотрим как выводится тип float
   float c=(float)M_PI; // нужно явно приводить к целевому типу
   Print("c=",c, "    Pi=",M_PI, "    (float)M_PI=",(float)M_PI);
// c=3.14159    Pi=3.141592653589793    (float)M_PI=3.14159
   
//--- покажем, что может произойти при арифметических операциях над вещественными типами
   double a=7,b=200;
   Print("---- перед арифметическими операциями");
   Print("a=",a,"   b=",b);
   Print("Print(DoubleToString(b,16))=",DoubleToString(b,16));
//--- разделим a на b (7/200)
   a=a/b;
//--- теперь как будто восстановим значение в переменной b
   b=7.0/a; // ожидается, что b=7.0/(7.0/200.0)=>7.0/7.0*200.0=200 - но это не так
//--- выведем вновь вычисленное значение b
   Print("----- после арифметических операций");
   Print("Print(b)=",b);
   Print("Print(DoubleToString(b,16))=",DoubleToString(b,16));
//--- вывод в журнал "Эксперты"
// Print(b)=200.0
// Print(DoubleToString(b,16))=199.9999999999999716 (видим, что на самом деле b уже не равно 200.0)   
 
//--- создадим очень маленькое значение epsilon=1E-013
   double epsilon=1e-13;
   Print("---- создадим очень маленькое число");
   Print("epsilon=",epsilon); // получим   epsilon=1E-013
//--- теперь вычтем эпсилон из числа b и выведем снова значение в журнал "Эксперты"
   b=b-epsilon;
//--- выводим двумя способами
   Print("---- после вычитания epsilon из переменной b");
   Print("Print(b)=",b);
   Print("Print(DoubleToString(b,16))=",DoubleToString(b,16));
//--- вывод в журнал "Эксперты"
// Print(b)=199.9999999999999  (теперь значение b после вычитания эпсилон не может округлиться до 200)
// Print(DoubleToString(b,16))=199.9999999999998578
//    (теперь значение b после вычитания эпсилон не может округлиться до 200)
  }
 

как узнать Point для двух валют?

для текущего инструмента: 

double P1=Point();

 скажем для валют Symbol1, Symbol2?

 

Размер пункта можно получить с помощью SymbolInfoDouble(имя_символа, свойство).

ENUM_SYMBOL_INFO_DOUBLE

Идентификатор

Описание

Тип свойства

SYMBOL_BID

Bid - лучшее предложение на продажу

double

SYMBOL_ASK

Ask - лучшее предложение на покупку

double

SYMBOL_LAST

Цена, по которой совершена последняя сделка

double

SYMBOL_POINT

Значение одного пункта

double