Fehler, Irrtümer, Fragen - Seite 1017

 
A100:

Kurz gesagt, Sie können eine Funktionsimplementierung nicht in .mqh definieren und sie ohne Probleme in jeder .ex5

:)

Aber wenn Sie eine .ex5 verwenden , um Funktionen in einer anderen .ex5 aufzurufen, obwohl die Funktion mit diesem Namen in beiden vorhanden ist, müssen Sie sicherstellen, dass Sie den Namensraum genau angeben. Das heißt, die ::In() sollte theoretisch das Problem lösen, und wenn nicht, ist das ein Fehler, der behoben werden muss.

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

Lassen Sie uns mit der ServiceDesk-Antwort aufhören:

"Beim Kompilieren von 1.mq5 ist es innerhalb der Funktion B() nicht klar, welche Funktion aufgerufen werden soll,
importierte A() oder exportierte A() - weil der Compiler nicht versteht, dass man dieselbe Funktion meint"

Sie sind in der Form richtig - aber wenn Sie wollten, könnten (und sollten) Sie dem Compiler mitteilen, dass es sich um dieselbe Funktion handelt, da der Modulname zum Zeitpunkt der Kompilierung verfügbar ist (angegeben in #import).

Umso mehr, wenn man erst :: an eine Stelle setzt und kompiliert, dann löscht und :: an eine andere Stelle setzt - alles funktioniert, aber Sie müssen zustimmen - es ist sehr unbequem und nach 10-15 solcher erzwungenen Permutationen bin ich zu #define

 
A100:

Lassen Sie uns mit der ServiceDesk-Antwort aufhören:

"Beim Kompilieren von 1.mq5 ist es innerhalb der Funktion B() nicht klar, welche Funktion aufgerufen werden soll,

Importiertes A() oder exportiertes A() - da der Compiler nicht versteht, dass Sie dieselbe Funktion meinen"

Absolut, so ist es.


Sie sind in der Form korrekt - aber dem Compiler könnte (und sollte) mitgeteilt werden, dass es sich um dieselbe Funktion handelt, falls gewünscht, da ich wiederhole, dass der Modulname zum Zeitpunkt der Kompilierung verfügbar ist (angegeben in #import).

Für solche Hinweise gibt es einen Kontextauflösungsoperator "::", der aber in diesem Fall nicht anwendbar ist, da der Modul-(Datei-)Name ebenfalls derselbe ist.

Der Rat ist angemessen - ändern Sie die Struktur des Programms.

Umso mehr, wenn man zuerst :: einfügt und an einer Stelle kompiliert und dann :: entfernt und an einer anderen Stelle einfügt - alles funktioniert, aber Sie müssen zustimmen - es ist sehr unbequem

Es ist besser, solche Tricks zu vermeiden. Sie sind nicht nur unbequem, sondern auch "rassisch unkorrekt", "unkoscher", "hässlich" und "rotzig". Versuche, den Compiler zu betrügen, haben nur dann eine Daseinsberechtigung, wenn es keine anderen Möglichkeiten gibt, das Gewünschte zu implementieren. In diesem Fall gibt es viele.


und nach 10-15 solcher erzwungenen Permutationen bin ich zu #define

Parametrisierte Defines sind nur dann sinnvoll, wenn Typensensing unerwünscht ist oder wenn Parameter durch "ausführliche" Textstücke ersetzt werden. Als Ersatz für eine Inline-Funktion ist ein Define zweifelsohne schädlich für die Gesundheit eines Programms.

--

In Ihrem Fall würde ich mich weigern, die .ex5-Bibliotheken zu verwenden, und alles würde gut funktionieren. Der einzige praktische Nutzen besteht darin, die Implementierung zu verstecken (beim Verkauf), und ich sehe keinen Nutzen in anderen Fällen.

Schreiben Sie für den Verkauf?

 
MetaDriver:

Schreiben Sie für den Verkauf?

Für mich selbst.

Ohne .ex5 kann ich es nicht tun. Ich habe auch Funktionen wie F( string& [] ), sie passen irgendwie nicht in .dll :)

Vielleicht könnte man sie durch einen Separator drücken, aber ich habe es noch nicht versucht.

 
A100:
MQL5 hat einfach keine Inline-Funktionen (in Form) und ich verwende stattdessen parametrische Makros, was nicht ganz korrekt ist, weil es keine Typkontrolle gibt.

Außerdem optimiert der Compiler die Ausdrücke nicht, so dass ein zusätzlicher Geschwindigkeitsverlust entsteht. Das sollten Sie überprüfen.

Übrigens, was das Inlining betrifft - es funktioniert. Ich hatte deswegen einige Probleme mit dem Debugger.

 
TheXpert:

Übrigens, was das Inlining angeht - es funktioniert. Außerdem gab es dadurch Probleme mit dem Debugger.

Es funktioniert also auf Compiler-Ebene. Und ich möchte, dass es auf Sprachebene funktioniert. Ich habe oben ein Beispiel gegeben - alles funktioniert durch unerklärliche "Umgehung des Compilers", während die direkte Arbeit zusätzliche Schritte erfordert, manchmal erhebliche, denn wie Sie vorgeschlagen haben, Beschreibung und Implementierung ein und derselben Funktion nicht in eine Datei aufzunehmen, ist sicherlich möglich, aber dann werden 10 komplette .mqh in 100 kleinere .mqh aufgeteilt

Ich bin noch nicht auf der Jagd nach Geschwindigkeit gewesen. Das Wichtigste ist die Bequemlichkeit und dass die Menge des Codes nicht exponentiell wächst.

Ich habe sogar die Notwendigkeit der Verwendung von #if #else Analoga in MQL5 konfrontiert (es ist ein bisschen schwierig so weit, aber es funktioniert hier und da)

 
A100:

Ich bin noch nicht auf der Suche nach Geschwindigkeit. Das Wichtigste ist die Bequemlichkeit und dass das Volumen des Codes nicht exponentiell ansteigt.

Es liegt an Ihnen. Aber angesichts der pathologischen Vorliebe für Metaquotes für Einschränkungen ist die Wahrscheinlichkeit, dass Sie mit solchen Makros den einen oder anderen Gewinn erzielen, bei weitem nicht gleich Null.
 

A100:

Ohne .ex5 funktioniert es nicht. Ich habe auch Funktionen wie F( string& [] ), aber sie passen nicht in .dll irgendwie :)

....

Oje... :)

Ich habe nicht vorgeschlagen, DLL anstelle von .ex5-Bibliotheken zu verwenden, sondern nur viele, viele .mqh und eine ausführbare .mq5, mehr nicht.

 
MetaDriver:

Nur viele, viele .mqh und eine ausführbare .mq5, sonst nichts.

Ich verwende einen Code auf 3 verschiedenen Terminals, das bedeutet, dass mindestens eine .ex5 (die von allen genutzt wird) vorhanden sein muss. Und wenn ja - dann zurück zu dem oben beschriebenen Problem - es gibt nur 2 Module - aber sie lassen sich nicht normal kompilieren.
 
ChartGetInteger( chart_ID, CHART_BRING_TO_TOP, 0, true )
ChartGetInteger( chart_ID, CHART_BRING_TO_TOP, true )
Außerhalb der Handelszeiten funktioniert sie nicht. Was hindert Sie daran, den Zeitplan in der handelsfreien Zeit über alle anderen zu legen?
Grund der Beschwerde: