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

 
fxsaber #: Похоже, разобрался. У меня старый ex5 индикатора лежал в той же папке, где и советник. И советник пытался подключить этот индикатор, а не тот, который лежит в папке Indicators. Спасибо за помощь!
👍
 
В одном случае есть ошибка при компиляции, а в другом - нет
class A {
static int i[];
};
int    i[] {1,2,3}; //(1)//нормально
int A::i[] {1,2,3}; //(2)//Error: '{' - semicolon expected

А какая принципиальная разница между ними?

 

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

Ошибки, баги, вопросы

Vladislav Boyko, 2023.12.12 15:25

class A {
public:
    A( const A& )         {}
    A( int i, int j = 0 ) {}
};
A f() { return new A(1); }

void OnStart()
  {
   Alert(EnumToString(CheckPointer(GetPointer(f()))));
  }
2023.12.12 17:23:45.523 test2 (EURUSD,H4)       Alert: POINTER_AUTOMATIC
2023.12.12 17:23:45.523 test2 (EURUSD,H4)       1 undeleted objects left
2023.12.12 17:23:45.523 test2 (EURUSD,H4)       1 object of type A left
2023.12.12 17:23:45.523 test2 (EURUSD,H4)       32 bytes of leaked memory

return изменил тип указателя, судя по всему. Получается утечка памяти при POINTER_AUTOMATIC.


Я глупость написал. Все правильно работает, там 2 объекта создается

class A
  {
private:
   string getMyPtrTypeStr() { return(EnumToString(CheckPointer(GetPointer(this)))); }
public:
   ~A()                     { Print("destructor ", getMyPtrTypeStr());             }
   A( const A& )            { Print("constructor#1, ", getMyPtrTypeStr());         }
   A( int i, int j = 0 )    { Print("constructor#2, ", getMyPtrTypeStr());         }
  };

A f() { return new A(1); }

void OnStart()
  {
   f();
  }
2023.12.14 19:06:37.975 test2 (EURUSD,H4)       constructor#2, POINTER_DYNAMIC
2023.12.14 19:06:37.975 test2 (EURUSD,H4)       constructor#1, POINTER_AUTOMATIC
2023.12.14 19:06:37.975 test2 (EURUSD,H4)       destructor POINTER_AUTOMATIC
2023.12.14 19:06:37.975 test2 (EURUSD,H4)       1 undeleted objects left
2023.12.14 19:06:37.975 test2 (EURUSD,H4)       1 object of type A left
2023.12.14 19:06:37.975 test2 (EURUSD,H4)       32 bytes of leaked memory
 
Vladislav Boyko #:

Я глупость написал. Все правильно работает, там 2 объекта создается

Автор, видимо, хотел получить на выходе POINTER_AUTOMATIC без необходимости делать delete.

 
fxsaber #:

Автор, видимо, хотел получить на выходе POINTER_AUTOMATIC без необходимости делать delete.

Автор я, я свой пост из кармана вытащил😄

Я просто хотел посмотреть, что произойдет, если запихнуть туда new, но не подумал о том, что объекта будет 2.


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

Ошибки, баги, вопросы

A100, 2023.12.12 09:03

Это не аргумент - тем более, что так все нормально:

class A {
public:
    A( const A& )         {} //(1)
    A( int i, int j = 0 ) {} //(2)
    A( bool )             {} //(3)
};
A f() { return 1; } //нормально

А что принципиально изменилось по сравнению с первоначальным вариантом ?

Ниндзя-конструкция при компиляции не дружит с параметром, для которого есть умолчательное значение. Не смотря на то, что A(bool) все равно не будет вызван, компилятор смотрит именно туда, судя по всему.

Без параметра со значением по умолчанию все работает (если убрать конструктор A(bool) тоже)

class A {
private:
   string getMyPtrTypeStr() { return(EnumToString(CheckPointer(GetPointer(this)))); }
public:
    ~A()                   { Print("destructor ", getMyPtrTypeStr());             }
    A(const A&)            { Print("constructor(const A&), ", getMyPtrTypeStr()); }
    A(int)                 { Print("constructor(int), ", getMyPtrTypeStr());      }
    A(bool)                { Print("constructor(bool), ", getMyPtrTypeStr());     }
};

A f1() { return 1;    } // constructor(int)
A f2() { return true; } // constructor(bool)

 
Vladislav Boyko #:

Ниндзя-конструкция

Эту имел в виду.

 
Ошибка при компиляции:
class A {
    struct B {
        int b;
    } bb = { 1 }; //Error: '=' - illegal assignment use
};
 

В одном случае Warning, а в другом Error:

enum E { x };
void g( E e ) {}
void f( int i )
{
    E e=i;  //(1)//Warning: implicit enum conversion
    g(  i); //(2)//Error: 'i' - cannot convert enum
}

А какая принципиальная разница между (1) и (2)?

 
A100 #:
Ошибка при компиляции:

bb - член класса. Вы не можете использовать оператор присваивания при объявлении члена класса. Точнее, вы конечно можете, но в C++, а не здесь.

 
Vladislav Boyko #:
bb - член класса
Объект, а не член.
Причина обращения: