Erreurs, bugs, questions - page 1017

 

Arrêtons avec la réponse de ServiceDesk :

"Lors de la compilation de 1.mq5, à l'intérieur de la fonction B(), il n'est pas clair quelle fonction doit être appelée,
importée A() ou exportée A() - parce que le compilateur ne comprend pas que vous vouliez dire la même fonction"

Ils ont raison sur la forme - mais si vous le vouliez, le compilateur pourrait (et devrait) être informé qu'il s'agit de la même fonction, car je répète que le nom du module au moment de la compilation est disponible (spécifié dans #import).

D'autant plus que si vous mettez d'abord : : à un endroit et compilez, puis supprimez et mettez : : à un autre - tout fonctionne, mais vous devez en convenir - c'est très gênant et après 10-15 permutations forcées de ce genre, je suis passé à #define

 
A100:

Arrêtons avec la réponse de ServiceDesk :

"Lors de la compilation de 1.mq5, à l'intérieur de la fonction B(), il n'est pas clair quelle fonction doit être appelée,

A() importé ou A() exporté - car le compilateur ne comprend pas qu'il s'agit de la même fonction".

Absolument, c'est comme ça.


Ils sont corrects dans la forme - mais le compilateur pourrait (et devrait) être informé qu'il s'agit de la même fonction si on le souhaite, car je répète que le nom du module est disponible au moment de la compilation (spécifié dans #import).

Pour de telles indications, il existe un opérateur de résolution de contexte ": :", mais il n'est pas applicable dans ce cas car le nom du module (fichier) est également le même.

Le conseil est adéquat - changez la structure du programme.

D'autant plus que si vous mettez d'abord : : et compilez à un endroit, puis enlevez et mettez : : à un autre, tout fonctionne, mais vous devez convenir que c'est très gênant...

Il vaut mieux éviter de telles astuces. Ce n'est pas seulement gênant, c'est aussi "racialement incorrect", "pas casher", "moche" et "sur la morve". Les tentatives de tromper le compilateur n'ont le droit d'exister que s'il n'y a pas d'autres options pour implémenter ce que vous voulez. Dans ce cas, il y en a beaucoup.


et après 10-15 permutations forcées de ce type, je suis passé à #define

Les définitions paramétrées ne sont utiles que lorsque la détection des types est indésirable ou lorsque les paramètres sont remplacés par des morceaux de texte "verbeux". En tant que substitut d'une fonction inline, une définition est sans aucun doute nuisible à la santé d'un programme.

--

Dans votre cas, je refuserais d'utiliser les bibliothèques .ex5, et tout fonctionnerait parfaitement. Leur seule utilité pratique est de cacher l'implémentation (lors de la vente), et je ne vois pas leur utilité dans les autres cas.

Vous écrivez pour vendre ?

 
MetaDriver:

Vous écrivez pour vendre ?

Pour moi-même.

Je ne peux pas le faire sans .ex5. J'ai aussi des fonctions comme F( string& [] ), mais elles ne rentrent pas dans les .dll :)

On pourrait peut-être les pousser à travers un séparateur, mais je n'ai pas encore essayé.

 
A100:
MQL5 n'a pas de fonctions en ligne (dans le formulaire) et j'utilise des macros paramétriques à la place, ce qui n'est pas tout à fait correct, car il n'y a pas de contrôle de type.

De plus, le compilateur n'optimise pas les expressions, ce qui entraîne une perte de vitesse supplémentaire. Vous feriez mieux de vérifier.

Au fait, à propos de l'inlining - ça marche. J'ai eu quelques problèmes avec le débogueur à cause de cela.

 
TheXpert:

Au fait, à propos de l'inlining, cela fonctionne. Il y a également eu des problèmes avec le débogueur à cause de cela.

Cela fonctionne donc au niveau du compilateur. J'ai donné un exemple ci-dessus - tout fonctionne grâce à un inexplicable "contournement du compilateur", alors que le travail direct nécessite des étapes supplémentaires, parfois importantes, parce que, comme vous l'avez suggéré, il est certainement possible de ne pas inclure la description et la mise en œuvre d'une seule et même fonction dans un fichier, mais alors 10 .mqh complets sont divisés en 100 .mqh plus petits.

Je n'ai pas encore couru après la vitesse. L'essentiel est la commodité et le fait que la quantité de code ne croisse pas de manière exponentielle.

J'ai même été confronté à la nécessité d'utiliser des analogues de #if #else dans MQL5 (c'est un peu délicat jusqu'à présent, mais ça marche ici et là).

 
A100:

Je ne cherche pas encore la vitesse. L'essentiel est la commodité et le fait que le volume de code ne croisse pas de manière exponentielle.

C'est vous qui décidez. Mais étant donné l'amour pathologique des méta-citations aux limitations, la probabilité que vous attrapiez un râteau ou deux avec de telles macros est loin d'être nulle.
 

A100:

Il ne fonctionne pas sans .ex5. J'ai aussi des fonctions comme F( string& [] ), mais elles ne rentrent pas dans .dll :)

....

Bon sang... :)

Je n'ai pas suggéré d'utiliser des DLL au lieu des bibliothèques .ex5, mais juste beaucoup de .mqh et un exécutable .mq5, rien de plus.

 
MetaDriver:

Juste des tas et des tas de .mqh et un exécutable .mq5, rien d'autre.

J'utilise un seul code sur 3 terminaux différents, ce qui signifie qu'il doit y avoir au moins un .ex5 (partagé par tous). Et si c'est le cas - alors on revient au problème décrit ci-dessus - il n'y a que 2 modules - mais ils ne compilent pas normalement.
 
ChartGetInteger( chart_ID, CHART_BRING_TO_TOP, 0, true )
ChartGetInteger( chart_ID, CHART_BRING_TO_TOP, true )
Il ne fonctionne pas en dehors des périodes de négociation. Qu'est-ce qui vous empêche de placer le calendrier au-dessus de tous les autres en dehors des heures de négociation ?
 
A100:
Ne fonctionne pas en dehors des périodes de négociation. Qu'est-ce qui vous gêne ?

Etes-vous sûr des paramètres ?

Les deux exemples sont faux :

ChartGetInteger( chart_ID, CHART_BRING_TO_TOP, 0, true )  - последний параметр должен быть long&, а не bool
ChartGetInteger( chart_ID, CHART_BRING_TO_TOP, true )     - последний параметр должен быть номер подокна, а не bool

On dirait qu'il y a confusion avec ChartSetInteger?