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

 
joo:

v4.3, кастомная прошивка.

Основное окно - ландшафтное положение, остальные диалоговые окна (ордера) - портретные. Раздражает неконтролируемое переключение туда/обратно с основного окна на диалоговые. 

ну надо же.... не помогают даже специализированные проги типа Smart Rotator....

забавно, но если выставить принудительно ландшафт в Smart Rotator для терминала, то все окна действительно становятся ландшафтными. но я хочу портретный! - ставлю в настройках портретный режим для терминала, и что? - хе хе... всё также некоторые окна ландшафтные, а некоторые портретные.

 

Недоработка в метаэдиторе.

Допустим у нас есть некая функция Obj(), возвращающая указатель на объект:

class CObject {   public:     int value; }; CObject object;

CObject* Obj() { return GetPointer(object); }

Теперь если мы будем обращаться к объекту непосредственно через функцию:  Obj().value = 10,  то после ввода точки не появляется всплывающий список членов и методов класса.

 
meat:

Класс CArray - не панацея, учитывая что MQL не поддерживает шаблоны классов. Наш массив ведь необязательно состоит из простых типов.  А создавать в программе полную структуру потомка CArray для каждого нового класса - это не очень интересно. Посмотрите сколько строчек кода занимает каждый файл с потомком CArray (ArrayInt.mqh, ArrayDouble.mqh и т.д.)

Да и как организована структура программы - это уже вторично. Не будем отклоняться от темы.  Суть в том, что если имеется некоторый параметр, который можно менять (в данном случае это reserve_size), то должна быть предусмотрена возможность его получить.

Сложные типы наследуются от CObject и благополучно пакуются в CArrayObj.

reserve_size - нарушает парадигму экономного программирования. Она существует только для новичков и в нормальных языках ее быть не должно вообще. 

 
C-4:

reserve_size - нарушает парадигму экономного программирования. Она существует только для новичков и в нормальных языках ее быть не должно вообще. 

Странная у вас парадигма. Резервирование как-раз и предназначено для экономного использовании ресурсов, сокращая количество перевыделений памяти и перемещения данных (а это довольно затратные операции).  И управлять этим параметром должен именно разработчик кода, т.к. только он знает заранее, как его программа будет использовать память. А с языком это вообще не связано, ибо массив - он и в Африке массив, под него везде требуется память.

 
meat:

Странная у вас парадигма. Резервирование как-раз и предназначено для экономного использовании ресурсов, сокращая количество перевыделений памяти и перемещения данных (а это довольно затратные операции).  И управлять этим параметром должен именно разработчик кода, т.к. только он знает заранее, как его программа будет использовать память. А с языком это вообще не связано, ибо массив - он и в Африке массив, под него везде требуется память.

Вот Вы сами и ответили на свой вопрос:

Управлять этим параметром должен именно разработчик кода, т.к. только он знает заранее, как его программа будет использовать память. А с языком это вообще не связано... 

 С языковыми средствами это не связано, а значит должно решатся на более высоком, пользовательском уровне. Вот и решайте с помощью специально созданных для этих задач CArray* классов, которые к слову, справляются с этой задачей блестяще и словно для нее и созданы. 

 
meat:

Странная у вас парадигма. Резервирование как-раз и предназначено для экономного использовании ресурсов, сокращая количество перевыделений памяти и перемещения данных (а это довольно затратные операции)...

void TestFoo()
{
  CArrayObj listObj;
  listObj.Resize(100);
  for(int i = 0; i < 100; i++)
     listObj.Add(new CObject());
  int count = CountObj(listObj);
}

void CountObj(CArrayObj* obj)
{
   return obj.Size();
}
Суперэкономный код. Перевыделений памяти не происхсодит вообще, т.к. заранее известно количество элементов. Передаются не массивы, а указатели по ним. Скорость невероятно быстрая, и никакой reserv_size не нужен. Чем это решение Вас не устраивает?
 
C-4:
Суперэкономный код. Перевыделений памяти не происхсодит вообще, т.к. заранее известно количество элементов. Передаются не массивы, а указатели по ним. Скорость невероятно быстрая, и никакой reserv_size не нужен. Чем это решение Вас не устраивает?

Эх, если б всё было так просто...  В реальных условиях количество элементов заранее не известно, как правило. И более того, это количество меняется динамически. Так что ваш упрощённый пример из серии "Hello world" бессмысленен. И его можно заменить всего двумя строчками:

CObject listObj[100];
int count = ArraySize(listObj);

В общем, к чему весь этот флуд?  Если вы лично не используете параметр reserve_size, то ради бога. Только не стоит из этого делать вывод, что все остальные дураки или новички. Возможно вы просто чего-то не понимаете. В стандартных контейнерах STL, предназначенных для работы с массивами (vector, string и др.) тоже всегда присутствуют такие методы как reserve и capacity.

 
joo:

ну надо же.... не помогают даже специализированные проги типа Smart Rotator....

забавно, но если выставить принудительно ландшафт в Smart Rotator для терминала, то все окна действительно становятся ландшафтными. но я хочу портретный! - ставлю в настройках портретный режим для терминала, и что? - хе хе... всё также некоторые окна ландшафтные, а некоторые портретные.

на стоковых прошивках работает нормально (во всяком случае так, как ожидается)
 

В последнем билде перестал нормально работать поиск в Метаэдиторе (окошко в правом верхнем углу) . Когда ввожу туда искомое слово, он автоматически заменяет его на какое-то похожее словосочетание, взятое непонятно откуда и непонятно зачем. В итоге найти что-либо в своём коде становится невозможным.  К примеру, пытаюсь найти переменную с именем "ERROR_VALUE", а вместо этого в поисковой строке получаю "error_value 7".

Вопрос: что за дела?  Откуда берётся этот левый мусор в поисковой строке и как его убрать?

 
meat:

В последнем билде перестал нормально работать поиск в Метаэдиторе (окошко в правом верхнем углу) . Когда ввожу туда искомое слово, он автоматически заменяет его на какое-то похожее словосочетание, взятое непонятно откуда и непонятно зачем. В итоге найти что-либо в своём коде становится невозможным.  К примеру, пытаюсь найти переменную с именем "ERROR_VALUE", а вместо этого в поисковой строке получаю "error_value 7".

Вопрос: что за дела?  Откуда берётся этот левый мусор в поисковой строке и как его убрать?

Почистите клавиатуру.
Причина обращения: