Почему input string не имеют значение NULL? - страница 4

 
Vladimir Karputov:
Рассчитывать на значение или поведение "по-умолчанию" - себе дороже :). Но деньги Ваши - можете и дальше верить и объявлять переменные БЕЗ ПРИНУДИТЕЛЬНОЙ инициализации.

Ёкарныйбабай... Я об одном, он - о другом.

Я инициализирую всегда свои переменные. Так понятно?

Но и справку читаю, и вопросы меня интересующие в СД задаю и получаю на них ответы, которые потом знаю и могу их озвучивать, а не читать свои мантры как некоторые жители лесов ;)

 
Alexey Volchanskiy:
Артем, это вас так СД любит или другому отвечали? )))) Мне вот так не пишут, просто, спасибо за выявленную ошибку, в след. релизе исправим. А вот с глобальными переменными индикаторов надо проверить в МТ5, в четверке они сбрасывались при смене ТФ, что было для меня неприятной неожиданностью.

Не знаю насчёт любви и преданности ;)

Просто ответили профессионально, красиво и полно.

И по индикаторным тоже написали в дополнение - их поведение отличается от глобальных переменных экспертов.

 
pavlick_:

А вы не видите разницы между голым указателем и классом СТРОКА? Строка не может принимать 0, такого состояния она не имеет.

Запустите:

std::string s = 0;

Не факт, что в MQL строка - это класс. По крайней мере, @Slawa сегодня ответил, что память выделяется только под указатель на буфер. По идее, нам без разницы, класс там или рантайм своими функциями этот буфер обрабатывает, все равно код проприентарный.
 
Artyom Trishkin:

Не знаю насчёт любви и преданности ;)

Просто ответили профессионально, красиво и полно.

И по индикаторным тоже написали в дополнение - их поведение отличается от глобальных переменных экспертов.

Да, я все прочитал и удивился такому развернутому ответу )). Тут же многие СД ругают, типа, не отвечают годами. Мне кажется, товарищи пишут письма, как в клуб телепатов, вот им и не отвечают )) У меня тоже нет претензий к СД, четко реагируют на баг-репорты, которые я иногда шлю. 
 
Alexey Volchanskiy:
Да, я все прочитал и удивился такому развернутому ответу )). Тут же многие СД ругают, типа, не отвечают годами. Мне кажется, товарищи пишут письма, как в клуб телепатов, вот им и не отвечают )) У меня тоже нет претензий к СД, четко реагируют на баг-репорты, которые я иногда шлю. 
Ну да, всегда нормально.
 
pavlick_:
А вы не видите разницы между голым указателем и классом СТРОКА? Строка не может принимать 0, такого состояния она не имеет.

Не имеет?

#ifdef __cplusplus
struct String {
        String()            { len = 0;                 ch = 0; }
        String( char *_ch ) { len = strlen( _ch ) + 1; ch = new char[]; strcpy( _ch, ch ); }
        char *ch;
        int len;
};
#else
#define String  string
#endif
void OnStart()
{
        String ch1;        //NULL
        String ch2 = "";
}

Здесь строка ch1 приняла состояние NULL и она не равна ch2

и это - общепринятый подход 

 
A100:

Не имеет?

#ifdef __cplusplus
struct String {
        String()            { ch = 0; len = 0; }
        String( char *_ch ) { len = strlen( _ch ) + 1; ch = new char[]; strcpy( _ch, ch ); }
        char *ch;
        int len;
};
void OnStart()
{
        String ch1;
        String ch2 = "";
}
#endif

Вот - строка ch1 приняла состояние NULL и она не равна ch2

и это общепринятый подход 

Все зависит от оператора сравнения ))) По сути вы правы.
 
Alexey Volchanskiy:
Не факт, что в MQL строка - это класс. По крайней мере, @Slawa сегодня ответил, что память выделяется только под указатель на буфер. По идее, нам без разницы, класс там или рантайм своими функциями этот буфер обрабатывает, все равно код проприентарный.

Класс, не класс. Обо всём можно сказать что это класс, даже об int, встроенный, но класс. Раз замахнулись на реализацию строки, то нужно нормально делать, с нормальным операторм ==. А учитывая близость к С++ (разработчики себя так сами позиционировали), то и максимально возможную схожесть с ним.

Не имеет?

#ifdef __cplusplus
struct String {
        String()            { len = 0;                 ch = 0; }
        String( char *_ch ) { len = strlen( _ch ) + 1; ch = new char[]; strcpy( _ch, ch ); }
        char *ch;
        int len;
};
#else
#define String  string
#endif
void OnStart()
{
        String ch1;        //NULL
        String ch2 = "";
}

Здесь строка ch1 приняла состояние NULL и она не равна ch2

и это - общепринятый подход

1. И к чему вы мне это показываете? Вы 0 строке для инициализации передаёте? Если передадите, то он кастанётся к укзателю на чар, и вы получите исключение (в зависимости от компилятора) при копировании. Для того, чтобы использовать строки, мне не нужно смотреть реализацию, найдите хоть один конструктор, который принимает целое, а не указатель: http://en.cppreference.com/w/cpp/string/basic_string/basic_string. Давать NULL строке - это какая-то странная задумка от МК.

ЗЫ: цитирую справку для конструктора принимающего указатель на char*

5) Constructs the string with the contents initialized with a copy of the null-terminated character string pointed to by s. The length of the string is determined by the first null character. The behavior is undefined if s does not point at an array of at least Traits::length(s)+1 elements of CharT, including the case when s is a null pointer.

Т.е. передадите null - получите behavior is undefined
 

Все-таки оператор == , как минимум работает со строкой == NULL ))

 

input string Symbol_ = "EURUSD";

void OnStart()
{
    string symbol; // symbol== NULL
    if(Symbol_ == symbol)
        Print("symbol == Symbol_");
    else    
        Print("symbol != Symbol_");
}

********* 

2016.12.14 00:27:48.083 SomeTests (EURUSD.m,M1) symbol != Symbol_

PS: опять движок форума съел вложение кода, потому что я не выполнил ритуал и не вставил после кода какую-нибудь ненужную дрянь типа *********, а просто вставил код между написанных строк. Я так понимаю, за движок форума отвечает неприкасаемый, это у восточных народов встречается...

Причина обращения: