Fehler, Irrtümer, Fragen - Seite 2521

 

fxsaber:
Подскажите, как в C++  с этим? Задумался, использовать эту фишку в своем коде или нет. Если в C++ работает, буду использовать. Нет - вряд ли, т.к. могут отменить в следующих билдах.

b = a; 
a = b; // OK

Die erste Zuweisung funktioniert nur in MQL. Und es ist schade, dass es funktioniert. Ich wünschte, sie würden dieses Missverständnis endlich abschaffen. Mit dem zweiten gibt es keine Probleme.

 
Alexey Navoykov:

Die erste Zuweisung funktioniert nur in MQL. Ich wünsche mir, dass sie dieses Missverständnis endlich aufheben. Ich habe keine Probleme mit dem zweiten.

Das ist merkwürdig. Ich dachte, dass der erste funktionieren muss und der zweite nicht.

 
fxsaber:

Das ist merkwürdig. Ich dachte, dass der erste funktionieren muss und der zweite nicht.

Nun, offenbar verstehen die MQL-Entwickler das Wesen der Zuweisung auch nicht ganz. Ich erzähle ihnen nämlich schon seit langem von diesem Problem, aber sie stoßen auf eine Mauer.

Das Wesen der Zuordnung besteht darin, dass dem Objekt ein gleichwertiges Objekt zugeordnet wird. Das bedeutet, dass das rechte Objekt zunächst implizit auf den Typ des linken Objekts gecastet wird und erst dann die Zuweisung (das Kopieren) erfolgt. Und im ersten Fall ist ein solches Casting (A->B) sicherlich unmöglich.In C++ würde ein Fehler auftreten, aber in MQL wird stattdessen das linke Objekt in das rechte umgewandelt und A::operator=(A&) ausgeführt, wobei nur ein Teil des b-Objekts ersetzt wird. Ist dies eine Zuweisung?

Stellen Sie sich vor, dass Sie int an long zuweisen, aber nur die ersten vier Bytes ersetzt werden und der Rest unangetastet bleibt. So ist es auch hier.

 
Alexey Navoykov:

Stellen Sie sich vor, Sie weisen einen int einem long zu, aber nur die ersten vier Bytes werden ersetzt, der Rest bleibt unangetastet. So ist es auch hier.

Es ist also praktisch, denke ich. Natürlich im Zusammenhang mit den Strukturen.

 
fxsaber:

Es ist also bequem, wie es scheint. Natürlich im Zusammenhang mit den Strukturen.

Dadurch können zwar Zeichen in einer Zeichenkette gespeichert werden, aber es ist eine Quelle von Zufallsfehlern und erschwert/verzerrt das Verständnis des Codes. Wie oben gesagt, hat das Gleichheitszeichen eine klare und eindeutige Bedeutung, dass dasgesamte Objekt geändert wird. Deshalb wird der Operator in diesem Fall nicht wie vorgesehen verwendet. Wenn Sie ein solches Nicht-Standard-Verhalten wünschen, sollten Sie den Operator für solche Zwecke überladen.

p.s. Die einzige Ausnahme ist, wenn Klasse B keine eigenen Felder hat, d.h. sie ist genau dasselbe wie Klasse A (völlig äquivalent zu ihr), dann gibt es keinen Grund, diese Zuweisung zu verhindern, obwohl es in C++ sowieso nicht funktioniert, aber in MQL kann man es erlauben.

 
Slava:

In der opt-Datei, in der alle Eingabeparameter vorgeschrieben sind, enthält der Wert für optimierte Parameter (definiert über die Felder size und offset) nicht Value (wie ohne Optimierung), sondern Start.

Es wäre logisch, Value dort zu haben.

 
Alexey Navoykov:

Nun, es scheint, dass MQL-Entwickler das Wesen der Zuweisung auch nicht ganz verstehen. Ich erzähle ihnen nämlich schon seit langem von diesem Problem, aber sie stoßen auf eine Mauer.

Das Wesen der Zuordnung besteht darin, dass dem Objekt ein gleichwertiges Objekt zugeordnet wird. Mit anderen Worten, sie sind vom gleichen Typ.

Das Wesen der Operationen für Benutzertypen ist nicht im Voraus definiert. Und nur ihre Reihenfolge ist festgelegt, die in diesem Fall darin besteht, den entsprechenden Operator= aufzurufen.

In MQL wird, anders als in C++, operator= vererbt, so dass b = a; einem Aufruf von A::operator=(const A&) entspricht;

Im Allgemeinen gibt es hier keinen Widerspruch. Im Sonderfall der Zuweisung eines gleichwertigen Objekts gibt es eine gewisse Inkonsistenz der Entitäten, aber nicht mehr als das

 
A100:

In MQL wird im Gegensatz zu C++ operator= vererbt, so dass b = a; einem Aufruf von b.operator=(const A&) entspricht;

Nun ja, das ist das Problem. Aber der Schreibunterschied spielt hier keine Rolle, in C++ wird es in beiden Fällen nicht kompiliert.

Im Allgemeinen gibt es hier keinen Widerspruch. Im Sonderfall der Zuweisung eines gleichwertigen Objekts gibt es eine gewisse Inkonsistenz der Entitäten

Zumindest bei C++ wird es einen Widerspruch geben. Wenn es kompiliert, bedeutet das, dass der rechte Operand implizit auf den linken gecastet wird und dann eine vollständige Substitution des Objekts stattfindet, wie es logisch funktionieren sollte. Ich habe ein Beispiel mit int->long gegeben. Und die Substitution eines Teils des Inneren eines Objekts ist keine Zuweisung. Es gibt also einen Widerspruch und eine Inkonsistenz in einem.

p.s. Wir können zwar auch den Operator B::operator=(A&) überladen, aber ich nehme an, ein vernünftiger Programmierer würde das B-Objekt dort vollständig ersetzen, nicht teilweise, da dies das Wesen der Zuweisung ist.

Wenn man eine prägnante Schreibweise wünscht, könnte man einen anderen Operator dafür verwenden: &= oder |= zum Beispiel. Zumindest werden sie nicht häufig verwendet, so dass es keine Verwirrung gibt.

 
Alexey Navoykov:

..........

Ein Widerspruch wäre zumindest bei C++. ......

..........

Wie kommen Sie darauf, dass MQL völlig gleichwertig zu C++ sein muss?

C-ähnlich bedeutet nicht gleichwertig!

MQL wird für bestimmte Aufgaben entwickelt und ist nicht verpflichtet, die Sprache, auf deren Grundlage sie entstanden ist, vollständig zu kopieren.

Werden Sie aufhören, sich zu entrüsten?

Aber in Pascal können Sie .........

In Assembler können Sie auf ..... gehen.

Und in Java ....

Und in BASIC ....

Üben Sie hier den Vergleich von Sprachen?

=======

P.S. Es geht nicht nur um dich...

 
Сергей Таболин:

Wie kommen Sie darauf, dass MQL vollständig mit C++ kompatibel sein sollte?

...

Üben Sie hier den Vergleich von Sprachen?

Ich habe auf eine bestimmte Formulierung reagiert. Beruhigen Sie sich. Nehmen Sie Baldrian und gehen Sie ins Bett, es ist nicht gut für Sie, sich Sorgen zu machen. ...Manche Leute werden bei dem Wort "C++" heiß.

Grund der Beschwerde: