Fehler, Irrtümer, Fragen - Seite 1356

 
Vasiliy Sokolov:
Sehr cool und vor allem ideologisch korrekt. Zwei Hände sind dafür!
Dann wäre es ideologisch korrekt
class A { public:
        bool operator !=( A* ) {}
        bool operator  <( A* ) {}
};
void f()
{
    A *a1, *a2;
    a1 != a2; //здесь простое сравнение указателей вместо вызова operator !=()
    a1 <  a2; //здесь вызывается operator <()
}
operator!=() würde aufgerufen werden, anstatt Zeiger auf Gleichheit zu vergleichen, wie es jetzt der Fall ist. Und der Zeigervergleich könnte durch eine spezielle Funktion ähnlich wie ::GetPointer(...) durchgeführt werden

Dies wird jedoch aus dem einfachen Grund nicht getan, weil es erhebliche Unannehmlichkeiten mit sich bringen würde und der Vorteil nur in der ideologischen Korrektheit liegen würde.

 
Ich habe schon lange kein Update mehr erhalten: MetaTrader5 build 1159 (verbunden mit MetaQuotes-Demo). Befehl Compiler lädt Build 1162
 
Vasiliy Sokolov:

Dann ist die Zeichenkette auch eine Menge von bestimmten Zahlen. Und ein Bild ist auch eine Zahl und ein elektrischer Impuls auf einem Chip...

Im Allgemeinen studieren Sie Elektrotechnik, Kollege.

Hier ist ein Vergleich von Zeigern in C++ und Deskriptoren in MQL/C# und einigen anderen Sprachen.

Die Herausforderung: Sie möchten einen Live-Chat mit einem Freund führen.

1. Zeiger. Wir kennen die Straße, die Hausnummer und die Wohnung. Wir gehen zu der Adresse, wecken den Freund, bekommen eine Blase, er ist aufgeregt und plaudert )).

2. Deskriptoren. Wir kennen die genaue Adresse nicht, niemand darf das Haus betreten, es ist zum Beispiel das FSB-Gebäude. Es gibt einen Kontrollpunkt im Haus, der sich weigert, die Adresse mit dem Namen eines Freundes zu nennen (per Deskriptor), der sich weigert, das Haus zu betreten (im Adressraum). Der Sicherheitsdienst ruft den Kumpel an und bittet ihn, herauszukommen. Er kommt heraus, du ziehst fröhlich die Seifenblase heraus, er zischt: -Was bist du!!!! legst sie sofort weg!!! So viel zum Thema Wandern... Wenn man mit einer ungeöffneten Flasche in der Hand nach Hause geht, stellt man schrill fest, dass Deskriptoren Sicherheit im Tausch gegen Wegweiserfunktion bieten.

 
Vasiliy Sokolov:

Im Allgemeinen studieren Sie Elektrotechnik, Kollege.

Keine anderen Argumente?
 
A100:
Keine anderen Argumente?
Was ist mit Ihnen?
 
A100:
Ich habe Codeschnipsel, in denen Zeiger explizit in Zahlen umgewandelt werden (für die Verbindung mit externen Schreib-/Lesesystemen sowie für die Fehleranalyse und Fehlersuche); wenn dies verboten ist, wird die Flexibilität eingeschränkt, und wir müssen alles neu machen.
Ein interessantes Argument, über das man einige Zeit nachdenken muss. Bitte stellen Sie eine Anfrage, wir werden sie im Detail besprechen.
 

Wie wäre es übrigens mit der Einführung von *- und &-Operatoren in MQL, um im ersten Fall einen expliziten Zugriff auf ein Objekt zu ermöglichen und im zweiten Fall einen Objektzeiger zu nehmen (anstelle des umständlichen GetPointer). Das Sternchen ist ein Muss und kann durch nichts in der Sprache ersetzt werden.Ohne sie ist es unmöglich, Situationen wie die von A100 oben beschriebene zu kontrollieren, wenn statt der Objekte selbst irgendwelche Zeigeraktionen ausgeführt werden. Persönlich ist das ein ständiges Problem, ich muss ständig auf der Hut sein oder überall A.operator=(B), A.operator!=(B) angeben, d.h. die Kürze geht verloren, und das Überladen von Operatoren wird eigentlich sinnlos.

