[toute version] Tableau non initialisé + ValF() [Corrigé]

Archive.
Good07
Messages : 308
Inscription : ven. 23/avr./2004 18:08
Localisation : Hérault 34190 Laroque

[toute version] Tableau non initialisé + ValF() [Corrigé]

Message par Good07 »

Bonjour à tous.

J'ai un problème avec la fonction ValF quand on veux lire une case vide dans un tableau. :(
Un petit code vaut mieux qu'un long discourt. Essayez le code suivant:

Code : Tout sélectionner

;Pure basic version 3.94 ou 4.0
;Problème avec ValF()




Dim mois.s(12,1)
For n=1 To 12
If n=6:n=7:EndIf
a.s=StrF(Random(100)+0.1125)
mois(n,1)=a
Debug mois(n,1)
Next n
Debug "---------------------"
For n=1 To 12
Debug ValF(mois(n,1));Invalid memory access
Next n
;par contre ça marche si on remplace la ligne 16 par Debug Val(mois(n,1))
C'est peut être normal, mais c'est génant car il faut remplir le tableau avec des chaines vide ("") pour que ça fonctionne. :(
J'attend vos réponses, il y a peut-être une autre solution.
Merci.
Good07
Messages : 308
Inscription : ven. 23/avr./2004 18:08
Localisation : Hérault 34190 Laroque

Message par Good07 »

ça semble intéresser personne. :(

Je voulais simplement savoir si c'était un bug. Pourquoi le programme fonctionne très bien si j'utilise val() et plante lamentablement en utilisant ValF() ?

Quelqu'un peut-il me répondre ?

Ce programme ne sert à rien, il n'est qu'un exemple pour mettre en évidence ce défaut.

Je peux contourner le problème mais à première vue ça me semble pas normal.

Merci d'avance.
LeCyb
Messages : 273
Inscription : dim. 26/déc./2004 20:49

Message par LeCyb »

Le problème vient du fait que le sixième élément du tableau ne contient rien.
En fait je viens de remarquer que les chaînes ne sont pas initialisées lors de leur déclaration.

Code : Tout sélectionner

s.s = ""
t.s

Debug LocalSize_(s)
Debug LocalSize_(t)
Vive le thread-safe !
Good07
Messages : 308
Inscription : ven. 23/avr./2004 18:08
Localisation : Hérault 34190 Laroque

Message par Good07 »

Merci leCyb pour ta réponse.
J'en était arrivé à la même conclusion, mais normalement le fait de faire Dim devrait suffire à initialiser le tableau. J'avais remarqué qu'en initialisant le tableau avec une boucle et des chaines vides cela fonctionnait normalement.
Mais je pense que c'est un bug car si on fait:

Code : Tout sélectionner

ss.s=""
ts.s
;Debug ValF(ss)
;Debug ValF(ts)
Debug Val(ss)
Debug Val(ts)
Le Debug ValF(ts) plante. Par contre Debug Val(ts) marche et renvoi bien zéro.
En fait je ne sais pas si c'est l'instruction ValF() qui est en cause (Bien que normalement elle devrait renvoyer 0,0) ou alors l'instruction Dim qui ne fait pas son boulot et ne fait pas l'initialisation du tableau. Pour les variables, je pense que c'est plus rare car dans un programme elles sont toujours initialisées par quelque chose même par une chaine vide.

Je pense que Fred devrait pouvoir répondre à cette question.
Bug sur Dim ou Bug sur ValF() :?:
Ou alors bug sur les deux... :?:
Curieusement, le programme suivant fonctionne:

Code : Tout sélectionner

ss.s=""
ts.s
ts2.s
ts=ts2
Debug ValF(ss)
Debug ValF(ts)
Debug Val(ss)
Debug Val(ts)
Alors qu'au départ les variables string ts et ts2 ne sont pas initialisée par une quelconque valeur. :?
Par contre il bug si on fait ValF(ts2). :cry:
RegisLG
Messages : 154
Inscription : mer. 22/juin/2005 2:32

Message par RegisLG »

Salut,

c'est normal (compte tenu de l'explication de LeCyb) que ce code fonctionne :

Code : Tout sélectionner

ss.s="" 
ts.s 
ts2.s 
ts=ts2 
Debug ValF(ss) 
Debug ValF(ts) 
Debug Val(ss) 
Debug Val(ts) 
car quand tu fais l'affectation (ts=ts2) la variable ts s'initialise à ""
Par contre la variable ts2 n'étant toujours pas initialisée, logiquement ValF(ts2) plante.

Sinon pour résoudre le problème de la non initialisation tu peux utiliser le type "fixed string" à la place du type "string" :
tu remplaces ton "Dim mois.s(12,1)" par "Dim mois.s{10}(12,1)" dans le premier code que tu as posté, et roule ma poule :wink:
Good07
Messages : 308
Inscription : ven. 23/avr./2004 18:08
Localisation : Hérault 34190 Laroque

Message par Good07 »

Merci RegisLG pour ta réponse.

Mon programme est fait avec la version 3.94 qui ne possède pas cette fonction, mais suite à la réponse de Lecyb et de mes observations, j'ai résolu le problème (avec la version 3.94) en initialisant le tableau en début du programme avec une boucle avant de l'utiliser.
Je compte le faire évoluer en version 4.0 dans un proche avenir,(En fait dès que la librairie de droopy sera mise à jour pour la version 4.0) donc ta remarque me sera très utile. :D
Merci.
LeCyb
Messages : 273
Inscription : dim. 26/déc./2004 20:49

Message par LeCyb »

J'ai édité le sujet pour mettre les deux bugs :)
Vive le thread-safe !
Fred
Site Admin
Messages : 2808
Inscription : mer. 21/janv./2004 11:03

Message par Fred »

Bien vu, c'est corrigé.
Répondre