problème avec une variable

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

Re: problème avec une variable

Message par Zorro »

GallyHC a écrit :Entre "Global a.s" et "a.s =""", tu n'as pas non plus la même porté de variable non plus.
vérification faite , tu as raison ,
si la variable est initialisé sans le mot "Global" , alors elle n'est pas accessible dans les procedures ..
mais est accessible de partout dans le listing ...
c'est l'une des particularité du Purebasic
car en principe en "Basic" toute variable declarée en dehors d'une procedure est réputé Global ...
Dernière modification par Zorro le sam. 11/janv./2020 14:39, modifié 1 fois.
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: problème avec une variable

Message par GallyHC »

Heuu la j'ai un doute pour exemple si je fait :

Code : Tout sélectionner

a.s = "test"

Procedure f()
  Debug a
EndProcedure

f()
Ce n'est pas le même résultat que si je fait :

Code : Tout sélectionner

Global a.s = "test"

Procedure f()
  Debug a
EndProcedure

f()
Les variables n'ont aucunement les mêmes portées.

GallyHC

PS: tu as corriger ton post, pendant que j'écriais le mien ^^.
Dernière modification par GallyHC le sam. 11/janv./2020 14:45, modifié 2 fois.
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

Re: problème avec une variable

Message par Zorro »

oui j'avais corrigé mon propos .. pendant que tu ecrivait sans doute :)
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

Re: problème avec une variable

Message par Zorro »

en fait en y reflechissant, c'est plutot normal que la variable a.s=""
ne soit pas accessible dans une procedure

vue qu'une procedure installe son contexte LOCAL (sa propre PILE)
un a.s="" dans la procedure ne doit pas entrer en conflict avec un a.s="" a l'exterieur de celle ci ...


je suppose que l'ajout du mot GLOBAL a pour but de modifier ça ....
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: problème avec une variable

Message par Marc56 »

Même si ça peut paraitre contraignant au premier abord, j'aime bien cette possibilité d'obliger à ̶d̶é̶c̶l̶a̶r̶e̶r̶ définir :mrgreen: les variables selon un des 5 modes (Define, Global, Protected, Shared, Static)

La définition obligatoire des variables est ce qui fait la stabilité et la vitesse des programmes en Pascal depuis des dizaines d'années (et encore, en Pascal il faut déclarer à des endroits précis).

Quand on s'oblige à définir à l'avance l'usage d'une variable on s'oblige aussi à bien gérer la mémoire (donc penser à "vider" ce qui ne sert plus). Sans cela on faisait souvent presque tout en variable globale pour la facilité, et les programmes enflaient d'une manière démesurée en RAM

Vive EnableExplicit il faudrait qu'il s'inscrive par défaut dès qu'on fait CTRL+N 8)
(oui, on sais t'aime pas :mrgreen: donc c'est bien que ce soit optionnel)

:wink:
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: problème avec une variable

Message par GallyHC »

Oui, j'ai écris pendant que tu été en train de modifier ton post ^^.
Cela est normal et justement de mémoire ce problème en GFABasic par exemple avait été corriger par la suite et tout langage Basic évoluer avait cette évolution (VisualBasic par exemple).

Tout de même merci, ça a permis de remettre les choses en places, même si le sujet principal a un peu dériver (mais pas de beaucoup) ^^.

@Marc56 > les langages très utilisé en milieu professionnel comme java (Jakarta, même si cela risque de rapidement baissé), oblige les déclarations "variable/type" et une mal faite est considérer comme une erreur par les vérificateurs de code (comme "sonarlint").

GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: problème avec une variable

Message par Micoute »

En fait Define.<type> devrait plutôt s'appeler Define_Type.<type>
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: problème avec une variable

Message par GallyHC »

Pas faux ou juste Declare, même si cela est deja utiliser autrement ^^.

Après, c'été juste une question de non compréhension avec ce problème, je ne critique pas PB, car il est fait pour que l'on en fasse le moins possible et aide beaucoup l'utilisateur pour faire un développement simple. Il manque quelques trucs comme par exemple les conditions ternaires (le IIF en visualbasic) et surement d'autre choses, mais il permet déjà beaucoup de chose.

Aussi la choses qui m'aurait éviter de faire ce truc, c'est déclarer un tableau et lui affecter automatiquement des valeurs du style "dim tableau.l() = {0,1,2,3,4,5,6}" pour un tableau à taille non fixe et "dim tableau.l[] = {0,1,2,3,4,5,6}" pour un autre avec une taille fixe ou des trucs comme cela, je ne serais pas passer par "DataSection" pour alimenter ces mêmes tableaux :P .

Et d’ailler avec cette discussion cela m'a permis de me dire, vu que j'utilise toujours les mêmes tableaux dans la méthode au lieu de les déclarés à chaque appel, je vais les mettre en static pour que si il sont déjà affecter ne pas devoir le refaire :o .

