Fehler, Irrtümer, Fragen - Seite 2735

 
Ich habe eine Frage: Wie kann ich jetzt kostenlose Signale finden? Ich finde sie regelmäßig manuell, aber die Signalseite zeigt nur bezahlte Signale an. Wenn ich nach dem Wert filtere, kann ich sie nicht finden.
 
Die Neukompilierung einer Bibliothek, die mit dem im Tester ausgewählten Expert Advisor verbunden ist, wird beim nächsten Durchlauf nicht übernommen. Ich muss im Testprogramm einen anderen Expert Advisor auswählen und dann zum vorherigen wechseln. Erst dann nimmt der Prüfer die neue Bibliothek auf. Völlig unauffälliger Fehler.
 
Stanislav Korotky:
Das erneute Kompilieren der mit dem Expert Advisor verbundenen Bibliothek, die im Tester ausgewählt ist, führt nicht dazu, dass diese beim nächsten Start abgeholt wird. Ich muss im Testprogramm einen anderen Expert Advisor auswählen und dann zum vorherigen wechseln. Erst dann nimmt der Prüfer die neue Bibliothek auf. Völlig unauffälliger Fehler.

In der stabilen Version ist es dasselbe...

 
MT5-Bug (Build 2407) Kompilierungsfehler, wenn eine Klasse einen Zeiger auf eine Wrapper-Klasse enthält, die diese Klasse als Feld verwendet.
C++ online: https://onlinegdb.com/SJN1shM58
template<typename T>
class wrapper{
public:
   T data;
};

class B{
public:
   wrapper<B>* ptr;             // undefined class 'B' cannot be used
};


void OnStart(){  
   B b;
   b.ptr = new wrapper<B>();
   printf("%p", b.ptr);
} 
 
Ein Kompilierungsfehler:
int i = f(); //Error: 'f' - undeclared identifier
void OnStart()
{
}
int f() { return 0; }

aber sonst:

void OnStart()
{
int i = f(); //нормально
}
int f() { return 0; }

gut. Welchen Unterschied macht das?

 
A100:
Es handelt sich um einen Kompilierungsfehler:

aber auf diese Weise:

So sollten Sie Ihr erstes Beispiel schreiben - mit einer Vorwärtsbeschreibung, übrigens funktioniert auch eine Vorwärtsbeschreibung für Strukturen und Klassen

int f(int);
int i = f(5);
void OnStart()
{
   printf("i = %i", i);
}
//+------------------------------------------------------------------+
int f(int v)
{
   return v * v;
}
//+------------------------------------------------------------------+

2020.05.10 17:23:27.704 tst1 (ETHUSD,M1) i = 25

A100:

OK. Worin besteht der Unterschied?

Ich denke, der Compiler analysiert den Compiler von oben nach unten und am Ende wird OnStart() als letztes analysiert
 
Igor Makanu:
Ich denke, der Compiler analysiert den Compiler von oben nach unten und OnStart() wird zuletzt analysiert

In diesem Fall muss man nicht nachdenken - die Regeln sollten allgemein sein: Wenn eine Funktion vor der Deklaration angewendet werden kann, dann kann sie, wenn nicht, dann nicht. Dementsprechend müssen beide Fälle entweder kompiliert werden oder nicht

 
A100:

In diesem Fall muss man nicht nachdenken - die Regeln sollten allgemein sein: Wenn eine Funktion vor der Deklaration angewendet werden kann, dann kann sie, wenn nicht, dann nicht. Folglich müssen beide Fälle entweder kompiliert werden oder nicht.

leider ist dies ein Sprachmerkmal, man kann es so schreiben

int f(int v)
{
   return v * v;
}
void OnStart()
{
   printf("i = %i", i);
}
//+------------------------------------------------------------------+
int i = f(5);
 
Igor Makanu:

Ach, das sind sprachliche Eigenheiten, das kann man so schreiben.

Alle Besonderheiten sind in der Dokumentation berücksichtigt. Das habe ich dort nicht gesehen. Daraus ergibt sich die Schlussfolgerung, dass es sich nicht um eine Eigenschaft, sondern um einen Mangel handelt.

 
A100:

In diesem Fall muss man nicht nachdenken - die Regeln sollten allgemein sein: Wenn eine Funktion vor der Deklaration angewendet werden kann, dann kann sie es, wenn nicht, dann kann sie es nicht. Dementsprechend müssen beide Fälle entweder kompiliert werden oder nicht.

Dies ist das normale Verhalten von C in solchen Sprachen.

Ohne eine Vorwärtsfunktionsdeklaration können sie nicht verwendet werden. Ein Aufruf aus OnStart kompiliert tatsächlich verzögert im Vergleich zu einem direkten Aufruf auf globaler Ebene.

In C++ wird genau der gleiche Fehler erzeugt.