И ещё один баг. Со строковыми переменными

 

Следующий код приводит к падению терминала:

  string array[100];
  array[1]="a"+"b";
  string txt=array[1];
  txt=txt+txt;

Не перестаю удивляться, скоко же ещё багов припасено в закромах MQL4...

 
Meat писал (а) >>

Следующий код приводит к падению терминала:

Не перестаю удивляться, скоко же ещё багов припасено в закромах MQL4...

пасхальные яйца...

где то была куча приколов как уронить винды и ничего - винды стоят на большинстве PC в мире

вы же понимаете разницу между феррари и навороченым кадилаком

--

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

на феррари надо гнать по автобану на огромной скорости - с красивой блондинкой на переднем сидении

---

писать программы на Си++ это все равно, что ехать на феррари но если вы где то улетели за границы массива - или допустили

несуразицу в коде с массивом = авария

---

язык MQL вырос из Си

---

одно и то же можно сказать по разному

напишите код по иному

/*
этот код роняет MT
  string array[100];
  array[1]="a"+"b";
  string txt=array[1];
  txt=txt+txt;

*/

// этот код делает то же самое но не роняет
  string array[100];
  string txt;
  string TMPtxt;
 
  array[1]="a"+"b";
  txt=array[1];
  TMPtxt=txt+txt;
  txt = TMPtxt;
 
YuraZ писал (а) >>

...

но если вы где то улетели за границы массива - или допустили несуразицу в коде с массивом = авария

...

напишите код по иному

Где вы тут увидели "за границы массива" или "несуразицу в коде"? Не надо писать ерунду. Это очевидный баг MQL4. И уж Си тут совершенно не при чём.

Код по иному то я разумеется себе переписал (вместо txt+txt поставил StringConcatenate(txt,txt), а заводить лишнюю переменную как в вашем примере мне как-то не хочется). Но это отнюдь не значит что данную ошибку не нужно исправлять разработчикам. Я потратил кучу времени, пока выискивал в своём коде причину падения терминала. Это здесь я уже написал такой простой демонстрационный код в явном виде, а у меня в программе всё было гораздо сложнее, с участием многомерных массивов и функций. А добравшись до сути, оказалось что тут просто баг в обработке строковых переменных.

 

Самый быстрый способ завершиь работу терминала:) Закрывется моменально!

Только это не баг.

 
Meat писал (а) >>

Где вы тут увидели "за границы массива" или "несуразицу в коде"? Не надо писать ерунду. Это очевидный баг MQL4. И уж Си тут совершенно не при чём.

Код по иному то я разумеется себе переписал (вместо txt+txt поставил StringConcatenate(txt,txt), а заводить лишнюю переменную как в вашем примере мне как-то не хочется). Но это отнюдь не значит что данную ошибку не нужно исправлять. Я потратил кучу времени, пока выискивал в своём коде причину падения терминала. Это здесь я уже написал такой простой демонстрационный код в явном виде, а у меня в программе всё было гораздо сложнее, с участием многомерных массивов и функций. А добравшись до сути, оказалось что тут просто баг в обработке строковых переменных.

да я все прекрасно понимаю.. ну что Вы :-) - вот уж не хотел вас как то задеть

и вполне возможно ваши манипуляции с массивом и переменными не являются несуразицей в вашем реально коде

я просто привел пример того что если он обнаружен его просто надо обойти "объехать" ...

---

обошли баг - "поехали дальше" можно завести переменную а можно применить иную конструкцию

я писал пример быстро, Вы что от меня хотите блестящий код ?

---

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

---

Си достаточно хороши вылизан...

но он тут при том что MQL вырос из Си

и точно так же не контролирует если вы улетите за массив...

или обратитесь через указатель к куску памяти несуществующему или находящемуся вне пределах программы

 

Ну да, любые баги можно обойти, я с этим не спорю. И приходится. Никуда не денешься. Но это честно говоря не очень приятно. Иной раз приходится обходить что называется "через жопу". За последние 2 дня это уже 3-й обнаруженный мной баг. Он то конечно в плане обхода очень прост и особых неудобств не доставляет. Но бывают вещи и посерьёзнее

 
Meat писал (а) >>

Ну да, любые баги можно обойти, я с этим не спорю. И приходится. Никуда не денешься. Но это честно говоря очень не нравится, иной раз приходится обходить что называется "через жопу". За последние 2 дня это уже 3-й обнаруженный мной баг. Он то конечно в плане обхода очень прост и особых неудобств не доставляет. Но бывают и посерьёзнее


обычно бьешься над проблемой и убиваешь время на это

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

такие штуки искать сложно именно потому что делаешь все правильно!


---

потому я предпочел бы добавить лишнюю переменную - и быстро пойти дальше - чем искать красивую конструкцию

или писать код может не (изящьно - красиво )- а классически ... более спокойно т е не супер универсально

предпочитая может быть вместо универсальной функции 3 не универсальные ( кстати при этом возможно при модификациях - сопровождении я еще потом выиграю

когда выяснится, что универсальность разбивается изменениями которые надо внести )

пусть он будет может не такой красивый - зато надежный и легко модифицируемый в дальнейшем и понятный

---

 

В продолжение о багах...

Индикатор обращается к функции библиотеки Lib1  f1(double& in[][6],double& out[][4]) и передает массив. В свою очередь функция f обращается к функции другой библиотеки Lib2

f2(double& in[][6],double& out[][6]) и передает массив для обработки дальше. Индикатор не работает.

Но если f1 и f2 поместить в код индикатора - Все прекрасно.

В доке пояснений не нашел. Ссылки через #import есть. Это баг? или так задумано?

 
1. Кстати, до 196-й сборки txt = txt + txt; вообще не работало, а только через вызов конкатенации.
2. В MQL-4 ушатывает почти все, (не дает творить))), но когда понимаешь почему это - улыбаешься еще шире.
3. Насчет массивов - не сердитесь, а перепишите в другой массив.
 
vaa20003 писал (а) >>

В продолжение о багах...

Индикатор обращается к функции библиотеки Lib1 f1(double& in[][6],double& out[][4]) и передает массив. В свою очередь функция f обращается к функции другой библиотеки Lib2

f2(double& in[][6],double& out[][6]) и передает массив для обработки дальше. Индикатор не работает.

Но если f1 и f2 поместить в код индикатора - Все прекрасно.

В доке пояснений не нашел. Ссылки через #import есть. Это баг? или так задумано?

Задуманно.

 
Korey писал (а) >>
1. Кстати, до 196-й сборки txt = txt + txt; вообще не работало, а только через вызов конкатенации.
2. В MQL-4 ушатывает почти все, (не дает творить))), но когда понимаешь почему это - улыбаешься еще шире.
3. Насчет массивов - не сердитесь, а перепишите в другой массив.

Да не. Я вообще сержусь редко. Это я для информации. MetaTrader -это меньшее зло :)

Видел проги и хуже... Здесь по принципу - не нравится - не ешь

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