Tout est parti d'un code du forum anglais sur des code à barre "https://www.purebasic.fr/english/viewto ... 63#p533663". Ayant pas mal de compétence dans le domaine et ne voulant pas refaire ce que d'autres on surement fait et bien fait, j'ai cherché et trouvé ce code.
Il été pas mal intéressant car il y avait une seul routine d'affichage et je n'avais pas penser a faire comme cela et après avoir localiser un problème sur le code-128, j'ai ajouter déjà 3 autres type de code-barre. Maintenant je m'attaque a un autre type de code-barre beaucoup plus complexe (pourquoi? juste que ce soit compatible X32 et X64, ce qui n'est pas forcement vrai avec les Dll) et donc pour le moment, je suis sur le "DataMatrix" et j'espère par la suite le faire pour du "QR-Code" (Si j'arrive déjà avec le datamatrix).

Pour le moment le code modifier du site anglais permet d'encoder "EAN-8, EAN-13 (UCPA), 2of5, Code-11, Code-39, Code-93, Code-128 et PostNet) et c'est déjà pas mal.

Voila vous savez tout lollllllll,
Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: problème avec une variable

Message par Micoute »

Code : Tout sélectionner

;TABLEAU DE CHAINES
;===============
Declare AddArray(Array idTableau.s(1),var.s)

Global Dim MonTableau.s(0)

AddArray(MonTableau(),"10,1,2,42,13,21,420,24,3,1")

; vérification 
For i = 0 To ArraySize(MonTableau())
  Debug MonTableau(i)
Next i  

Procedure AddArray(Array idTableau.s(1),var.s)
  For i = 0 To CountString(var.s,",")
    ReDim idTableau(i)
    idTableau(i) = StringField(var.s,i + 1,",")
  Next i
EndProcedure

;TABLEAU D'ENTIERS
;==============
Declare AddArray(Array idTableau.i(1),var.s)

Global Dim MonTableau.i(0)

AddArray(MonTableau(),"10,1,2,42,13,21,420,24,3,1")

; vérification 
For i = 0 To ArraySize(MonTableau())
  Debug MonTableau(i)
Next i

Procedure AddArray(Array idTableau.i(1),var.s)
  For i = 0 To CountString(var.s,",")
    ReDim idTableau(i)
    idTableau(i) = Val(StringField(var.s,i + 1,","))
  Next i
EndProcedure

;TABLEAU DE FLOTTANTS
;=================
Declare AddArray(Array idTableau.f(1),var.s)

Global Dim MonTableau.f(0)

AddArray(MonTableau(),"10.0,1.1,2.2,42.3.3.4,21.5,420.6,24.7,3.8,1.9")

; vérification 
For i = 0 To ArraySize(MonTableau())
  Debug StrF(MonTableau(i), 1)
Next i

Procedure AddArray(Array idTableau.f(1),var.s)
  For i = 0 To CountString(var.s,",")
    ReDim idTableau(i)
    idTableau(i) = ValF(StringField(var.s,i + 1,","))
  Next i
EndProcedure
Pense aux balises CODE vieille branche. ;) (Ar-S)
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: problème avec une variable

Message par GallyHC »

merci Micoute, je fais presque la même chose avec les "datasection", mais j'aime bien ta méthode aussi, je vais voir ce qui serait le plus "propre" (question de point de vu ^^, peu être le tienne, même si a la base je ne voulais justement pas passé par une méthode ^^.

Je vais tester et peu être généraliser ta méthode. Merci pour ces exemples fort instructif (comme quoi en développement, il n'y a pas une résolution a une problématiquement) et j'aurais vu une autre façon de voir les choses, ce que j'adore avant tout dans le dev. Je note bien l'idée et je vais voir ce qui est le mieux.

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
Naheulf
Messages : 193
Inscription : dim. 10/mars/2013 22:22
Localisation : France

Re: problème avec une variable

Message par Naheulf »

Personnellement, lorsque j'ai le choix, j'évite la méthode de Micoute qui consiste à passer une chaîne constante à une procédure pour initialiser un tableau.
Les raisons sont les suivantes :
- Temps de chargement augmenté
- Taille de l'exécutable final augmenté (quoique ça dépends des chaînes)

Bon, si mes valeurs initiales sont forcement dans une chaîne de caractères (fichier csv) ya pas d'autre solution...
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: problème avec une variable

Message par GallyHC »

Auto-Correction c'est bien possible en fait ^^

Cordialement,
GallyHC
Dernière modification par GallyHC le dim. 12/janv./2020 10:14, modifié 1 fois.
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

Re: problème avec une variable

Message par Zorro »

@micoute , heu.... faire attention a l'utilisation des chaines de caracteres
c'est vraiment plus long que l'utilisation d'entier ou de flottant ...

le passage par chaine de caractere est pratique , mais dans le cadre de nombreuses données numérique
faut éviter .... sinon pour le coup ça va etre long ... et plus gros en RAM , un caractere prends plus de place qu'un entier (surtout en UNICODE )

et pourquoi pas utiliser les Liste-chainée ? 8O
je les trouves bien plus pratique que les tableaux .. (plus rapide ??? )
les tableaux, maintenant, j'evite... trop restrictif .. meme si REDIM apporte une facilité :)
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: problème avec une variable

Message par Micoute »

Oui, je suis d'accord, mais c'était surtout pour l'aspect ludique, une idée en apporte souvent une autre.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

Re: problème avec une variable

Message par Zorro »

:) :) :)
Répondre