Page 1 sur 1

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

Publié : sam. 16/nov./2013 8:35
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

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

Publié : sam. 16/nov./2013 12:24
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())

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

Publié : sam. 16/nov./2013 13:02
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 )

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

Publié : sam. 16/nov./2013 13:53
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

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

Publié : sam. 16/nov./2013 14:38
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é.

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

Publié : sam. 16/nov./2013 14:46
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.

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

Publié : sam. 16/nov./2013 14:49
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.

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

Publié : sam. 16/nov./2013 15:09
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.

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

Publié : sam. 16/nov./2013 15:23
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.

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

Publié : sam. 16/nov./2013 15:40
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

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

Publié : sam. 16/nov./2013 16:22
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

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

Publié : sam. 16/nov./2013 17:59
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.

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

Publié : lun. 18/nov./2013 5:26
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.

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

Publié : lun. 18/nov./2013 12:27
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 ;)

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

Publié : lun. 18/nov./2013 15:58
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"