Fehler, Irrtümer, Fragen - Seite 2566

 
Slava:

Bei diesem Casting gibt es keinen Datenverlust. Entweder ist sie 0 oder sie ist nicht 0.

Ein anderer Fall ist, wenn double -> ein beliebiger Integer-Typ (bis einschließlich int32)

Meiner Meinung nach spielen Sie ein bisschen zu sehr mit den Warnungen, es mangelt an Konsistenz in Ihrem Urteil

bool continuation()const {return this.last_level;}  // uint last_level
// expression not boolean	lrp_last_9.mq5	260	42
 
Vict:

Meiner Meinung nach haben Sie es mit den Warnungen etwas übertrieben, es mangelt an Konsistenz in der Beurteilung.

Einverstanden

Auch hiergibt es keinen Datenverlust in diesem Sinne(entweder 0 oder nicht 0)

void OnStart()
{
        int i = -1;
        while ( ++i ); //Warning: expression not boolean
}

aber es gibt eine Warnung. Es wurde ein einheitlicher Ansatz erwartet

 

Ergebnis des Versuchs, von einer statischen Funktion derselben Klasse aus auf eine Eigenschaft einer Klasseninstanz zuzugreifen:

2019.09.18 20:07:41.043 Test_exec (EURUSD,M5)   Access violation at 0x000001E9CCD2963C read to 0x0000000000000014 in 'D:\Alpari MT5\MQL5\Scripts\Test_exec.ex5'
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)      crash -->  000001E9CCD2963C 837B1400          cmp        dword [rbx+0x14], 0x0
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)                 000001E9CCD29640 0F8E8F020000      jle        dword 0x1e9ccd298d5
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)                 000001E9CCD29646 90                nop        
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   00: 0x000001E9CCD2963C
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   01: 0x000000B56CA2F120
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   02: 0x000001E9CCD2A04D
Der Compiler war vorher stumm.
 

Eine leere Zeichenkette wird nicht mit einem Terminal Null initialisiert.

void OnStart()
{      
   string str;
   StringInit(str, 100, 0);
   
   Print(StringLen(str));     
}

Ergebnis

2019.09.18 22:16:54.380 TestScript (EURUSD,H1)  0

Erwartet

2019.09.18 22:16:54.380 TestScript (EURUSD,H1)  100

Hinweis in der Hilfe für die Funktion StringInit

Примечание

Если  character=0 и размер new_len>0, то будет распределен буфер строки указанного размера и заполнен нулями. 
Размер строки будет равен нулю, так как весь буфер заполнен терминаторами строки.

In der Tat gibt es keine Verteilung.
D.h. Aufteilung auf diese Weise, zehn Räume

string str = "          ";

ist nicht dasselbe wie.

string str;
StringInit(str, 10, 0);

Der rot markierte Hilfetext entspricht nicht dem logischen Verhalten.

 
Vict:

Meiner Meinung nach übertreibst du es mit den Warnungen, du bist nicht konsequent genug in deiner Beurteilung.

Warnungen funktionieren nicht bei booleschen Operationen, jetzt habe ich zufällig einen Tippfehler in meinem Code bemerkt, also habe ich ihn reproduziert:

#define               getAsk(dummy)          SymbolInfoDouble(_Symbol, SYMBOL_ASK)
#define               getBid(dummy)          SymbolInfoDouble(_Symbol, SYMBOL_BID)
//+------------------------------------------------------------------+
void OnStart()
  {
      double sl = 0.0,tp=0.0;
      if(sl != ! OrderStopLoss() || tp != OrderTakeProfit()) Print("");  
  }
//+------------------------------------------------------------------+

double OrderStopLoss()
{
   return(getAsk());
}

double OrderTakeProfit()
{
   return(getBid());
}
 
Roman:

Initialisiert eine leere Zeichenkette nicht mit einem Terminal Null.

Ergebnis

Erwartet

Hinweis in der Hilfe für die Funktion StringInit

In der Tat gibt es keine Verteilung.
D.h. Aufteilung auf diese Weise, zehn Räume

ist nicht dasselbe wie.

Und es scheint nicht der Logik des Verhaltens zu entsprechen, die im Hilfetext rot hervorgehoben ist.