Ich habe dieses Problem schon einmal angesprochen, aber das Thema wurde abgewürgt. Lassen Sie uns dieses Thema endlich zu Ende bringen.

 

Frage zu externen Variablen.

Ich stand vor einer Situation, in der sich eine externe Variable während der Programmausführung ändert, aber wenn der Zeitrahmen geändert wird, nimmt sie wieder den im Eigenschaftenfenster eingestellten Wert an. Wenn ich z.B. vor dem Start TradeEnable auf EnableAll setze und den Wert während der Programmausführung auf EnableBuy ändere, dann wird der Wert wieder auf EnableAll zurückgesetzt, wenn der Chart zu einem anderen Zeitrahmen wechselt. Der Wert, den ich im Timer-Ereignis definiere und über Comment ausgeben lasse, kann keinen Fehler darstellen.

enum ETradeEnable {EnableAll, EnableBuy, EnableSell, DisableAll};
extern ETradeEnable TradeEnable = EnableAll;

Die Variable "TradeEnable" wird durch das Umdrehen der Charts nicht beeinflusst. Lesen Sie das Handbuch - Im Gegensatz zu Eingabevariablen können die Werte von externen Variablen während der Programmausführung programmatisch geändert werden.

So sind OnDeinit und OnInit aufgebaut.

Frage: Ich verstehe etwas nicht oder ist die Änderung von TradeEnable ein Laufzeitfehler?

int LastDeinitReason = 0;

void OnDeinit(const int reason)
{
    LastDeinitReason = reason;
    if(reason==REASON_CHARTCHANGE || reason==REASON_TEMPLATE || reason==REASON_PARAMETERS)
        return;
    EventKillTimer();
// далее код при завершении работы советника
}

int OnInit()
{
    if(LastDeinitReason==REASON_CHARTCHANGE || LastDeinitReason==REASON_TEMPLATE)
    {
        LastDeinitReason = 0;
        return(INIT_SUCCEEDED);
    }
    if(LastDeinitReason==REASON_PARAMETERS)
    {
        SetParams();
        return(INIT_SUCCEEDED);                              
    }
// далее код инициализации при запуске
}
 
Alexey Navoykov:

Lassen Sie uns dieses Thema endlich zu Ende bringen.

Zwei Operatoren werden dort geopfert (== und !=), um alle anderen zu erhalten.

Ich sehe einen Ausweg in einem Muster.

template<typename T1, typename T2>
bool IsEqualPointer( const T1 *t1, const T2 *t2 )
{
    return ( ulong(t1) == ulong(t2) );
}

Wenn operator==(!=) definiert ist, wird er aufgerufen. Wenn sie nicht definiert ist, werden die Zeiger auf Gleichheit verglichen. Und wenn operator==(!=) definiert ist und es notwendig ist, die Zeiger auf Gleichheit zu vergleichen, kann dies über die angegebene Vorlage erfolgen.

Die Änderungen am bestehenden System sind minimal, und das Wichtigste ist, dass sie sich nicht auf diejenigen auswirken, die einfach Zeiger auf Gleichheit vergleichen, ohne den Operator==(!=) zu überladen.

 
A100:

Zwei Operatoren werden dort geopfert (== und !=), um alle anderen zu erhalten.

Ich sehe einen Ausweg in einem Muster.

Wenn operator==(!=) definiert ist, wird er aufgerufen. Wenn sie nicht definiert ist, werden die Zeiger auf Gleichheit verglichen. Und wenn operator==(!=) definiert ist und Zeiger bei Gleichheit miteinander verglichen werden müssen, kann dies über die angegebene Vorlage erfolgen.

Die Änderungen im bestehenden System sind minimal, und das Wichtigste ist, dass sie sich nicht auf diejenigen auswirken, die einfach nur Zeiger ohne Überladung mit operator==(!=) vergleichen.

Natürlich können Sie den Vergleich und die Zuweisung mit separaten Funktionen durchführen, aber was nützt das? Es geht darum, die Entwickler davon zu überzeugen, eine angemessene Lösung zu finden.