| |
Miembro registrado 1.395 mensajes |
|
| Publicado el 29,octubre 2019 - 15:29 |
Bonjour, est-ce qu'un programmeur expérimenté pourrait me confirmer que je ne divague pas... je m'explique, je roule mon appli en mode débug étape par étape et à ma grande surprise, l'une de mes variables Date m'indique une valeur avant même qu'elle ne soit initialisée;

ce qui me cause bien des soucis de compréhension. Je pense que ma variable reste en mémoire mais je ne sais pas comment corriger.
Merci de me donner des pistes  note: Le code de l'image est le code du projet au tout début.
-- Jean Turcotte WX 24 Android 8.0 sur Galaxy S8 Laptop Lenovo I7 12GB Ram |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 310 mensajes |
|
| Publicado el 29,octubre 2019 - 15:40 |
Bonjour, C'est un comportement normal (pour windev en tout cas) : la valeur par defaut d'une date est la date systeme...
Bon dev.Mensaje modificado, 29,octubre 2019 - 15:41 |
| |
| |
| | | |
|
| | |
| |
| Publicado el 29,octubre 2019 - 15:41 |
Bonjour, Les variables Date sont automatiquement initialisée à la date du jour (équivalent à DateSys()), de même que les DateHeure (Datesys()+HeureSys() et les Heures (HeureSys()). Pour ne pas avoir de problème, je fais la création de la variable : dDate est une date="" |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 1.395 mensajes |
|
| Publicado el 29,octubre 2019 - 17:55 |
Merci pour l'info, je croyais toutefois que la variable prendrait la valeur après son initialisation et non pas avant.
Bonne journée!
-- Jean Turcotte WX 24 Android 8.0 sur Galaxy S8 Laptop Lenovo I7 12GB Ram |
| |
| |
| | | |
|
| | |
| |
| Publicado el 30,octubre 2019 - 10:20 |
Bonjour
En complément d'information, ce comportement existe non seulement pour les dates mais également pour les heures. Si vous voulez d'autres valeurs par défaut pour ces types de variables, vous avez la fonction DateHeureParDéfaut. Cela évite de devoir mettre des = "" après chaque déclaration de variable. https://doc.pcsoft.fr/fr-FR/?3027015
Rem. : Je ne comprends par ce que vous entendez par "avant son initialisation". Par définition, la déclaration d'une variable consiste en la réservation d'un espace mémoire ET à l'initialisation de cet espace avec une valeur par défaut.
Cela peut sembler normal qu'en déclarant un entier celui-ci soit à 0, mais informatiquement parlant on a bien une réservation d'espace mémoire et une initialisation à 0. Sans cela la variable pourrait contenir n'importe quoi.
Ici pour les dates/heures PCSoft à fait le choix de les initialiser avec la date et l'heure système probablement car le plus souvent on se retrouve à les remplir directement avec la date et l'heure système. Cela nous évite donc de le faire. Il faut juste le savoir.
Bon dev.
Laurent M. |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 1.395 mensajes |
|
| Publicado el 30,octubre 2019 - 16:44 |
Bonjour Laurent, si tu regardes bien mon image, tu verras que mon curseur PAS A PAS est situé à la ligne 3 du code alors que Windev m'indique la valeur de date de la variable définie à une ligne plus basse qui ne doit pas encore avoir été traitée.
-- Jean Turcotte WX 24 Android 8.0 sur Galaxy S8 Laptop Lenovo I7 12GB Ram |
| |
| |
| | | |
|
| | |
| |
| Publicado el 31,octubre 2019 - 08:39 |
Bonjour
Ok, je n'avais pas regardé ta capture d'écran. Après test je constate la même chose. Il semble que cela soit une particularité du code d'initialisation tant du projet que des fenêtres. On dirait que WinDev a déjà fait toutes les allocations de variable globale avant de rentrer dans le code où elles sont déclarées. Bizarre mais pas spécialement gênant.
Bon dev.
Laurent M. |
| |
| |
| | | |
|
| | |
| |
| Publicado el 31,octubre 2019 - 08:56 |
Petit complément.
J'ai testé le code suivant dans le code d'initialisation d'un projet :
dDate est une Date DateHeureParDéfaut("","") dDate2 est une Date Ce que l'on constate, c'est que si l'on s'arrête sur la première ligne, les 2 dates existent et contiennent la date système. On pourrait donc croire que la définition de la date par défaut ne sera pas prise en compte pour dDate2 puisqu'elle existe déjà. Hors après passage sur la déclaration de dDate2, on constate bien qu'elle a été vidée.
La question subsidiaire est : Est-ce que dDate2 à été simplement réinitialisée ou a-t-elle été à nouveau déclarée? Et donc, il y a-t-il un problème de gestion mémoire (allocation d'un espace jamais utilisé et donc peut-être jamais libéré). En regardant les adresses des variables on remarque que celles-ci ne changent pas. Ouf -> pas de problème de gestion mémoire.
Bon dev.
Laurent M. |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 4.361 mensajes |
|
| Publicado el 31,octubre 2019 - 09:18 |
Ce n'est pas une particularité de Windev, c'est une particularité du débugger, il y a une précompilation avant le mode pas à pas. Cela permet entre autre la visualisation des variables et l'horreur qui consiste à déclarer une variable en plein milieu du code
-- Il y a peut être plus simple, mais, ça tourne |
| |
| |
| | | |
|
| | |
| |
| Publicado el 31,octubre 2019 - 09:58 |
Je n'ai pas parlé d'une particularité de WinDev mais bien du code d'initialisation. (Cela fait tellement longtemps que je n'utilise plus aucun autre compilateur que je ne me rappelle plus comment cela se passe dans d'autres outils de développement. Ce comportement est peu-être le même dans ces autres compilateurs) Les variables déclarées dans les procédures ou dans les champs son bien allouées lors de l’exécution du code et pas à l'avance comme on le constate ici.
Le débugger n'a rien a voir là dedans non plus. Ce n'est pas lui qui compile ou exécute le code. Il ne fait que montrer où l'on est dans l'exécution. (du moins il essaie. J'ai déjà eu des bizarreries où le code affiché n'était pas le code exécuté. Mais c'est une autre histoire)
Pour moi c'est plus une question d'optimisation de l'exécution du code. Il est plus efficace d'allouer en une fois l'espace mémoire nécessaire à la fenêtre et à ses variables globales que d'allouer chaque espace individuellement.
Quant à l'horreur de déclarer une variable à l'intérieur du code, c'est à relativiser. Certes il est conseillé de faire toutes ses déclarations au début du bloc de code par soucis de clarté, mais il peut être utile par souci d'optimisation de déclarer certaines variables en cours d'exécution. Il ne sert à rien de perdre du temps d'exécution ou de l'espace mémoire à déclarer des variables qui ne seront finalement pas utilisées par la suite. On peut résoudre cela en décomposant le code en fonctions mais cela n'est pas toujours nécessaire. Surtout si ce code n'a pas vocation à être réutilisé à plusieurs endroits. (On peut maintenant utiliser les procédures interne dans ce cas)
Bon dev.
Laurent Mersch |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 1.395 mensajes |
|
| Publicado el 31,octubre 2019 - 12:34 |
J'aurais 2 autres questions pour mieux comprendre;
1- Comment faire pour voir les adresses des variables? 2- Y a t-il façon de libérer les variable initialisées pour libérer l'espace mémoire?
Merci !
-- Jean Turcotte WX 24 Android 8.0 sur Galaxy S8 Laptop Lenovo I7 12GB Ram |
| |
| |
| | | |
|
| | |
| |
| Publicado el 31,octubre 2019 - 13:58 |
Pour l'adresse des variables il suffit de mettre un & devant leur nom. https://doc.pcsoft.fr/fr-FR/?1512002
Quant à la libération de mémoire, il n'y a pas à ma connaissance de fonctions/commandes WLangage pour le faire. (La commande 'Libérer' ne concerne que les variables allouées dynamiquement) Normalement, en fonction de la portée de la variable, celle-ci est automatiquement libérée à la fin du traitement concerné. Toutefois des cas de fuite mémoire ont été discutés sur ce forum et du code pour forcer le vidage mémoire à été donné à cette occasion. https://forum.pcsoft.fr/fr-FR/pcsoft.fr.windev/124879-wd15-liberer-memoire-application/read.awp Fait une recherche sur le forum et tu devrais retrouver d'autres sujets s'y rapportant.
Bon dev.
Laurent Mersch |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 1.395 mensajes |
|
| Publicado el 31,octubre 2019 - 15:13 |
Très intéressant, merci ! 
-- Jean Turcotte WX 24 Android 8.0 sur Galaxy S8 Laptop Lenovo I7 12GB Ram |
| |
| |
| | | |
|
| | |