Fehler, Irrtümer, Fragen - Seite 2746

 
Koldun Zloy:

Nein. Sie ist zur Kompilierzeit noch nicht bekannt.

Wie lässt sich dann eine große Anzahl von Prüfungen vermeiden, wenn SymbolInfoTick zig Milliarden Mal aufgerufen wird?

[Gelöscht]  
fxsaber:

Wie lässt sich dann eine große Anzahl von Prüfungen vermeiden, wenn SymbolInfoTick zig Milliarden Mal aufgerufen wird?

Das ist nicht der Fall. Es hilft nur, die Zeichenkette selbst nicht unnötig zu kopieren.

 
Koldun Zloy:

Nein. Es hilft nur, die Zeichenkette selbst nicht unnötig zu kopieren.

Dann ist offensichtlich die String-Referenz-Lösung für SymbolInfo-Funktionen die richtige, wenn man mehr Effizienz vom Optimierer will.

 

Mein Debugger weigert sich, in einem meiner Projekte zu arbeiten. Außerdem ist sein Verhalten schwer vorhersehbar. Manchmal weigert er sich einfach, Haltepunkte einzugeben. Es weigert sich auch, einige Funktionen einzugeben. Zuerst dachte ich, der Grund dafür seien Aktualisierungen (vielleicht ging bei der Fehlersuche etwas schief). Aber bei anderen, einfacheren Programmen scheint alles zu funktionieren. Ich habe es aber nicht oft überprüft, weil ich an meinem Hauptprojekt arbeite. Es ist recht komplex und umfasst allein 15 Module meines eigenen Entwurfs (die Anzahl der Standardmodule habe ich nicht gezählt). Das Hauptmodul enthält bis zu 2000 Zeilen. Ich dachte, vielleicht liegt es an der Komplexität des Projekts... Außerdem verwende ich an einigen Stellen Makros für sich wiederholende Codeschnipsel. Außerdem verwende ich Standard-UI-Elemente, wie CAppDialog, CCheckGroup, CComboBox, CButton usw., die ich für die Funktionalität meines Programms umgeschrieben habe. Vielleicht funktioniert das Debugging wegen ihnen nicht... Zum Beispiel wird die Methode CCheckGroup::itemCheckState(const string item), die ich speziell geschrieben habe, nicht debuggt. Die Methode findet das Element des Kontrollkästchens und prüft, ob es ausgewählt ist (sein Status):

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CCheckGroup::itemCheckState(const string item) {
  int total = m_strings.Total();
  
  if(total != m_states.Total())
    return -1;
    
  int i = 0;
  for(; i < total; i++) {
    if(m_strings.At(i) == item)
      return m_states.At(i);
  }
  
  return -1;
}

Diese Art von Benutzeroberfläche habe ich am Ende erhalten:

UI

Einige der UI-Elemente sind vorübergehend klassifiziert. Und hier ist ein Zweig, in dem ich beschrieben habe, wie ich die Show()- und Hide()-Methoden des CAppDialog-Elements überschrieben habe:https://www.mql5.com/ru/forum/338301 Der Compiler beschwerte sich in diesem Moment und ein kritischer Fehler trat auf.

Am Ende kompiliert das Projekt normal, der Compiler erzeugt keine Fehler. Aber das Debugging schlägt fehl und zeigt die Ausführung einiger Codefragmente, Funktionen, Methoden usw. einfach nicht an.

Soweit ich weiß, kann es dafür mehrere Gründe geben.

  1. Komplizierter Code des Projekts, Verwendung von Makros
  2. Komplizierter Code unter Verwendung von Standard-Benutzeroberflächenelementen wie CAppDialog, CCheckGroup, CComboBox, CButton (für die ich auch neue Methoden geschrieben und einige der bestehenden neu definiert habe)
  3. Debugger-Fehler im Zusammenhang mit dem neuen Build (möglich, unwahrscheinlich).

Build- und Systeminformationen:

2020.05.21 09:35:09.325 Terminal MetaTrader 5 x64 build 2433 started for MetaQuotes Software Corp.

2020.05.21 09:35:09.326 Terminal Windows 10 build 14393, Intel Core i5-5200U @ 2.20GHz, 2 / 3 Gb Speicher, 61 / 380 Gb Festplatte, IE 11, UAC, GMT+2

Hatte jemand ähnliche Probleme mit dem Debugger und was könnte die Ursache sein?
 
fxsaber:

Es ist also offensichtlich, dass eine String-Referenz-Lösung für SymbolInfo-Funktionen die richtige ist, wenn man mehr Effizienz vom Optimierer erwartet.

Es wird sowieso alles per Referenz übergeben, der Unterschied war nur im alten MQL4. Und es gibt keine Prüfungen beim Lesen von Strings.
 
Alexey Navoykov:
Dieser Link macht keinen Sinn, das hat der Entwickler gesagt. Alles wird durch den Link so weitergegeben, wie es ist. Der einzige Unterschied war im alten MQL4. Und beim Lesen der Zeichenkette gibt es keine Prüfungen.

Es ist nur ermüdend, solche Behauptungen aufzustellen.

int f1( string Str )
{
  return((Str += Str) == Str);
}

int f2( string &Str )
{
  return((Str += Str) == Str);
}

int Bench1( const int Amount = 1 e8 )
{
  int Res = 0;
  string Str = NULL;
  
  for (int i = 0; i < Amount; i++)
    Res += f1(Str);
    
  Print(Res);
    
  return(Res);    
}

int Bench2( const int Amount = 1 e8 )
{
  int Res = 0;
  string Str = NULL;
  
  for (int i = 0; i < Amount; i++)
    Res += f2(Str);

  Print(Res);
    
  return(Res);    
}

void OnStart()
{
  BENCH(Bench1())
  BENCH(Bench2())

  BENCH(Bench1())
  BENCH(Bench2())
}


        100000000
        Time[Bench1()] = 727585
        100000000
        Time[Bench2()] = 657464
        100000000
        Time[Bench1()] = 794205
        100000000
        Time[Bench2()] = 670440
 
fxsaber:

Es ist nur ermüdend, solche Behauptungen aufzustellen.


Vielleicht ist es einfacher, zu schreiben:

int f1( string Str )
{
  return(Str == NULL || Str == "");
}

?...

Warum sollte man so etwas trinken?

int f1( string Str )
{
  return((Str += Str) == Str);
}
 
Mihail Matkovskij:

Es ist vielleicht einfacher zu schreiben:

Es gibt eine andere Art von Diskussion.

 
fxsaber:

Es ist nur ermüdend, solche Behauptungen aufzustellen.

Um zu vermeiden, dass Sie unsubstantiiert sind, nennen Sie mir einen Vergleichswert, bei dem sich die Zeichenfolge nicht ändert.
 
TheXpert:
Um zu vermeiden, dass Sie unsubstantiiert sind, geben Sie mir einen Vergleichswert für die Tests, bei denen sich die Zeichenfolge nicht ändert.
int f1( const string Str )
{
  return(Str + "1" != Str);
}

int f2( const string &Str )
{
  return(Str + "1" != Str);
}
        10000000
        Time[Bench1()] = 334596
        10000000
        Time[Bench2()] = 338559
        10000000
        Time[Bench1()] = 384711
        10000000
        Time[Bench2()] = 344346