Fehler, Irrtümer, Fragen - Seite 1922

 

Kompilierungsfehler.

#define  MACRO( x )      ((x) + 2)
struct A {
        A( int, int ) {}
};
template<typename T>
struct B {
        static A a;
};
template<typename T>
A B::a( MACRO(1), 2 ); //error: '(' - declaration without type
Und ohnetemplate<typename T> ist es in Ordnung... wo ist der Unterschied?
 
A100:

Kompilierungsfehler

Und ohnetemplate<typename T> - ok... wo ist der Unterschied?

Das liegt an den zusätzlichen Klammern im Makro.

struct A {
        A(int) {}
};

template<typename T>
struct B {
        static A a;
};
template<typename T>
A B::a((0));

Wenn Sie diese entfernen, wird das Programm kompiliert.

 
fxsaber:

Das liegt an den zusätzlichen Klammern im Makro.

Wenn Sie diese entfernen, wird das Programm kompiliert.

Wenn Sie template<typename T> entfernen, wird es auch kompiliert (sogar mit Klammern)
 
A100:

Die Protokolldateien %AppData%\MetaQuotes\Terminal\...\MQL5\Logs\YYYYMMDD.log werden nicht zeitnah aktualisiert

Die Aktualisierung erfolgt nur: nach einem Neustart des Terminals oder nach Auswahl des Menüs Ansicht. Wenn Sie nicht neu starten oder auf Vorschau klicken, ist die entsprechende Datei leer.

Früher hat es gut funktioniert (sogar die in MetaEditor geöffnete Datei YYYYYMMDD.log wurde automatisch in wenigen Sekunden nach der Anzeige von Zeilen in der Registerkarte "Experten" aktualisiert) und es mussten keine zusätzlichen, nicht offensichtlichen Aktionen durchgeführt werden

IMHO war das schon immer so, wenn die Log-Größe klein ist (irgendwo im Forum gab es eine Info über die Größe, bei der das Cache-Dumping beginnt). Ich musste immer das Kontextmenü aufrufen, um das Flushen auf die Festplatte zu initialisieren.

 
Stanislav Korotky:

IMHO war dies schon immer der Fall, wenn die Loggröße klein ist (irgendwo im Forum gab es Informationen darüber, ab welcher Größe der Cache zurückgesetzt wird). Ich musste immer das Kontextmenü aufrufen, um das Flushen auf die Festplatte zu initialisieren.

Ich verstehe nicht ganz, worauf Sie IMHO hinauswollen. Nimm Build <= 1596 (32bit) und prüfe (gibt sofort [5-10 Sekunden] auch nur eine Zeile in die .log-Datei aus). Ich habe es vor einer Minute überprüft.

[welcher cache? welcher immer? da war doch irgendwo was mit irgendwas!?!]

es geht um die Registerkarte Experten und den Ordner MQL5\Logs\

 
A100:
Wenn Sie template<typename T> entfernen, wird es auch kompiliert (sogar mit Klammern)

Nun, es ist ein Satz aus der Kategorie "wenn man alles entfernt, wird es kompiliert".

Ich habe über die Ursachen des Fehlers genau mit Vorlage gesprochen. Der Grund dafür ist ein falsches Verhalten des Compilers beim Parsen eines Vorlagenkonstrukts in der Situation mit zusätzlichen Klammern. Jeder, der die Vorlagen implementiert hat, kann sofort erkennen, wo das Problem liegt und warum es auftritt.

 

Hallo Leute, ich habe eine Aufgabe, zwei Indikatoren iMACD_1 Farbe, Signallinie und iMACD_2 in einem separaten Fenster anzuzeigen, hier ist ein Teil des Codes:

Ich habe die Indizierung

   SetIndexBuffer(0,MACDBuffer_1,INDICATOR_DATA);
   SetIndexBuffer(1,buffer_color_histogram,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(2,Signal_Line,INDICATOR_DATA);
   SetIndexBuffer(3,MACDBuffer_2,INDICATOR_DATA);

Haben Sie Hinweise auf Indikatoren

 handle_1=iMACD(name,period,fast_ema_period,slow_ema_period,signal_period,applied_price); 
 handle_2=iMACD(name_,period_,fast_ema_period_,slow_ema_period_,signal_period_,applied_price_);

(Und fragt sich dann)))

Theoretisch sollte es funktionieren, Indikatoren anzuzeigen

      if(CopyBuffer(handle_1,0,0,values_to_copy,MACDBuffer_1)<0)return(0);
      if(CopyBuffer(handle_1,1,0,values_to_copy,Signal_Line)<0) return(0);
      if(CopyBuffer(handle_2,3,0,values_to_copy,MACDBuffer_2)<0) return(0);

Das funktioniert nicht!

Aber es funktioniert folgendermaßen

      if(CopyBuffer(handle_1,0,0,values_to_copy,MACDBuffer_1)<0)return(0);
      if(CopyBuffer(handle_1,1,0,values_to_copy,Signal_Line)<0) return(0);
      if(CopyBuffer(handle_2,0,0,values_to_copy,MACDBuffer_2)<0) return(0);

Es funktioniert, ich kann nicht herausfinden, was das Problem mit der Anzahl der Indikatorpuffer ist. Vielen Dank im Voraus !!!

 

Kompilierfehler.

template<typename T>
struct A {
        static int a1;
        static int a2;
};
template<typename T>
int A::a1;
template<typename T>
int A::a2;
struct B : A<int> {
        void f1() { Print( A<int>::a1 ); } //unresolved static variable 'A<int>::a1'
        void f2() { Print(         a2 ); } //unresolved static variable 'B::a2'
};

Und ohnetemplate<typename T> - gut

 
vitrix:

Hallo Leute, ich habe eine Aufgabe, zwei Indikatoren iMACD_1 Farbe, Signallinie und iMACD_2 in einem separaten Fenster anzuzeigen, hier ist ein Teil des Codes:

Ich habe die Indizierung

Haben Sie Hinweise auf Indikatoren

(Und fragt sich dann)))

Theoretisch sollte es funktionieren, Indikatoren anzuzeigen

Das funktioniert nicht!

Aber es funktioniert folgendermaßen

Es funktioniert, kann ich nicht herausfinden, was ist das Problem mit der Anzahl der Indikator-Puffer. Vielen Dank im Voraus !!!


Bitte denken Sie das nächste Mal daran, wie Sieden Code in den Beitrageinfügen(Ihren Beitrag habe ich korrigiert).

Zweitens: Der iMACD-Indikator hat nur zwei Puffer: "0" - MAIN_LINE, "1" - SIGNAL_LINE. Um Indikatorwerte zu erhalten, sieht das folgendermaßen aus:

   CopyBuffer(handle_iMACD,MAIN_LINE или SIGNAL_LINE,index - номер буфера с которого начинаем копирование,values_to_copy,buffer)
 
A100:

Kompilierfehler.

Und ohnetemplate<typename T> - gut

template<typename T>
struct A {
        static int a1;
        static int a2;
};
template<typename T>
int A::a1 = 0;
template<typename T>
int A::a2 = 0;
struct B : A<int> {
        void f1() { Print( A<int>::a1 ); } //unresolved static variable 'A<int>::a1'
        void f2() { Print(         a2 ); } //unresolved static variable 'B::a2'
};