Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 42

 
PositionSelect setzt im Falle eines Fehlers alle PositionGet-Daten auf Null zurück.
 
Ein klassischer Fehler
void Func( int& ) {}

void OnStart()
{
  int i;
  
  Func(true ? i : i); // '?' - parameter passed as reference, variable expected
  Func(i); // OK
}
 
fxsaber:
Ein klassischer Fehler
Sie fragen sich, ob dies der richtige Fehler ist?
 
fxsaber:
Ich frage mich, ob dies ein Fehler ist.

Was die Korrektheit betrifft, so ist dies richtig.

Offenbar gibt der ternäre Operator keine Referenz, sondern eine Variable nach Wert zurück (was im Prinzip nicht logisch ist).

Es stellt sich heraus, dass es sich um eine temporäre Variable handelt, die mql-Funktionen mit Referenzparametern nicht mögen.

Das heißt, ternäre Operatoren und Referenzen vertragen sich nicht, kurz gesagt.

Gesunder Menschenverstand - ich weiß nicht, die Konstruktion ist logisch.
 
Kombinator:

Sie erhalten eine Rampenvariable, die mql-Funktionen mit Referenzparametern nicht mögen.

MqlTick Out()
{
  MqlTick Tick = {0};
  
  return(Tick);
}

void In( MqlTick& ) {}

void OnStart()
{
  In(Out());
}
Genau "gefällt". Aufgrund solcher Beispiele sind Zweifel aufgekommen.
 
fxsaber:
Genau "gefällt". Aufgrund solcher Beispiele sind Zweifel aufgekommen.

Aus der Beschreibung des Fehlers selbst geht hervor, dass es sich um ein Problem mit Links und Nicht-Links handelt.

Vielleicht kann jemand, der die Sprache besser kennt, das erklären.

 

fxsaber:
Klassischer Fehler

void Func( int& ) {}

void OnStart()
{
  int i;
  
  Func(true ? i : i); // '?' - parameter passed as reference, variable expected
  Func(i); // OK
}

Und wenn ja

void Func( int& ) {}

void OnStart()
{
  int i;
  
  Func((true ? i : i));
  Func(i); // OK
}
 
Alexey Viktorov:

Wie wäre es damit?

Es geht schneller, das zu überprüfen, als einen Beitrag zu schreiben.

Das funktioniert natürlich nicht.

 
fxsaber:

Es geht schneller, das zu überprüfen, als einen Beitrag zu schreiben.

Das funktioniert natürlich nicht.

Seltsam. Ich verwende diese Option immer, wenn ich Positionen mit oder ohne Takeaways eröffne.

          trade.BuyStop(lot, buyPrice, _Symbol, 0.0, (tacke == 0.0 ? 0 : buyPrice+tacke));
          trade.SellStop(lot, sellPrice, _Symbol, 0.0, (tacke == 0.0 ? 0 : sellPrice-tacke));
 
Alexey Viktorov:

Seltsam. Ich verwende diese Option immer, wenn ich Positionen mit oder ohne Übernahmen eröffne.

In solchen Fällen funktioniert es auch ohne zusätzliche Klammern.