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

 
JRandomTrader #:

Это демонстрационный пример, только закомментированные строки выкинул.

Какие ошибки?

FileOpen("1_testfile_rus.txt", FILE_WRITE|FILE_UNICODE|FILE_TXT, "", CP_UTF8);

компилятор вам про это наверняка сказал - там не строка передаётся а 1 символ

должно быть :

FileOpen("1_testfile_rus.txt", FILE_WRITE|FILE_UNICODE|FILE_TXT, 
',' , CP_UTF8);

какой именно символ всё равно пока нет флага FILE_CSV

PS/ вы на С/C++ не писали очевидно ? это вредные ошибки, размерность съехала

 
Maxim Kuznetsov #:

компилятор вам про это наверняка сказал - там не строка передаётся а 1 символ

должно быть :

какой именно символ всё равно пока нет флага FILE_CSV

PS/ вы на С/C++ не писали очевидно ? это вредные ошибки, размерность съехала

Да, спасибо, не заметил. Даже в тех закомментированных строчках '\t' было.

Компилятор не ругался, странно.

Но на результат не влияет, UTF-8 всё равно не пишется, только или UTF-16, или CP-1251. И ошибку не выдаёт, просто 0 символов записано.

На С/C++ - мало и давно, ещё под MS-DOS.

 
JRandomTrader #:

Да, спасибо, не заметил. Даже в тех закомментированных строчках '\t' было.

Компилятор не ругался, странно.

Но на результат не влияет, UTF-8 всё равно не пишется, только или UTF-16, или CP-1251. И ошибку не выдаёт, просто 0 символов записано.

На С/C++ - мало и давно, ещё под MS-DOS.

и ещё флаг FILE_ANSI нужен, а FILE_UNICODE нет :-)

цитирую доки

FILE_UNICODE

64

Strings of UNICODE type (two byte symbols).


а UTF-8 - однобайтная кодировка :-)

 
Maxim Kuznetsov #:

и ещё флаг FILE_ANSI нужен, а FILE_UNICODE нет :-)

цитирую доки

FILE_UNICODE

64

Strings of UNICODE type (two byte symbols).


а UTF-8 - однобайтная кодировка :-)

Что FILE_UNICODE не нужен - это понятно, просто показвыаю, что и с ним не работает.

Насчёт однобайтной - очень и очень спорно )

Да и насчёт двухбайтной - как бы тоже )

 
JRandomTrader #:

Что FILE_UNICODE не нужен - это понятно, просто показвыаю, что и с ним не работает.

Насчёт однобайтной - очень и очень спорно )

Да и насчёт двухбайтной - как бы тоже )

вот магическое сочетание флагов, которые я использую :

int f=FileOpen(fileName,FILE_WRITE|FILE_SHARE_READ|FILE_TXT|FILE_ANSI,',',CP_UTF8);      

FILE_TXT - говорит что это текст, FILE_ANSI - что однобайт, CP_UTF8 - предпочитаемая мной кодировка.

 
Maxim Kuznetsov #:

вот магическое сочетание флагов, которые я использую :

int f=FileOpen(fileName,FILE_WRITE|FILE_SHARE_READ|FILE_TXT|FILE_ANSI,',',CP_UTF8);      

FILE_TXT - говорит что это текст, FILE_ANSI - что однобайт, CP_UTF8 - предпочитаемая мной кодировка.

Это всё понятно. Но! Это под виндой или под Wine? Что оно под виндой работает, я верю. А вот под Линуксом - не удалось заставить.

Возможно, какого-то пакета не хватает, у меня всё по минимуму стоит.
 
JRandomTrader #:

под Линуксом - не удалось заставить.

MT4 и MT5 не работают одинаково с FileWriteString. Как пример, пришлось такой способ конвертации MT4->MT5 использовать, чтобы MT5 выдавал тот же результат, что и MT4.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Скрипты: StatsHTML

fxsaber, 2023.11.02 09:35

int FileOpen2( const string FileName, const int Flags )
{
  return(FileOpen(FileName, Flags | (!(Flags & FILE_BIN) ? FILE_ANSI : 0)));
}

#define FileOpen FileOpen2

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

Возможно, имеет смысл проверить на линуксе MT4, а потом уже искать решение под MT5.
 
fxsaber #:

MT4 и MT5 не работают одинаково с FileWriteString. Как пример, пришлось такой способ конвертации MT4->MT5 использовать, чтобы MT5 выдавал тот же результат, что и MT4.

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

Возможно, имеет смысл проверить на линуксе MT4, а потом уже искать решение под MT5.

MT4 тут никаким боком, никогда с ним не работал, кроме перевода с него на MT5 пары индикаторов.

С флагами проблем нет, если только возможность записи в файл в определённой кодировке не зависит от флагов режима доступа.

Просто под Линуксом (Wine) не работает вывод в файл в кодировке UTF-8.

В CP-1251 и в UTF-16 - работает, а в UTF-8 - нет.

Если я не прав и кому-то удалось под Wine штатными средствами MT5 записать в файл UTF-8 - покажите, как.

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

Я привёл код, воспроизводящий проблему https://www.mql5.com/ru/forum/1111/page3416#comment_50488072

Мне это не критично, но проблема существует.

 
Yuriy Vasilyev #:

Код, который вы предоставили, выполняет вставку нового элемента в двусвязный список на заданной позиции. Однако вы правильно заметили, что есть несколько проблем с текущей реализацией.

  1. if(index>m_data_total || index<0) return(-1); : Эта строка проверяет, что индекс находится в правильных границах. Если индекс меньше нуля или больше общего количества элементов в списке, возвращается -1. Вполне верно, что на практике часто используют возможность вставки элемента в конец списка по индексу -1, но в вашей реализации так делать нельзя из-за этой проверки.

  2. if(index==-1) ... : Этот блок кода должен позволить вставить элемент в конец списка, если указан индекс -1. Но, как вы правильно заметили, до этого места кода выполнение не дойдет из-за предыдущей проверки.

  3. В остальных строках обрабатываются остающиеся случаи: вставка элемента перед текущим узлом ( m_curr_node ) или добавление элемента в конец списка, если указанного индекса не существует.

Хорошо подмечено, что в этом коде есть противоречия/баги, которые не позволяют ему работать должным образом. Это могут быть ошибки, сделанные программистом. Если вы хотите изменить этот код, чтобы он позволил вставлять элемент в конец списка по индексу -1, вы можете изменить проверку индекса следующим образом:

if(index > m_data_total || index < -1) return(-1);

Такой код позволит пропускать индекс -1.

Должен заметить, что моё сообщение предназначалось для разработчиков и лиц сопровождающих платформу, а так как перезапись стандартной библиотеки происходит при каждом ее обновлении, то любые  изменения, сделанные пользователем, в  коде библиотеки - будут потеряны.  
По-прежнему надеюсь на необходимые системные изменения в стандартной библиотеке от самих МетаКвотов.
 
Правильно ли понимаю, что создать такую функцию невозможно?
class A
{
public:  
  virtual string Type() const { return(typename(this)); }
};

class B : public A
{
public:  
  virtual string Type() const { return(typename(this)); }
};

class C : public B
{
public:  
  virtual string Type() const { return(typename(this)); }
};

// Создает копию объекта потомка по указателю на родителя.
A* New( const A* a ) { return(NULL); }

void OnStart()
{
  A* a = new C;  
  Print(a.Type()); // class C const
  
  A* a2 = New(a); // Эту функцию нужно написать. 
  Print(a2.Type()); // class C const
}
Рецепт в виде прописывания в каждом потомке соответствующей виртуальной функции не рассматриваем.
Причина обращения: