Erreurs, bugs, questions - page 2860

 
fxsaber:
Est-ce un comportement correct du compilateur ? Il semble que A::i ne soit pas créé au moment de l'appel de la méthode A::f() appelant A::i.

Qu'entend-on par "créé" ?

static est juste un moyen de créer un râteau pour cacher une variable globale ou une fonction, limitant la visibilité d'une fonction ou d'une classe

. La mémoire d'une variable globale existe toujours.
Et oui, pour les variables globales l'ordre d'initialisation est très important (je veux dire, éviter d'accéder à la variable avant qu'elle ne soit initialisée)
Cet exemple a fonctionné...

Документация по MQL5: Основы языка / Переменные / Создание и уничтожение объектов
Документация по MQL5: Основы языка / Переменные / Создание и уничтожение объектов
  • www.mql5.com
После загрузки на исполнение mql5-программы каждой переменной выделяется память в соответствие с типом переменной. Переменные делятся на два типа по уровню доступа - глобальные переменные и локальные переменные, и по классам памяти: входные параметры mql5-программы, статические и автоматические. Каждая переменная при необходимости...
 
Ilyas:

Dans l'exemple ci-dessus, cela a fonctionné...

Allez-vous changer le compilateur à ce stade ? Personnellement, j'aimerais garder le système tel qu'il est.

 
fxsaber:

Allez-vous changer le compilateur à ce stade ? Personnellement, j'aimerais que tout reste en l'état.

Nous n'avons pas l'intention de modifier le comportement.

Mais il existe une tâche différée de détection des erreurs d'accès aux variables globales (avant l'initialisation).
Si nous implémentons cette fonctionnalité, nous obtiendrons un avertissement lors de la compilation du code ci-dessus : la fonction A::f() est utilisée pour initialiser A::i, ce qui donne accès à la variable A::i en cours d'initialisation.

Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Глобальные переменные создаются путем размещения их объявлений вне описания какой-либо функции. Глобальные переменные определяются на том же уровне, что и функции, т. е. не локальны ни в каком блоке. Область видимости глобальных переменных - вся программа, глобальные переменные доступны из всех функций, определенных в программе...
 
Ilyas:

Si nous implémentons cette fonctionnalité, vous obtiendrez un message d'avertissement lors de la compilation du code ci-dessus : la fonction A::f() est utilisée pour initialiser A::i, qui accède à la variable A::i en cours d'initialisation.

Merci !

 
Ilyas:

Nous ne prévoyons pas de changer le comportement

Ensuite, cela contredit votre concept selon lequel une variable est considérée comme déclarée lorsque la déclaration est complète. Pourquoi l'avez-vous inventé en premier lieu ? Si c'est comme ça dans un cas et différent dans un autre.

int i = i; //Error: 'i' - undeclared identifier
Une bonne langue a des règles uniformes, et non l'inverse.
 
A100:

Ensuite, cela contredit votre propre concept selon lequel une variable est considérée comme déclarée lorsque la déclaration est complète. Pourquoi l'avez-vous inventé en premier lieu ? S'il en est ainsi dans un cas et différent dans un autre...

Une bonne langue a des règles uniformes, et non l'inverse.

Je suis un ignorant total, mais je n'y aurais pas pensé (int i = i) même si j'avais trop bu........ 8(

 
Сергей Таболин:

Je suis un ignorant total, mais je n'aurais pas pensé à ceci (int i = i) même si j'avais trop bu........ 8(

Et quelle est la principale différence par rapport à l'exemple original? Supprimez les choses inutiles et vous l'obtiendrez :

int i = i = 123; //Error: 'i' - undeclared identifier

Seulement, il y a beaucoup de cordes là-bas, et une seule ici.

S'il n'y a pas d'erreur de compilation, il ne devrait pas y en avoir une ici aussi (et vice versa), sinon c'est le bordel.

 
A100:

Ensuite, cela contredit votre propre concept selon lequel une variable est considérée comme déclarée lorsque la déclaration est complète. Pourquoi l'avez-vous inventé en premier lieu ? S'il en est ainsi dans un cas et différent dans un autre...

Une bonne langue a des règles uniformes, et non l'inverse.
Dans ce cas, c'est bon.

Le fait est que vous pouvez obtenir un comportement indéfini dans d'autres conditions, plus délicates. Les self-shots en C++ sont implémentables.
 
A100:

Quelle est la différence fondamentale par rapport à l'exemple original? Enlevez les trucs en trop et vous l'avez :

Seulement, il y a beaucoup de cordes là-bas, et une seule ici.

S'il n'y a pas d'erreur de compilation, il ne devrait pas y en avoir ici aussi (et vice versa), sinon c'est le bazar.

Vous avez tort, ce n'est pas la même chose.

La description d'une variable statique dans une classe est sa prédéfinition (similaire à la prédéfinition d'une fonction ou d'une classe), mais l'emplacement, en fait, indique simplement au compilateur où la variable sera stockée en mémoire et quand elle doit être initialisée.

 
Ilyas:

Vous avez tort, ce n'est pas la même chose.

La description d'une variable statique dans une classe est sa prédéfinition (similaire à la prédéfinition d'une fonction ou d'une classe), mais le placement indique essentiellement au compilateur où la variable sera stockée en mémoire et quand elle doit être initialisée.

Alors pourquoi l'erreur (2) est ici, si i est déjà pré-déclaré plus tôt (1) ?

class A {
public: 
        static int i; //(1)
};
int A::i = i = 123;   //(2) Error: unresolved static variable 'A::i'