Fehler, Irrtümer, Fragen - Seite 713

 
speedy:

Die Schaltfläche "Kompilieren" ist für immer verloren (man muss den Editor neu laden, um sie wieder zu erhalten)

Nun, nicht ganz... :) Ich habe es zurückbekommen :)

Sie müssen den rekursiven Teil auskommentieren und die Debug-Compile-Taste drücken, um dies zu tun.

 
speedy:

1. Es ist nicht sicher, interne Elemente, die nicht der Basisklasse angehören, nach außen hin "freizulegen" (und in diesem Beispiel nicht das Attribut selbst, sondern nur ein Array-Element!) Außerdem ist es nicht möglich, seinen Wert zu ändern.

Außerdem widerspricht es dem "Geist" der objektorientierten Programmierung: Die gesamte Arbeit mit den Daten des Objekts sollte innerhalb des Objekts, durch seine eigenen Methoden, durchgeführt werden...

3. wie über nur mit Setter für Daten-Attribut?

4. die Lesbarkeit des Codes wäre von Vorteil.

5. schließlich diese "Einfachheit" mit l-Wert-Indexer wird niemand einschließlich Sie verstehen, wie dieser Code funktioniert ...

6. Sie werden mehr Zeit damit verbringen, nach Fehlern zu suchen, als Setter zu schreiben.

Was ist das, schwarzer Humor?

1. tut mir leid, - Unsinn. Ich verstehe, dass Paranoia hier in Mode ist und ein Schrottargument dafür ist, "warum man das nicht tun sollte". Ich sehe darin keine Gefahr. Jeder Name ist schließlich eine Referenz. Die Indexierung ist nur eine Erweiterung des Namenskonzepts. Mehr nicht. Verbieten wir die Namensgebung ganz, um der Sicherheit willen. Links sind extrem gefährlich, nicht wahr?

Diese Logik widerspricht heftig dem Geist der objektorientierten Programmierung mit C++, C#, Delphi und ein paar Dutzend weniger populärer Sprachen, in denen Indexer sowohl rechts als auch links recht gut funktionieren. Außerdem widerspricht sie nicht dem gesunden Menschenverstand und meinem Geist.

Indexer sind dazu da, mit der externen Umgebung zu kommunizieren. Ihre Funktion ist genau die einer Schnittstelle. Ich kann alles kapseln und verstecken, aber ich brauche Indexe, um mit Objekten als Arrays zu arbeiten. In der Tat sind alle Arrays irgendwie angeordnet. Zum Beispiel regelmäßige dynamische mql-Arrays. Dürfen wir verbieten, sie auf die linke Seite des Zuweisungsoperators zu setzen? Ersetzen wir sie durch eine Funktion wie SetArrayValue(array, i, j, value); dies wird gleichzeitig die Lesbarkeit verbessern. Und auch die Fehlersuche wird wesentlich einfacher. Igitt...

3. wie wäre es, einen normalen Indexer zu bauen? Das Dienstmädchen ist natürlich cool, aber die Königin ist noch besser.

4. jetzt fange ich wirklich an, den Verstand zu verlieren. Ist das unleserlich?

  t[i]=i*i;

Das ist doch besser lesbar, oder?

  t.setDataElement(i, i*i);

Cool. Ich denke, ich werde mich behandeln lassen.

5. cool.

6. Ich habe geweint.


 

Der Indikator wurde bei Build 630 nicht mehr kompiliert:

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
 //код
 for(int i=limit; i<rates_total && !IsStopped(); i++)
  {
   if()
    {
     //~400 стр. кода
     // i используется много раз
     // тут же определяется RT=true или false
    }
   if(RT)
    {
     double p=close[i];  // 'i' - undeclared identifier
    }
  }
 return(rates_total);  // 'rates_total' - undeclared identifier
}

c i-Fehler können beseitigt werden, indem eine Anzeige vor for gesetzt wird

int i;
for(i=limit; i<rates_total && !IsStopped(); i++)
{

}

Und was tun mit'rates_total' - nicht deklarierter Bezeichner?

Dasselbe gilt für Win7 x64 und XP x32.

 

