Erreurs, bugs, questions - page 2330

 
pavlick_:

Quoi qu'il en soit, si cela compte comme un bogue, en connaissant à peu près la cause, je peux le localiser, je suppose.

Nan, on ne peut pas l'attraper, il disparaît miraculeusement après avoir coupé le code. Même la mise en commentaire de certaines lignes (qui ne s'exécutent pas avant le crash) l'affecte.

 

Il y a une classe de code long, qui se trouve dans mqh. Nous devons créer exactement la même classe, qui ne diffère de la classe originale que sur deux lignes (au lieu de moins de signe, il devrait y avoir plus de signe).

Cela peut-il être fait sans créer une autre MQH presque identique ?


Lorsque le cours est court, vous pouvez facilement le faire avec une macro multi-lignes et tout sort facilement. Mais le code ici est long.

Je ne veux pas créer un mqh-clone car si je répare un mqh, je devrai répéter toutes mes actions dans le second. En outre, il y a le facteur humain de l'oubli et de l'inattention.


Vous pouvez toujours le faire avec une classe modèle. Mais il n'est pas du tout évident de savoir comment cela affectera la vitesse d'exécution. La classe est nécessaire pour les courses rapides.

 
fxsaber:
#ifdef
 
TheXpert:
#ifdef

Ça ne marchera pas. Les deux classes doivent être en service.

 
fxsaber:

Ça ne marchera pas. Les deux classes devraient être en service.

Je ne vois pas de problème.

_____________

héritage

mettre les différences dans des petites classes séparées

 
TheXpert:

Je ne vois pas de problème.

_____________

héritage

Mettre les différences dans des petites classes séparées

Il y a plusieurs méthodes de taille décente dans une classe. Dans chaque méthode, il suffit de remplacer le signe ">" par un signe "<".

Vous pouvez utiliser un virtuel comme celui-ci
class A
{
private:
  virtual bool Compare()
  {
    return(true);
  }
public:

  bool f()
  {
    return(this.Compare());
  }
};

class B : public A
{
private:
  virtual bool Compare()
  {
    return(false);
  }
};


void OnStart()
{
  A a;
  B b;
  
  Print(a.f());
  Print(b.f());
}


Mais, malheureusement, nous devons encore passer la valeur d'initialisation de la classe. Donc je suppose que nous devrons utiliser un modèle après tout.

 
fxsaber:

Je passerais certains adaptateurs via les paramètres des modèles (il ne devrait pas y avoir de freins à ce niveau), mais si vous voulez être aussi maladroit, vous pouvez aussi le faire. Faites un lien dur vers le fichier d'en-tête (mklink /H <link> <target>, si je ne me trompe pas. Vous pouvez chercher sur Google "windows create hard link"). Et ensuite activer ces éléments de la manière habituelle

#define _N C1    // имя класса
#define _M "c1"  // какой-то параметр
#include <qq.mqh>
#undef _N
#undef _M
#define _N C2
#define _M "c2"
#include <ee.mqh> // жёсткая ссылка на qq.mqh
#undef _N
#undef _M
 
pavlick_:

Je passerais certains adaptateurs via les paramètres des modèles (il ne devrait pas y avoir de freins à ce niveau), mais si vous voulez être aussi maladroit, vous pouvez aussi le faire. Faire un lien dur vers le fichier d'en-tête (mklink /H <link> <target>, si je ne me trompe pas. Vous pouvez chercher sur Google "windows create hard link"). Et ensuite, il suffit de le brancher de la manière habituelle.

Vous ne comprenez pas.

 
fxsaber:

Vous ne comprenez pas la question.

Je ne sais pas, vous êtes sûr de m'avoir compris ? Juste au cas où la liste est qq.mqh et ee.mqh (une seule entité, changer l'une change l'autre)

class _N
{
public:
   void f() {Alert(_M);}
};

Tous comme commandés, classe non inmacros, presque les mêmes sauf _M.

 
pavlick_:

Je ne sais pas, tu es sûr d'avoir compris ? Juste au cas où, en listant qq.mqh et ee.mqh (une seule entité, changer l'une change l'autre)

Tous comme commandés, classe non inmacros, presque les mêmes sauf _M.

Je suis entré dans votre méthode. C'est déjà au niveau du système d'exploitation que le même fichier a deux noms. Pourtant, il est censé être facile de transférer le code sur n'importe quelle machine. Faire mklink à chaque fois à cause de cela est une béquille.