Ilyas: Но приводить дескриптор к числу или наоборот, нет смысла и скорее всего это ошибка в коде.
У меня есть фрагменты кода где указатели явно преобразуются к числам (для сопряжения со внешними системами запись\чтение, а также при анализе ошибок и отладке), если это будет запрещено то понизится гибкость и придется переделывать.
Ilyas: Безусловно, с точки зрения "как это хранится в памяти", Вы правы. Но приводить дескриптор к числу или наоборот, нет смысла и скорее всего это ошибка в коде. В скором будущем, если в классе будет перегружен соответствующий оператор преобразования, то будет вызван он.
Здесь может быть предупреждение, но никак не ошибка.
Ilyas: Безусловно, с точки зрения "как это хранится в памяти", Вы правы. Но приводить дескриптор к числу или наоборот, нет смысла и скорее всего это ошибка в коде. В скором будущем, если в классе будет перегружен соответствующий оператор преобразования, то будет вызван он.
Разумеется, это была моя ошибка по невнимательности, я об этом уже писал. У меня вообще 95% ошибок не системные, а по невнимательности )) Кстати, я тоже не вижу смысла приводить дескриптор к какому-либо числу. С указателями интереснее, там есть арифметика указателей, например, можно разобрать double на байты или еще сделать что-то нетривиальное. А дескриптор, это просто какой-то внутренний идентификатор, выданный runtime системой МТ4, делать с ним ничего нельзя.
Вот так эта ошибка возникла, нечего писать код по ночам ))
// order - это дескриптор экземпляра класса, создается вот так после открытия ордера, потом заносится в CList открытых ордеров.// COrder* order = new COrder(ticket, symbol, cmd, volume, price, timeOpen, magic, stoploss, takeprofit, comment, expiration);// так было неправильно, просто я перепутал order с тикетом, забыл, что это же экземпляр класса, уставший был ))
logBuf[logBufCount++] = double(order);
// так правильно
logBuf[logBufCount++] = (double)order.Ticket
Ilyas: Безусловно, с точки зрения "как это хранится в памяти", Вы правы. Но приводить дескриптор к числу или наоборот, нет смысла и скорее всего это ошибка в коде. В скором будущем, если в классе будет перегружен соответствующий оператор преобразования, то будет вызван он.
Очень круто и главное идеологически правильно. Двумя руками за!
Кстати, я тоже не вижу смысла приводить дескриптор к какому-либо числу...
Есть такой смысл. Это очень полезное свойство для специфических контейнеров данных, например словарей, где дескриптор, по определению уникальный, может быть ключом к классу. В этом случае вычислять свой хеш будет не надо, и главное, можно будет различать уникальность объектов по ссылке и по значению (что является в общем-то разными понятиями). Плюс размещать в коллекции можно будет классы не связанные друг с другом узами наследования.
Vasiliy Sokolov: Очень круто и главное идеологически правильно. Двумя руками за!
Тогда идеологически правильнее было бы в случае
class A { public:
booloperator !=( A* ) {}
booloperator <( A* ) {}
};
void f()
{
A *a1, *a2;
a1 != a2; //здесь простое сравнение указателей вместо вызова operator !=()
a1 < a2; //здесь вызывается operator <()
}
чтобы вызывался operator!=(), а не выполнялось бы сравнение указателей на равенство как это происходит сейчас. А сравнение указателей можно было бы осуществлять специальной функцией подобной ::GetPointer(...)
Но этого не делается по той простой причине что принесет значительные неудобства, а преимуществом будет лишь идеологическая правильность
Но приводить дескриптор к числу или наоборот, нет смысла и скорее всего это ошибка в коде.
Безусловно, с точки зрения "как это хранится в памяти", Вы правы.
Но приводить дескриптор к числу или наоборот, нет смысла и скорее всего это ошибка в коде.
В скором будущем, если в классе будет перегружен соответствующий оператор преобразования, то будет вызван он.
Безусловно, с точки зрения "как это хранится в памяти", Вы правы.
Но приводить дескриптор к числу или наоборот, нет смысла и скорее всего это ошибка в коде.
В скором будущем, если в классе будет перегружен соответствующий оператор преобразования, то будет вызван он.
Разумеется, это была моя ошибка по невнимательности, я об этом уже писал. У меня вообще 95% ошибок не системные, а по невнимательности )) Кстати, я тоже не вижу смысла приводить дескриптор к какому-либо числу. С указателями интереснее, там есть арифметика указателей, например, можно разобрать double на байты или еще сделать что-то нетривиальное. А дескриптор, это просто какой-то внутренний идентификатор, выданный runtime системой МТ4, делать с ним ничего нельзя.
Вот так эта ошибка возникла, нечего писать код по ночам ))
Дескритор это все равно конкретное число. То что это число не указывает на конкретный участок памяти не лишает его свойств числа.
Тогда и string - это набор конкретных чисел. И картинка - это тоже число и электрический импульс на микросхеме...
В общем учите электротехнику, коллега.
Я, честно говоря, не увидел ничего плохого в этом приведении, учитывая что оно явное. Почему тут должна была быть ошибка? ...
Потому что нарушается контроль типов, и управляемая среда, коей и является виртуальная машина MQL, такие вещи должна пресекать:
MQL != C++
Безусловно, с точки зрения "как это хранится в памяти", Вы правы.
Но приводить дескриптор к числу или наоборот, нет смысла и скорее всего это ошибка в коде.
В скором будущем, если в классе будет перегружен соответствующий оператор преобразования, то будет вызван он.
Кстати, я тоже не вижу смысла приводить дескриптор к какому-либо числу...
А дескриптор, это просто какой-то внутренний идентификатор, выданный runtime системой МТ4, делать с ним ничего нельзя.
Очень круто и главное идеологически правильно. Двумя руками за!
Но этого не делается по той простой причине что принесет значительные неудобства, а преимуществом будет лишь идеологическая правильность