Sie haben die Funktion StringBufferLen übersehen - sie gibt die Größe des zugewiesenen Puffers zurück. StringLen gibt die Länge der Zeichenkette zurück, d.h. bis zum Endzeichen bzw., wenn dieses ganz am Anfang steht, die Länge 0. Buffer != string.

 
Stanislav Korotky:

Sie haben die Funktion StringBufferLen übersehen - sie gibt die Größe des zugewiesenen Puffers zurück. StringLen gibt die Länge der Zeichenkette zurück, d.h. bis zum Endzeichen bzw., wenn dieses ganz am Anfang steht, Länge 0. Buffer != string.

Sonst kennt er sich selbst nicht.

 
Stanislav Korotky:

Sie haben die Funktion StringBufferLen übersehen - sie gibt die Größe des zugewiesenen Puffers zurück.
StringLen gibt die Länge der Zeichenkette zurück, d.h. bis zum Endzeichen bzw., wenn dieses ganz am Anfang steht, Länge 0. Buffer != string.

Damit ist klar, dass es sich um die Initialisierung einer Zeichenkette mit terminalen Nullen handelt.
Warum nicht stringInit(str, 10, 0); mit zehn terminalen Nullen füllen? und die tatsächliche Länge der Zeichenkette zurückgeben.
Wenn Sie eine leere Zeichenkette initialisieren wollen, ohne sie zu füllen! zum Beispiel mit 100 Zeichen,
dann entweder 100 Leerzeichen als str = "many pokes at the keyboard", oder initialize rubbish StringInit(str, 100, 65)
Ich verstehe nicht, warum ich mit Müll initialisieren muss, es gibt schon genug davon ))


 
Roman:

Das ist verständlich, denn es geht darum, die Zeichenkette mit terminalen Nullen zu initialisieren.
Warum nicht StringInit(str, 10, 0); mit zehn Nullen auffüllen? und die tatsächliche Länge der Zeichenkette zurückgeben.
Wenn Sie eine leere Zeichenkette initialisieren wollen, ohne sie zu füllen! zum Beispiel mit 100 Zeichen,
dann entweder 100 Leerzeichen als str = "many pokes at the keyboard", oder Quatsch initialisieren StringInit(str, 100, 65)
Ich verstehe nicht, warum ich es mit Müll initialisieren muss, es gibt schon genug davon ))


Wie kommen Sie darauf, dass sie nicht ausgefüllt ist? Es ist nur so, dass die Länge in der µl-Zeichenkette nicht gespeichert wird, sie wird vom Terminal Null erkannt.

StringInit(str, 100, ' ');

Nein?

Und wenn Sie Nullen brauchen, gibt es irgendwo in den Eingeweiden von µl std eine String-Klasse.

 
Vict:

Wie kommen Sie darauf, dass sie nicht ausgefüllt ist? Es ist nur so, dass die Länge in der µl-Zeichenkette nicht gespeichert wird, sie wird vom Terminal Null erkannt.

nicht wahr?

Und wenn Sie Nullen brauchen, gibt es irgendwo in den Eingeweiden der µl std eine String-Klasse.

Nee... Auf diese Weise kommt auch null zurück. Der dritte Parameter, ushort, erfordert einen ganzzahligen Zeichencode.

Wenn ich als str = " " initialisiere; und dann Daten von dll übergebe, ist alles in Ordnung.
Aber wenn ich sie als StringInit(str, 10, 0) initialisiere, kommen keine Daten an. Das liegt daran, dass der Code keinen Speicher für eine Zeichenfolge mit der erforderlichen Größe zuweist.

Wenn ich Code für Raum hatte, würde wahrscheinlich gearbeitet haben, aber das habe ich nicht gefunden, wie Code in verschiedenen Tabellen.
Wir müssen Speicher für die Anzahl der zukünftigen Zeichen zuweisen, die dann in die bereits initialisierte leere Zeichenkette übergehen werden.
Aber Blödsinn, den String zu initialisieren, nicht kommelpho.
StringInit(str, 100, 0); sollte mit terminalen Nullen gefüllt werden und die Länge 100 zurückgeben.