Erreurs, bugs, questions - page 2092

 

Erreur d'exécution

typedef void (*fn)();
struct A {
        fn a;
};
struct B : A {
        void a() {}
};
void OnStart()
{
        B b;
        b.a(); //error: invalid function pointer call
}
typedef void (*fn)();
void g() {}
struct A {
        A() : a( g ) {}
        fn a;
};
struct B : A {
        void a() {}
};
void OnStart()
{
        B b;
        b.a(); //вместо B::a() вызывается g()
}
 

Erreur de compilation

typedef void (*fn)();
struct A {
        fn a;
};
struct B : A {
        void a( int ) {}
};
void OnStart()
{
        B b;
        b.a( 2 ); //error: '2' - wrong parameters count
}

 
Je ne me souviens pas de la nuance de la variable statique. Pouvez-vous me rappeler pourquoi ce bâtard fait ça ?
class A
{
public:
  A()
  {
    A::f();
  }
  
  static void f()
  {
    static bool Tmp = true;
    
    Print(Tmp);
  }
};

void OnStart()
{
  static A a; // static - false, иначе - true;
}
 

Forum sur le trading, les systèmes de trading automatisé et les tests de stratégies de trading

Bugs, bugs, questions

A100, 2017.12.19 23:04

Erreur lors de l'exécution

typedef void (*fn)();
struct A {
        fn a;
};
struct B : A {
        void a() {}
};
void OnStart()
{
        B b;
        b.a(); //error: invalid function pointer call
}
void g() {}
void OnStart()
{
        B b;
        b.a = g;
        b.a(); //вместо B::a() вызывается g()
}

Il semble que la raison soit compréhensible dans les deux cas - le champ et la méthode portent le même nom, donc la référence au champ et à la méthode est exactement la même. En conséquence, le compilateur appelle le champ au lieu de la méthode. Dans le premier cas, le champ n'est pas défini, c'est donc un échec. Dans le second cas, tout va bien - le champ est appelé.

Ainsi, si nous déclarons une méthode dans la base et un champ avec le même nom dans le descendant, cela fonctionnera dans une séquence différente.

Le compilateur devrait donner la sortie suivante

declaration of 'a' hides member declaration at line 3
 
fxsaber:

En conséquence, le compilateur appelle le champ, et non la méthode.

En quoi un champ est-il meilleur qu'une méthode ? Le C++, par exemple, appelle une méthode plutôt qu'un champ - c'est logique - car la méthode se trouve dans une classe dérivée, donc plus proche. En d'autres termes, si la signature de la classe dérivée convient parfaitement, pourquoi s'impliquer dans la classe de base ?

 
A100:

En quoi un champ est-il meilleur qu'une méthode ? Par exemple, le C++ appelle une méthode au lieu d'un champ, ce qui est logique car la méthode se trouve dans une classe dérivée, donc plus proche. En d'autres termes, si la signature d'une classe dérivée correspond parfaitement, pourquoi s'impliquer dans la classe de base ?

Vous vous rendez compte que vous avez créé une situation artificielle, qui devrait toujours être accompagnée d'un avertissement du compilateur.

Au sujet de "plus près", j'ai écrit

fxsaber:

si vous déclarez une méthode dans la base et un champ avec le même nom dans le descendant, cela fonctionnera dans une séquence différente.

 
fxsaber:
Je ne me souviens pas de la nuance avec les variables statiques. S'il vous plaît, rappelez-moi pourquoi ce bâtard génère cela ?

Tout le problème réside dans la séquence d'initialisation des variables et la séquence d'exécution du code.

Il est plus facile de comprendre en mode de débogage pas à pas que d'expliquer avec des mots.

 

Bug bizarre avec les emplois freelance.

il y avait 4 emplois en cours. j'en ai pris 1 qui est devenu 5. j'en ai passé un qui est resté 5.

J'ai pris un emploi, ça dit 5. J'ai pris un autre emploi, ça dit 6. J'ai pris un emploi, ça dit 4 emplois mais en cours de 6.

a pris un autre emploi avec 5 travaux en cours 7

maintenant je ne peux pas prendre de travail alors que je n'en ai que 5.

numéro de la demande

1913868

 
Aleksei Beliakov:

Bug bizarre avec les emplois freelance.

il y avait 4 travaux en cours. j'ai pris 1 travail est devenu 5. j'ai passé un travail est resté 5.

J'ai pris un travail de plus et il dit 5. J'ai pris un travail de plus et il dit 6. J'ai pris un travail de plus et il dit 4 travaux mais il dit 6 travaux en cours.

en a pris un autre avec 5 travaux mais "en cours" 7

maintenant je ne peux pas prendre de travail alors que je n'en ai que 5.

numéro de la demande

1913868

Merci pour le message, je travaille sur un correctif.

 

J'ai écrit quelques lignes il y a quelques temps, j'ai remarqué un oubli :

class Q{
public:
  typedef int it;
};
template <typename T>
class W {
public:
  typename T::it i;  // колдовал, колдовал, но без толку
};

ZS : non, le schéma était un peu différent là-bas :

template <typename T>
class Q{
public:
  typedef T Tt;
};
template <typename T>
class W
{
public:
  typename T::Tt i;
};

W<Q<int>> w;