|
Variables STATIC comment faire ? |
Débuté par Patrice Terrier, 19 mai 2009 11:03 - 12 réponses |
| |
| | | |
|
| |
Posté le 19 mai 2009 - 11:03 |
J'aimerai pouvoir utiliser des variables STATIC dans une procédure, afin qu'elles gardent leur valeur d'un appel à l'autre sans passer par des variables gobales.
Y-a-t'il un moyen simple, ou suis-je obliger de passer par une zone mémoire ?
... |
| |
| |
| | | |
|
| | |
| |
Posté le 19 mai 2009 - 11:43 |
Salut,
Passer par une classe utilitaire ? en déclarant des membres globaux ?
@+ Maax°(51)° |
| |
| |
| | | |
|
| | |
| |
Posté le 19 mai 2009 - 12:44 |
Hello,
regardes du côté du Passage de paramètres par valeur dans l'aide.
Comme cela t'a variable ne sera pas modifiée à chaque appel.
exemple:
toto est un entier toto=10
P_2((toto)) P_1((toto))
Info(toto)
Bon dév.
Samuel
Patrice Terrier a écrit dans le message de news <a9c7c087adb560bbcebb5d79b3b244cc@news.pcsoft> :
J'aimerai pouvoir utiliser des variables STATIC dans une procédure, afin qu'elles gardent leur valeur d'un appel à l'autre sans passer par des variables gobales.
Y-a-t'il un moyen simple, ou suis-je obliger de passer par une zone mémoire ?
...
|
| |
| |
| | | |
|
| | |
| |
Posté le 19 mai 2009 - 13:00 |
Bonjour, Le fait de passer une variable par valeur et non par adresse garantie que celle-ci ne sera pas modifiée par la procédure, ce qui n'a rien à voir avec une variable statique. Une variable statique "survie" entre chaque appel d'une procédure, mais elle n'est pas accessible à l'extérieur de la procédure, et cette dernière peut en changer la valeur.
Frédéric. "samuel" <samuel.lorentz@o-i.ch> a écrit dans le message de news:922bbdf72c45de06f255cd9ef44995c3@news.pcsoft...
Hello, regardes du côté du Passage de paramètres par valeur dans l'aide. Comme cela t'a variable ne sera pas modifiée à chaque appel. exemple: toto est un entier toto
P_2((toto)) P_1((toto))
Info(toto) Bon dév. Samuel Patrice Terrier a écrit dans le message de news <a9c7c087adb560bbcebb5d79b3b244cc@news.pcsoft> :
J'aimerai pouvoir utiliser des variables STATIC dans une procédure, afin qu'elles gardent leur valeur d'un appel à l'autre sans passer par des variables gobales.
Y-a-t'il un moyen simple, ou suis-je obliger de passer par une zone
mémoire ?
|
| |
| |
| | | |
|
| | |
| |
Posté le 19 mai 2009 - 13:24 |
Jusque là les réponses proposées ne correspondent pas à ma demande.
Pour info une variable STATIC à l'intérieur d'une procédure ou d'une fonction conserve les valeurs qui lui sont affectées tout au long du fonctionnement du programme, exemple :
FUNCTION IterationCompteur () MyVariableStatic est un entier += 1 RETURN MyVariableStatic |
| |
| |
| | | |
|
| | |
| |
Posté le 19 mai 2009 - 13:25 |
Frédéric,
Oui, c'est exactement la définition d'une variable STATIC, et c'est très utile en programmation !
Actuellement j'utilise une listbox cachée avec un pointeur 32-bit associé, pour sauver/retrouve mes variables statiques, mais c'est du bricolage. |
| |
| |
| | | |
|
| | |
| |
Posté le 19 mai 2009 - 13:42 |
Dommage dans la declaration des collections de procédures globales "PRIVE" n'a aucun effet...
Créer une classe utilitaire en effet, avec une méthode à la place de ta procédure qui utilise des membres PRIVE ( pas besoin de GLOBAL si elle n'est instanciée qu'une seule fois dans le code du projet ), mais ils seront visibles également par les autres méthodes si il y en a....
C'est plus "propre" qu'une zone mémoire à mon sens... |
| |
| |
| | | |
|
| | |
| |
Posté le 19 mai 2009 - 13:44 |
Hello, tu as entièrement raison. Mais cela ne résout par le problème des STATIC et WINDEV.
Mea-culpa, le sens de ma réponse était : Il est mieux d'utiliser le passage de variable par par adresse ou valeur au lieu de déclarer des globales. En effet, le problème vient que toutes les procédures de la collection peuvent utiliser ces variables.
En espérant qu'il y a aura bientôt ce type à disposition dans les futurs versions.
Bon dév à tous
Frédéric DEMILLY a écrit dans le message de news <4a1273a1@news.pcsoft.fr> :
Bonjour, Le fait de passer une variable par valeur et non par adresse garantie que celle-ci ne sera pas modifiée par la procédure, ce qui n'a rien à voir avec une variable statique. Une variable statique "survie" entre chaque appel d'une procédure, mais elle n'est pas accessible à l'extérieur de la procédure, et cette dernière peut en changer la valeur. Frédéric. "samuel" <samuel.lorentz@o-i.ch> a écrit dans le message de news:922bbdf72c45de06f255cd9ef44995c3@news.pcsoft... Hello, regardes du côté du Passage de paramètres par valeur dans l'aide. Comme cela t'a variable ne sera pas modifiée à chaque appel. exemple: toto est un entier toto
P_2((toto)) P_1((toto))
Info(toto) Bon dév. Samuel Patrice Terrier a écrit dans le message de news <a9c7c087adb560bbcebb5d79b3b244cc@news.pcsoft> : J'aimerai pouvoir utiliser des variables STATIC dans une procédure, afin qu'elles gardent leur valeur d'un appel à l'autre sans passer par des variables gobales. Y-a-t'il un moyen simple, ou suis-je obliger de passer par une zone mémoire ?
|
| |
| |
| | | |
|
| | |
| |
Posté le 19 mai 2009 - 14:13 |
Il n'y a pas d'équivalent en windev aux variables static d'une fonction en C.
A toi de trouver une alternative
eric l.
> Patrice Terrier a écrit :
Jusque là les réponses proposées ne correspondent pas à ma demande.
Pour info une variable STATIC à l'intérieur d'une procédure ou d'une fonction conserve les valeurs qui lui sont affectées tout au long du fonctionnement du programme, exemple :
FUNCTION IterationCompteur () MyVariableStatic est un entier += 1 RETURN MyVariableStatic
|
| |
| |
| | | |
|
| | |
| |
Posté le 19 mai 2009 - 20:04 |
Il y a une solution que j'utilise, et qui est toute simple, j'utilise de champs de saisie invisibles en cochant memoriser la valeur. Ensuite il suffit de les affecter une premiere fois sans meme les declarer puisque ce sont des champs.
numerique SI champ1 = 0 CHAMP1 = valeur FIN caracteres SI taille(sansespace(champ2)) = 0 CHAMP2 = "VALEUR" FIN etc.. |
| |
| |
| | | |
|
| | |
| |
Posté le 19 mai 2009 - 20:05 |
Une petite precision... Si la variable doit faire partie d'une procedure ou fonction, met tes champs dans la premiere fenetre du projet. |
| |
| |
| | | |
|
| | |
| |
Posté le 19 mai 2009 - 20:38 |
Avec cette méthode, la valeur est mémorisée entre deux lancements de L'APPLICATION, et sa portée est globale. Avec une variable statique, une valeur est mémorisée entre chaque appel d'une PROCEDURE, et sa portée est limitée à la procédure en question. Donc ce n'est pas la même chose.
La seule solution "de fortune" est d'utiliser une classe avec des membres privés, et des méthodes qui remplacent les procédures nécessitant des variables statiques.
Frédéric. "HADDAD" <mirohaddad@gmail.com> a écrit dans le message de news:13f5e6d5b9c8ff6043cf1c3edaa9f7d0@news.pcsoft...
Il y a une solution que j'utilise, et qui est toute simple, j'utilise de
champs de saisie invisibles en cochant memoriser la valeur. > Ensuite il suffit de les affecter une premiere fois sans meme les declarer puisque ce sont des champs.
numerique SI champ1 = 0 CHAMP1 = valeur FIN caracteres SI taille(sansespace(champ2)) = 0 CHAMP2 = "VALEUR" FIN etc..
|
| |
| |
| | | |
|
| | |
| |
Posté le 22 mai 2009 - 09:46 |
Bon,
Puisqu'il n'existe pas de solution pour gérer les variables STATIC en WLangage, j'ai bricolé une solution basée sur l'utilisation de l'API bas niveau qui permet d'associer un entier (32-bit) à une LISTBOX virtuelle.
Note : on peut quand même utiliser des valeurs décimales à condition de multiplier par 100 au moment de l'affectation, puis par 0.01 lorsqu'on relit la valeur à convertir à nouveau en décimal.
Il est également possible de stocker directement un réel sur 4-octets à condition d'utiliser la fonction TRANSFER(t) qui permet de copier d'une adresse mémoire à une autre.
Le code est composé d'une procédure (pour sauver la variable STATIC) et d'une fonction pour la récupérer.
Procedure SetStaticValue(LOCAL sUseString is string, LOCAL nValue is int) sUseString += "|" nhMain is int = Handle(MyWindow..Name) nStaticHandle is int = GetDlgItem(nhMain, ID_STATIC) IF nStaticHandle = 0 THEN nStaticHandle = API("USER32", "CreateWindowExA", 0, "LISTBOX", "", WS_CHILD | LBS_HASSTRINGS, 0, 0, 0, 0, nhMain, ID_STATIC, Instance, 0) END IF nStaticHandle THEN nIndex is int = SendMessage(nStaticHandle, 399, -1, &sUseString) IF nIndex > -1 THEN SendMessage(nStaticHandle, 410, nIndex, nValue) ELSE SendMessage(nStaticHandle, 410, SendMessage(nStaticHandle, 384, 0, &sUseString), nValue) END END
FUNCTION GetStaticValue(LOCAL sUseString is string) sUseString += "|" nValue is int = 0 nhMain is int = Handle(MyWindow..Name) nStaticHandle is int = GetDlgItem(nhMain, ID_STATIC) IF nStaticHandle THEN nIndex is int = SendMessage(nStaticHandle, 399, -1, &sUseString) IF nIndex > -1 THEN nValue = SendMessage(nStaticHandle, 409, nIndex, 0) END END RESULT nValue
Utilisation pour sauver une variable STATIC ------------------------------------------ nStaticValue is int = 99 SetStaticValue("nStaticValue", nStaticValue)
Utilisation pour retrouver une variable STATIC --------------------------------------------- nStaticValue is int = GetStaticValue("nStaticValue")
Note : au besoin on peut convetir la chaine en majuscule si on veut pas tenir compte de la casse des lettres.
...
Patrice Terrier www.zapsolution.com |
| |
| |
| | | |
|
| | | | |
| | |
|