Können Sie mir das bitte sagen? Sind MathMin() und MathMax() als Funktionen (mit über den Stackübergebenen Parametern ) oder als Makrosubstitution(inline) implementiert? Laut Nachschlagewerk handelt es sich um Funktionen.

Документация по MQL5: Основы языка / Функции / Передача параметров
Документация по MQL5: Основы языка / Функции / Передача параметров
  • www.mql5.com
Основы языка / Функции / Передача параметров - Документация по MQL5
 
kPVT:

Der Indikator wurde bei Build 630 nicht mehr kompiliert:

c i-Fehler können beseitigt werden, indem eine Anzeige vor for gesetzt wird

Und was tun mit'rates_total' - nicht deklarierter Bezeichner?

Dasselbe gilt für Win7 x64 und XP x32.

Es muss irgendwo ein Fehler in Ihrem Code sein. Der Block, den Sie eingereicht haben, kompiliert ohne Fehler, wenn Sie die Variablen limit, RT und die Bedingung if() deklarieren
 
Rosh:
Sie haben eindeutig irgendwo in Ihrem Code einen Fehler. Der eingereichte Block lässt sich ohne Fehler kompilieren, wenn Sie die Variablen limit, RT und die Bedingung if() deklarieren

Natürlich habe ich nicht den Code angegeben, sondern eine ungefähre Struktur.

Auf dem 619er Build wurde der Indikator kompiliert und funktionierte einwandfrei.

Bei 630 werden die oben genannten Fehler erzeugt.

Der Code ist zu 100 % unverändert. Die Arbeitsweise des Compilers hat sich offensichtlich geändert.

 
Bitteschreiben Sie an Service Desk und fügen Sie den Quellcode bei. Dies wird den Entwicklern helfen, die Ursache zu finden und zu beheben.
 
speedy:

Wanze?

Der folgende Code erzeugt im Compiler eine Art Endlosschleife. Klicken Sie auf Abbrechen

funktioniert nicht sofort, aber wenn es funktioniert, gewinnt es die Kontrolle über den Editor zurück.

Die Schaltfläche Abbrechen selbst verschwindet zwar nicht, ist aber auch nicht zugänglich.

Die Schaltfläche "Kompilieren" ist für immer verloren (man muss den Editor neu laden, um sie wieder zu erhalten)

Danke für den Beitrag, der Compilerfehler wurde behoben.
 
victorg:

Bitte beraten Sie mich. Sind MathMin() und MathMax() als Funktionen (mit über Stackübergebenen Parametern ) oder als Makrosubstitutionen(inline) realisiert? Dem Nachschlagewerk zufolge handelt es sich um Funktionen.

Natürlich Funktionen, denn zum Zeitpunkt der Kompilierung sind die Werte der Argumente unbekannt. IMHO sind Inline und Makros unterschiedlich.

P.S.: Inline oder nicht Inline kann ich nicht sagen.

 
220Volt:

Natürlich Funktionen, denn zum Zeitpunkt der Kompilierung sind die Werte der Argumente unbekannt. IMHO sind Inline und Makros unterschiedlich.

P.S.: Ob sie inline sind oder nicht, kann ich nicht sagen.

Ein Makro und eine Inline-Funktion sind in der Tat unterschiedliche Dinge. Aber das ist nicht das, was ich meine. Hier ein Beispiel, wenn die Werte der Argumente zum Zeitpunkt der Kompilierung unbekannt sind

#define  min(a,b) (((a)<(b))?(a):(b))
double func(a,b)
  {
  c=min(a,b);   // 1-й вариант
  c=fmin(a,b);  // 2-й вариант
  return(c);
  }

Im ersten Fall muss der Code in die aktuelle Funktion eingefügt werden (vermute ich) und im zweiten Fall wird die Funktion mit Parametern aufgerufen , die über den Stack übergeben werden (vermute ich). Zu Optimierungszwecken kann der Compiler jedoch auch die zweite Variante durch Substitution implementieren. Ist das so? Ich weiß es nicht. Deshalb habe ich gefragt.

Документация по MQL5: Основы языка / Функции / Передача параметров
Документация по MQL5: Основы языка / Функции / Передача параметров
  • www.mql5.com
Основы языка / Функции / Передача параметров - Документация по MQL5
Grund der Beschwerde: