Erreurs, bugs, questions - page 2721

 
fxsaber:

const est un contrôle supplémentaire. Sinon, nous aurions pu éviter d'introduire cette directive dans la langue.


Un champ public const est bon dans la mesure où il peut être lu (il peut être transmis par référence). Mais il est exclu de le modifier par erreur.


const m'aide beaucoup lors de l'écriture de programmes. C'est la première fois qu'un problème se pose.


HH Il est également utile d'utiliser this et : : là où ils ne peuvent pas être écrits.

Rendez la variable privée. Utilisez une fonction pour la lecture. Il n'est pas nécessaire de passer const int par référence.

 
Koldun Zloy:

Rendez la variable privée. Utilisez une fonction pour le lire. Il n'est pas nécessaire de passer const int par référence.

Vous proposez d'ignorer tout simplement la constance.

 
fxsaber:

Vous suggérez que la constance est simplement ignorée.

Non. Mais ce n'est pas nécessaire dans ce cas particulier.

 
Mec, tu inventes un problème à partir de rien."Les souris pleuraient et pleuraient mais continuaient à mordre le cactus".
 
fxsaber:

J'ai fait des expériences, mais en général, toute solution sera "imparfaite", quelle que soit la façon dont on la regarde.

Si nous parlons de vitesse d'exécution et de contrôle de l'accès au champ de la structure, vous pouvez écrire une solution hideuse, mais elle résoudra le problème.

J'abandonnerais complètement les méthodes statiques dans la structure - elles n'ont aucun sens, le code sera toujours confus et non logique.

ça ressemble à ça :

int tmp[] = {1,2,3,99};
struct A
{
private:
   static int count;
public:
   const int a;
   A():a(tmp[count++]) {}
};
static int A::count = 0;
//+------------------------------------------------------------------+
void OnStart()
{
   A a[ArraySize(tmp)];
   for(int i=0;i<ArraySize(a);i++) Print(a[i].a);
}


....da et le compteur de comptage n'est pas non plus nécessaire, vous devez, en fait, envelopper A[ArraySize(tmp)] ; dans une substitution de macro qui créera un tableau de structures et supprimera un tableau temporaire tmp

 

Il y a deux programmes qui travaillent sur le même fichier en même temps. Celui qui écrit utilise les drapeauxFILE_READ|FILE_WRITE|FILE_BIN|FILE_SHARE_READ. Celui qui lit - FILE_READ|FILE_BIN|FILE_SHARE_WRITE|FILE_SHARE_READ. Bien que le premier programme enregistre périodiquement le fichier à l'aide de FileFlush, le second programme ne voit la longueur du fichier que lorsqu'il est ouvert. J'ai essayé de faire FileSeek dans les deux sens - ça n'aide pas.

Question : comment faire pour que le programme qui lit le fichier récupère les données à écraser ?

 

Je vais résumer :

struct A {
    const int a; 
    A() {}
};
void OnStart()
{
            A a1; //(1) нормально
    const int a2; //(2) Error: 'a2' - 'const' variable must be initialized
}

Quelle est la différence entre 1 et 2 ?

 
A100:

Je vais résumer :

Quelle est la différence entre 1 et 2 ?

J'espérais qu'il y avait un mécanisme intégré pour initialiser ce cas, mais il n'y a rien.

struct A {
    const int a[10]; 
    A() {ArrayPrint(a);} //-396985669       32758 -1490812928       32757  2147360768           0 -1681390008         493           0           0

};
//+------------------------------------------------------------------+
void OnStart()
{
  A a1;
}
//+------------------------------------------------------------------+

ZS : c'est là que le compilateur voit

void f()
{
   const int x;  //'x' - 'const' variable must be initialized
}
 
Igor Makanu:

J'avais espéré qu'il y avait un mécanisme intégré pour initialiser ce cas, mais il n'y a rien.

ZS : ici le compilateur voit

En principe, un tel cas ne devrait pas exister - le problème devrait déjà être résolu au niveau du compilateur (comme en C++). Et là, c'est un peu possible et, par conséquent, une discussion de plusieurs pages.

 
A100:

En principe, ce cas de figure ne devrait pas exister - le problème aurait dû être résolu au niveau du compilateur (comme en C++). Et dans ce cas, c'est possible et en conséquence, la discussion sur plusieurs pages

Définitivement un bug... Mais ça doit l'être ! )))

imho, les expressions constantes doivent être connues au moment de la compilation et les expressions statiques doivent être connues lors de l'initialisation de l'application dans la séquence de description.

et ce schéma dans MQL, où il y a une sorte de contrôle des constantes, mais je peux assigner des constantes moi-même au moment de l'exécution, et je peux utiliser un appel de fonction comme initialisation, comme ceci

struct A
{
   const double a;
   A():a(AccountInfoDouble(ACCOUNT_BALANCE))
   {
      Print("a = ", a); // a = 9999.290000000001
   }
};
//+------------------------------------------------------------------+
void OnStart()
{
   A a1;
}
//+------------------------------------------------------------------+

et cette "constante" peut être en visibilité locale.... à quel moment cela devient-il une expression constante et comment cela aide-t-il ? .... je ne sais pas, je ne le comprends pas sans manuel, il n'y a pas de description du modèle de mémoire - cela ne sert à rien, enfin, tout au plus, utiliser comme il se doit - initialiser avec une constante dans tous les constructeurs, alors le compilateur aidera à prévenir si vous décidez accidentellement de modifier ce champ dans le futur

Raison: