Erros, bugs, perguntas - página 1184

 
A100:

Que operações de ponteiro não são inúteis?

Qualquer coisa para a qual sejam normalmente utilizadas referências.
 
Por exemplo, um operador de adição pode ser aplicado entre referências, que chamará operador+(...). A adição de apontadores não faz sentido, porque vamos obter um número que não tem qualquer utilidade prática.
 
A100:
O que impede os operadores que não fazem sentido de os sobrecarregar como objectos ou simplesmente de não os implementar?
 

É assim que está agora (sobrecarregado como para os objectos) e tudo parece estar bem. Mas há uma contradição entre o significativo (== e !=) e o resto

class A {
public:
        bool operator ==( A* a ) { Print( __FUNCTION__ ); return ( true  );  }
        bool operator !=( A* a ) { Print( __FUNCTION__ ); return ( true  );  }
//остальные
        bool operator >>( A* a ) { Print( __FUNCTION__ ); return ( true  );  }
        bool operator +( A* a )  { Print( __FUNCTION__ ); return ( false  ); }
        bool operator !()        { Print( __FUNCTION__ ); return ( true   ); }
//... и т.д.
};

como

void OnStart()
{
        A *a = new A;
        if ( a == a ) Print( "1" ); //сравнение указателей как чисел
        if ( a >> a ) Print( "3" ); //вызывается operator<<( A *)
}

Que sugerimos eliminar através da comparação de apontadores apenas através da função especial

void OnStart()
{
        A *a = new A;
        if ( isEqualPoiner( a, a ) ) Print( "1" ); //сравнение указателей как чисел
        if ( a == a )               Print( "2" ); //вызывается operator==( A *)
        if ( a >> a )               Print( "3" ); //вызывается operator<<( A *)
}
 

Uma função especial para comparar apontadores pode ser concebida da seguinte forma

template<typename T1, typename T2>
bool isEqualPointer( T1 *t1, T2 *t2 ) { return ( ulong(t1) == ulong(t2) ); }
 
A100:

Tenho uma pergunta indiscreta para si. Vai partilhar as suas experiências?

É uma das poucas pessoas que utiliza activa e constantemente modelos e macros. E provavelmente tem uma grande quantidade de código acumulado.

Não sei de mais ninguém, mas estaria muito interessado em ver o seu código e os seus desenvolvimentos, se os tiver, que não se importa de partilhar com o público.

Não sei... implementação de padrões, os seus invólucros para trabalhar com indicadores, gráficos, o que quer que seja...

 

Como utilizo os modelos? - Para encurtar uma entrada. Por exemplo, não há operação de vírgula na MQL. Digamos que há um registo

int f2( string str )
{
        Print( str );
        return ( 0 );
}

bool f( int a )
{
        if ( a == 5 )
                return ( true )
        f2( "abc" );
        return ( false );
}
Depois ter um padrão
template<typename T 1, typename T 2>
T2 opComma( T1 expression, T2 assignment_expression ) { return ( assignment_expression ); }

em vez de 4 linhas, temos uma

bool f( int a )
{
        return ( a == 5 ? true : opComma( f2( "abc" ), false ) );
}
 

Como utilizo as macros? - Mais uma vez - para encurtar o registo. Por exemplo, não existem modelos de classes em MQL. Não há problema - utilizamos uma macro

#define  Macro( type ) \
class A {       \
public:         \
/*...еще много строк...*/ \
        type a; \
};

//осталось написать
Macro(  uint )
Macro( ulong )
 
Mais uma vez para encurtar o registo - tendo uma vez definido
#define  MDT( dt_struct, dt )     \
        MqlDateTime dt_struct;   \
        ZeroMemory( dt_struct ); \
        TimeToStruct( dt, dt_struct );

será suficiente declarar posteriormente

datetime dt;
MDT( dt_struct, dt )
 

A cópia bitwise, por exemplo, é implementada através de modelos, uma vez que vários tipos podem ser envolvidos ao mesmo tempo

template<typename T1, typename T2>
T2 BitwiseCopying( T1 type1, T2 )
{
struct Union1 {
        T1      type1;
};
struct Union2 {
        T2      type2;
};
        Union1 union;
        union.type1 = type1;
        return ( ((Union2)union).type2 );
}
void f()
{
        ulong ul = 0x16;
        double d = BitwiseCopying( ul, double(0)); //побитовое копирование из ulong в double
        float f = 36.6;
        uint ui = BitwiseCopying( f,    uint(0));  //побитовое копирование из float в uint

}