Structure test:Array a.l(-1):EndStructure

Vous avez une idée pour améliorer ou modifier PureBasic ? N'hésitez pas à la proposer.
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Structure test:Array a.l(-1):EndStructure

Message par graph100 »

le code suivant :

Code : Tout sélectionner

Structure tt
	Array *a.tt(0)
EndStructure


Define m.tt

Debug ArraySize(m\a())
ne permet pas de savoir si le tableau vient d'être créé ou non,

Je propose de pouvoir utiliser le code suivant :

Code : Tout sélectionner

Structure tt
	Array *a.tt(-1)
EndStructure

Define m.tt

Debug ArraySize(m\a())
pour déclarer un tableau dans un champ de structure, sans l'initialiser.
de manière à ce que arraysize() = -1
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Structure test:Array a.l(-1):EndStructure

Message par falsam »

ArraySize() retourne -1 si le tableau n'est pas initialisé.

Code : Tout sélectionner

Structure tt
   Array *a.tt(999999999)
EndStructure


Define m.tt

Debug ArraySize(m\a())
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
G-Rom
Messages : 3626
Inscription : dim. 10/janv./2010 5:29

Re: Structure test:Array a.l(-1):EndStructure

Message par G-Rom »

Je ne lancerais pas ton code , même avec qq lignes il consommera toute la mémoire du pc :D
chez moi , sa renvois 0 , pas -1

@Graph, si ton tableau à 0 élément il est considéré de facto non initialisé , il n'y a aucun élément dedans
tu l'initialises avec reDim() tout simplement. si ArraySize() te renvois 0 , c'est qu'il n'a pas de taille , il ne vaut donc rien, ne pèse rien en RAM ( sauf le pointeur dans ta structure )
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Structure test:Array a.l(-1):EndStructure

Message par falsam »

G-Rom a écrit :Je ne lancerais pas ton code , même avec qq lignes il consommera toute la mémoire du pc :D
chez moi , sa renvois 0 , pas -1
Alors comment tu peux avoir un code retour à 0 sans le lancer ?

L'aide confirme ce résultat à -1 http://www.purebasic.com/french/documen ... ysize.html
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
G-Rom
Messages : 3626
Inscription : dim. 10/janv./2010 5:29

Re: Structure test:Array a.l(-1):EndStructure

Message par G-Rom »

tu écrit :
falsam a écrit :ArraySize() retourne -1 si le tableau n'est pas initialisé.

Code : Tout sélectionner

Structure tt
   Array *a.tt(999999999)
EndStructure


Define m.tt

Debug ArraySize(m\a())
le -1 viens uniquement en cas d’échec, comme le dis l'aide du lien que tu m'as donné, ce qui n'a rien à voir avec une initialisation.
si tu met un 0 à la place du nombre 999... ArraySize() te renverras 0. soit 0 élément , donc non initialisé.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Structure test:Array a.l(-1):EndStructure

Message par falsam »

G-Rom a écrit :le -1 viens uniquement en cas d’échec, comme le dis l'aide du lien que tu m'as donné, ce qui n'a rien à voir avec une initialisation.
Allez j'insiste encore :mrgreen: Peut être que je n'ai pas compris les propos de graph100. Que le tableau contient 0 ou N éléments, Je pense qu'il voulait juste savoir si le tableau est bien crée ou pas. Dans ce cas, le code retour -1 signifie bien que le tableau est n'est pas crée.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
G-Rom
Messages : 3626
Inscription : dim. 10/janv./2010 5:29

Re: Structure test:Array a.l(-1):EndStructure

Message par G-Rom »

Si il contient 0 élément , il n'est pas créer puisqu'il est vide 8O , le -1 interviens en cas d'erreur d'allocation comme le démontre ton code.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Structure test:Array a.l(-1):EndStructure

Message par falsam »

G-Rom a écrit :Si il contient 0 élément , il n'est pas créer puisqu'il est vide 8O , le -1 interviens en cas d'erreur d'allocation comme le démontre ton code.
pas créer ?

Si je reprend le code initial auquel je rajoute une boucle

Code : Tout sélectionner

Structure tt
   Array *a.tt(0)
EndStructure


Define m.tt

Debug ArraySize(m\a())

Repeat
ForEver
je peux voir que le tableau est bien crée dans le visualisateur de variables. Pourant il y a 0 éléments.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
G-Rom
Messages : 3626
Inscription : dim. 10/janv./2010 5:29

Re: Structure test:Array a.l(-1):EndStructure

Message par G-Rom »

C'est le pointeur de la base du tableau qui est créer. C'est logique , on ne peu pas créer dynamiquement un champ dans une strucutre lors de l'execution du programme.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Structure test:Array a.l(-1):EndStructure

Message par falsam »

G-Rom a écrit :C'est le pointeur de la base du tableau qui est créer. C'est logique , on ne peu pas créer dynamiquement un champ dans une strucutre lors de l'execution du programme.
ok :)

Un exemple plus simple dans ce cas.

Code : Tout sélectionner

Dim T(0)

Debug ArraySize(T())

