Aide - Recherche - Membres - Calendrier
Version complète : Variables globales
Les Forums de PalmAttitude.org > GENERAL PalmOS > Développement sous PalmOS
lu1u
J'ai un bout de code qui ressemble à ceci ( Palm Os Developper Suite):

// Variables globales
UInt32 LargeurEcran ;
UInt32 HauteurEcran ;

void InitUnTruc()
{
UInt32 Hauteur ;
UInt32 Largeur ;

WinScreenGetAttribute( winScreenHeight, &Hauteur ) ;
WinScreenGetAttribute( winScreenWidth, &Largeur ) ;
// Hauteur = 480, Largeur = 320, vérifié au debugger
HauteurEcran = Hauteur ;
LargeurEcran = Largeur ;
// HauteurEcran = n'importe quoi, LargeurEcran = n'importe quoi
}


quelcon.gif J'compron pô!!!
Je déroule au débugger, Hauteur=480 l'instruction précédente, je la recopie dans une autre variable, et cette nouvelle variable vaut autre chose.

=> Je venais juste d'ajouter 2 doubles dans mes variables globales, je me suis donc dis que je dépassait la taille d'un segment. J'ai donc diminué la taille de certains tableaux, rien n'y a fait.
(J'ai juste rajouté les variables locales Hauteur et Largeur après constatation du bug ).

Quelqu'un a une idée ?
snark
InitUnTruc est appelé dans un lancement normal de l'application ou via un autre démarrage (lors d'une alarme, d'un find, d'un beam, ...)?
lu1u
Lancement normal (sysAppLaunchCmdNormalLaunch).
Je viens de vérifier, ça ne change rien si je ne passe pas par les variables locales.

LargeurEcran persiste à valoir 389
et
HauteurEcran = 402

Je doute m'...
Khertan
Tu est sur que LargeurEcran et HauteurEcran ne sont pas des constantes, ou autre chose defini dans des .h ...

(normalement le compilo devrait raller si c etait le cas bon, c est on jamais.)

Essaye avec un autre nom ... comme MyLEcran et MyHEcran ... sait on jamais.
Fredouille.95
Pour les variables globales, je crois que la valeur indiqué correspond à l'offset à partir du pointeur de variables globales.
Donc, plutôt une adresse qu'une valeur.
Patrice
Fredouille, j'ai peur que tu mélanges un peu les pointeurs et les valeurs anim_wink.gif
Fredouille.95
Ben, malheureusement, je ne suis pas si sûr sourire.gif

Sous PODS, le DEBUG est un peu lourd.
Et pour visualiser le contenu d'une variable globale, faut d'abord obtenir l'adresse du pointeur principal puis y ajouter l'offset que l'on lit en passant le curseur sur la variable dans la fenêtre du code.
Et là, bingo, la valeur est bonne !!

Edit : Je prépare une manip avec mon projet actuel...
Fredouille.95
Voilà ma manip sous PODS avec la perspective "Debug".

J'ai une variable globale dont j'alloue dynamiquement de la mémoire, du style:

FDC = (t_FDC*)MemPtrNew(sizeof(t_FDC));

Lorsque le curseur survole FDC, j'obtiens "420".
420 n'est pas la valeur mais un offset.

Pour obtenir la valeur, sans créer de variable locales dans laquelle on copie la valeur et qui est correctement affichée sous PODS, il suffit de récupèrer l'adresse du pointeur des variables globales.

Pour ce faire, il est accessible dans l'onglet "Debug", en haut à gauche de l'écran, en sélectionnant le premier appelant de l'application, dans mon cas, il s'agit de "1 Start()".

En le sélectionnant, on peut visualiser ses variables globales, dans l'onglet "Variables" en haut à droite, dont une qui s'appelle : void* GlobalsPtr et qui vaut dans mon cas 0xf033a0.

Maintenant, il suffit d'aller dans l'onglet "Memory" puis d'entrer comme adresse : "0xf033a0 + 420" et on peut lire le contenu de la variable globale. Dans mon cas, le lis les octets 00 ff cb d8 qui correspond au contenu de ma variable globale.

Bref, c'est compliqué...

Edit : J'utilise le simulateur pour Garnet.
Patrice
Le cas que tu cites n'a rien à voir : si tu affiches la valeur d'une variable de type "pointeur", il est normal que tu obtiennes une addresse. En revanche une variable globale de type "entier" contient un entier... siffle.gif
Khertan
Il est tordu votre debuggeur ... pfff
lu1u
Mes 2 variables ne sont pas des pointeurs, mais des UInt32...
Fredouille.95
Bon d'accord, mauvais example...
Mais je persiste sleep.gif

Donc, je prends une variable de ce type:

tULong dwMF2Flags = 0; avec typedef unsigned long tULong;

Dans une fonction, j'ai la ligne suivante sur laquelle je place un point d'arrêt.

dwMF2Flags = 1;

Au point d'arrêt, on survolant la variable avec le curseur, j'obtient "360".
En mémoire : à l'adresse GlobalsPtr+360, j'obtient 00 00 00 00

Maintenant, j'exécute la ligne.

En survolant la variable avec le curseur, j'obtient "360".
En mémoire : à l'adresse GlobalsPtr+360, j'ai maintenant 00 00 00 01
aldweb
CITATION(Khertan @ 21/02/2006 à 16:24 ) *
Il est tordu votre debuggeur ... pfff


Je dirais même plus, [quote Khertan] siffle.gif
lu1u
Fredouille,
il semble que tu n'as pas entièrement tort icon_biggrin.gif

Les valeurs affichées par mon débugger étant toujours 398 et 402 ( pour 2 UInt32 consécutifs, ça ne vous dit rien ? ). blink.gif

=> Le programme fonctionne quand même, même si les valeurs indiquées par le débugger ressemblent plutot aux adresses. quelcon.gif

=> Il va falloir que je me méfie wink.gif

=> De toutes façons, je n'ai jamais aimé les variables globales anim_grin.gif

=> Il reste encore des smileys que je n'ai pas intégré dans mon message: icon_exclaim.gif icon_arrow.gif cool.gif icon_cry.gif anim_grin.gif icon_lol2.gif ninja.gif icon_bla.gif ...
Khertan
CITATION(lu1u @ 22/02/2006 à 08:59 ) *
=> Il reste encore des smileys que je n'ai pas intégré dans mon message: icon_exclaim.gif icon_arrow.gif cool.gif icon_cry.gif anim_grin.gif icon_lol2.gif ninja.gif icon_bla.gif ...


"Vous avez écrit un message avec plus d'émoticônes que ces forums le permettent. Merci de réduire le nombre d'émoticônes dans votre message."

Bon bah ... je voulais tous te les mettre mais c est loupé ...


skn.gif skn.gif
niark.gif niark.gif
icon_cool2.gif icon_cool2.gif
matrix.gif matrix.gif


unsure.gif unsure.gif
nono.gif nono.gif
wub.gif wub.gif
wink.gif wink.gif
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2008 Invision Power Services, Inc.