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

 
константность ссылки

Нигде такого не встречал. Это стандарт?

 
Ilyas:
Теперь в обоих случаях будет ошибка компиляции, для того, чтобы избежать ошибки, код следует изменить:

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

template<typename T>
void f1( const T& a[] ) {}
class A {};
void f2( const A& a[] ) {}
class B {
        void g1() const { f1( a ); } //нормально
        void g2() const { f2( a ); } //error: 'a' - parameter conversion not allowed
        A *a[];
};
 

Как в MQL5 происходит работа с памятью?

Например есть такой код:

class Alfa {}
class Beta
  {
private:
   Alfa  *ptr_a;
   Alfa   obj_a;
public:
   Beta(void) { ptr_a = new Alfa(); }
  ~Beta(void) { delete ptr_a; }
   Metod(void) {...}
  }
//---

int OnInit(void) {
   Beta *ptr_obj = new Beta();
   Beta obj;
//---
   return INIT_SUCCEEDED;
}
void OnDeinit(const int reason) {
   delete ptr_obj;
}

согласно которого под объект ptr_obj будет выделена память в "куче", а под объект obj будет выделена автоматическая память. И если работа менеджера памяти MQL5 ясна для этих объектов:

1. Под объект ptr_a объекта ptr_obj память выделена в "куче"

2. Под объект obj_a объекта obj память выделена автоматически

То как организована работа менеджера памяти MQL5 в этих случаях:

3. В какой области памяти будет располагаться объект obj_a объекта ptr_obj

4. В какой области памяти будет располагаться объект ptr_a объекта obj

 
A100:

Проверьте пожалуйста еще вот это противоречие (здесь наоборот)

Всё правильно, здесь при типизации, T = A *
 
void f( const A* &Array[] );

При такой передаче есть возможность менять элементы местами в массиве (и размер), но нельзя менять сами элементы. Верно?

 

void f( const A* const &Array[] );

А здесь и элементы (и размер) местами нельзя менять. Правильно? 

 
fxsaber:

Нигде такого не встречал. Это стандарт?

Написал так, чтобы не писать: тут должна быть ссылка на константный массив указателей на константные объекты
 
fxsaber:

При такой передаче есть возможность менять элементы местами в массиве (и размер), но нельзя менять сами элементы. Верно?

 

А здесь и элементы (и размер) местами нельзя менять. Правильно? 

Да, всё верно.
 
Ilyas:
Всё правильно, здесь при типизации, T = A *

Тогда здесь ошибка при компиляции

template<typename T>
void f1( const T  const & a[] ) {} //error: 'const' - unexpected token
class A {};
void f2( const A* const & a[] ) {}
class B {
        void g1() const { f1( a ); }
        void g2() const { f2( a ); }
        A *a[];
};
 
Sergei Vladimirov:
Именно. Читаю все эти претензии и никак не могу врубиться, где тут проблема. На дискете, что ли, собираетесь хранить эти файлы? 


Что, изнашивается диск, когда сохраняете 100-килобайтный файл вместо 50-килобайтного? Самому не смешно? )

А это нормально, что из-за одного символа копирайта (который в принципе является интернациональным и есть во всех кодировках, несмотря на то что его код больше 127) размер файла увеличивается в 2 раза без всякого смысла? Это умно да? Зачем раздувать файлы в 2 раза без надобности?

Проблема не только в размере, но и в контекстном поиске. Пока файлы в ASCII, можно многими сторонними программами, включая файл-менеджеры искать файлы по контекстной строке. Я этим пользуюсь практически каждый день. Родной MQ редактор в этом плане такой же ноль как и во многих других очевидных кодерских вопросах. Как только получаем уникод, с контекстным поиском возникают 2 беды: нельзя искать влоб (как последовательность байтов), т.к. нужно сперва "понять" кодировку, потом нормализовать к единому виду (например, все ASCII на лету кодировать в уникод) и только потом "искать" - не все программы так умеют или хотят делать, а для тех, что умеют получаем пункт 2 - тормоза.

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

 
A100:

Тогда здесь ошибка при компиляции

В С++ тоже неоднозначность типа: const T const 

Но выход есть - переставить const вправо

template<typename T>
void f1(  T         const & a[] ) {} //error: 'const' - unexpected token
class A {};
void f2(  A const * const & a[] ) {} //нормально
class B {
        void g1() const { f1( a ); } //error: 'f1' - cannot to apply function template
        void g2() const { f2( a ); } //нормально
        A *a[];
};
С++ компилирует без ошибок (c учетом разницы синтаксиса)