Repeat
ForEver
Le debug renvoie 0. Donc en principe le tableau est bien initialisé avec 0 élément. Ce qui est confirmé par le visualiseur de variables.

Le même code mais je vais provoquer une erreur d'initialisation (Du moins sur mon pauvre pc)

Code : Tout sélectionner

Dim T(999999999)

Debug ArraySize(T())

Repeat
ForEver
Le debug renvoie -1. Le tableau n'est donc pas initialisé. Ce que me confirme le visualiseur de variables.

Image
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
GallyHC
Messages : 1703
Inscription : lun. 17/déc./2007 12:44

Re: Structure test:Array a.l(-1):EndStructure

Message par GallyHC »

Bonjour,

Je met les deux pieds dans le plat vu que que j'ai survoler le topic, mais un tableau a 0 est pour moi forcement initialiser vu qu'un tableau commence a 0.

Donc

Code : Tout sélectionner

Dim t.s(0)

t(0) = "je suis la..."

Debug t(0)
Fonctionne aussi ;), comme la premier valeur "valide" d'un tableau comment a "0" il est forcement initialiser avec une seule valeur.... je sais que j'ai pas tout lu et surement un peu hors sujet mais bon ....


Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
G-Rom
Messages : 3626
Inscription : dim. 10/janv./2010 5:29

Re: Structure test:Array a.l(-1):EndStructure

Message par G-Rom »

falsam a écrit :
G-Rom a écrit :C'est le pointeur de la base du tableau qui est créer. C'est logique , on ne peu pas créer dynamiquement un champ dans une strucutre lors de l'execution du programme.
ok :)

Un exemple plus simple dans ce cas.

Code : Tout sélectionner

Dim T(0)

Debug ArraySize(T())

Repeat
ForEver
Le debug renvoie 0. Donc en principe le tableau est bien initialisé avec 0 élément. Ce qui est confirmé par le visualiseur de variables.

Le même code mais je vais provoquer une erreur d'initialisation (Du moins sur mon pauvre pc)

Code : Tout sélectionner

Dim T(999999999)

Debug ArraySize(T())

Repeat
ForEver
Le debug renvoie -1. Le tableau n'est donc pas initialisé. Ce que me confirme le visualiseur de variables.

Image
C'est logique, un tableau c'est quoi ? une suite de mémoire contigüe.
en pb , on peu le représenté ainsi ( tableau de int ) :

Code : Tout sélectionner

; x86
*myArray = AllocateMemory(4) 

; x64
*myArray = AllocateMemory(8) 
un simple pointeur. PB utilise en plus une structure interne qui permet de stocker le nombre d'éléments et surement des traceurs pour le debogeur.
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Structure test:Array a.l(-1):EndStructure

Message par graph100 »

ok, ok, C'est vite partie :mrgreen:

Bref, je voudrais souligner qu'il n'y a que GallyHC qui a mentionné à juste titre qu'un tableau déclaré de la manière suivante :

Code : Tout sélectionner

Dim mon_tableau(0)
aura bien 1 élément et non pas zéro...
car l'index des tableaux non statiques commence à 0.

D'ou mon problème, et ma remarque :roll:

Et donc qu'il n'est pas possible de déclarer un tableau dans une structure en étant sur à 100% qu'il n'est pas initialisé en mémoire

parce que si on utilise la méthode de Falsam (qui me tente je l'avoue), on peut imaginer tomber sur un ordi qui peut tout allouer.
Dernière modification par graph100 le jeu. 23/janv./2014 6:24, modifié 1 fois.
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Structure test:Array a.l(-1):EndStructure

Message par Backup »

il suffit de faire :

Code : Tout sélectionner

Structure tt
	Array *a.tt(0)
EndStructure
Define m.tt
FreeArray(m\a()) ; on le detruit ... mais la structure reste valable !!




Debug ArraySize(m\a())  ; affiche -1 car n'existe plus



dim m\a(5)  ; on le Re-creer

Debug ArraySize(m\a()) ; affiche 5 c'est correcte !! ; EPB
donc en fait tu creer un tableau , que tu detruit.....

donc debug dit qu'il n'existe pas ....

ensuite on le creer....
il existe !

pour rappel FreeArray() sert a detruire un tableau .. donc a l'initialiser d'une certaine façon ....
bien que initialiser ne soit pas le terme aproprié ...

une initialisation , consiste a Creer avec une valeur a zero en informatique ...

(ancien Basic) j'initialise une Variable : LET A=0 ;)
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Structure test:Array a.l(-1):EndStructure

Message par graph100 »

effectivement, cependant, je suis tombé sur ce problème dans un code venant du fofo anglais pour lire les fichiers JSON. Très bon code d'ailleurs !
L'auteur, PMV, contourne le problème en utilisant un 2ème registre contenant la taille de la liste.
Pour appliquer la méthode que tu proposes, il faudrait appeler FreeArray à chaque occurences de InitializeStructure(), et dans ce code, il y en a énormément.
Et ce qu'on cherche c'est la rapidité.

Ce topic est là pour proposer un modification du comportement même de PureBasic, c'est bien le but de "Suggestions et améliorations"
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Répondre