les multis tableaux

Vous avez une idée pour améliorer ou modifier PureBasic ? N'hésitez pas à la proposer.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Cpl a raison : Quand on n'a pas ce qu'on veut au niveau stockage mémoire (ici les tableaux), il faut se refaire un ensemble d'intructions utilisant les zone mémoire.

J'étaye aussi l'idée de Dobro, dans le sens où les listes chaînées et tableaux sont des zones mémoires confortablement accessibles.

@Dobro

Pour l'accès rapide aux listes chaînées, j'entoure ma procédure de Map() et EndMap() (dispo : ici)
Map() créée le tableau des pointeurs de la liste spécifiée.
Dans mon traitement de liste, je remplace SelectElement(L(), x) par ChangeCurrentElement(L(), *Ptr(x) )
EndMap() libère la mémoire de ce tableau puisqu'il est rapidement inutilisable (dès lors qu'on modifie la liste)

Sinon SelectElement est un équivalent d'une boucle First/Next donc un peu lent.
Vu qu'une liste chaînée est un peu comme un intestin (on y accède que par le début ou par la fin), il faut savoir que PreviousElement() est plus rapide que NextElement donc on peut recréer une instruction SelectElement un peu plus rapide si on ne peut pas allouer de mémoire pour un tableau.

Pour revenir à l'idée de Cpl, j'ai actuellement un besoin important de 'hardlist'. Ce sont de simples listes modifiables (insertion, suppression, aggrandissement, réduction, comme les linked list) directement créées en zone mémoire. Elles sont très économiques en place mémoire puisqu'il n'y a que la donnée. Leur numéro est directement fonction de la place qu'elle occupe (comme un tableau de nombres). Une insertion demande à copier vers le haut la suite des valeurs qui suivent la valeur insérée. Une suppression, c'est une copie vers le bas. Pour éviter de perdre du temps avec MoveMemory() vu que les zones copiées se chevauchent, j'ai fait 2 procédures ASM de copie (vers le haut et vers le bas) (Elles ne sont pas très complexes, je peux les poster si ça semble utile à quelqu'un)

Pour le stockage de l'en-tête, j'utilise la méthode de Fred. ('Sous' l'adresse) ça évite de s'en occuper pour l'accès.

Pour l'allocation dynamique, j'ai fait une procédure permettant à ReAllocateMemory() d'anticiper de l'espace mémoire (par 'paragraphe') et d'ignorer x 'réallocation' inutiles puisque déjà anticipées. Gain de vitesse et perte négligeable de mémoire.

@Graph100

Pour les tableaux multi-dimensionnel de nombre, tu reprends ce principe de hardlist. Pour le calcul, de la position en fonction des valeur d'entrée, tu fais comme Fred, tu stocke des le départ les produits de calcul (ici, je les appelle 'coef'):

*PointorHardList = x * Coef2 + y * Coef1 + z
(pour un tableau à 3 dimensions, x, y et z)

Exemple: 'Dim' Tablo(3, 6, 8 )
Coef1 = 8 + 1
Coef2 = Coef1 * (6 + 1)

Exemple: 'Dim' Tablo(2, 3, 7, 4, 2, 5)
Coef1 = 5 + 1
Coef2 = Coef1 * (2 + 1)
Coef3 = Coef2 * (4 + 1)
Coef4 = Coef3 * (7 + 1)
Coef5 = Coef4 * (3 + 1)

Ainsi pour ce tableau à 6 dimensions:

Code : Tout sélectionner

*Pointor = a*Coef5 + b*Coef4 + c*Coef3 + d*Coef2 + e*Coef1 + f

Pour être encore plus malin sur la vitesse de traitement, tu peux utiliser des tableaux plus restrictifs : la taille des dimension est alors une puissance de 2.

Exemple:

Code : Tout sélectionner

'Dim' Tablo(3, 1, 7, 31, 255, 63)
L'accès à la position de chacun des éléments est juste un décalage de bits et d'opérations &.

Pour les tableaux de chaînes, tu fais une hardlist exactement comme un tableau de nombres Long et tu remplace chaque Long par un pointeur de chaîne.

Ollivier
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Message par graph100 »

@Ollivier
merci pour ce post long et tres complet
je me posais des questions sur un tableau de chaine , mais cmment creer tu un pointeur de chaine ?

je n'y ai pas pris beaucoup de temp car c'est la rentré (y doit quand meme y en avoir içi qui sont encore dans le systeme scolaire :D )

ca m'embete les tableaux avec structure car comment faire une procedure qui s'adapte avec la structure du tableau ?
Anonyme

Message par Anonyme »

les chaines ne sont ni plus ni moins des chiffres allant de 0 à 255 <.c>
pour ta question tu passes en paramètre le sizeof() de ta structure, mais donne un code de se que essaye de faire.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

je me posais des questions sur un tableau de chaine , mais cmment creer tu un pointeur de chaine ?
(Graph100)

Code : Tout sélectionner

UneChaine.S = "Je suis une petie chaîne"
*Pointeur = @UneChaine
Pour un tableau à multi-dimension, tu peux faire comme suit:

Code : Tout sélectionner

MaxChaine.L = 1023 ; Par exemple 1024 chaînes au total
Dim Chaine.S(MaxChaine)
Dim *Pointeur(MaxChaine)
For i = 0 To MaxChaine
   *Pointeur(i) = @Chaine(i)
Next
Cette méthode paraît compliquer les choses mais elle te permet, par la suite de stocker chacune de tes chaînes dans une zone mémoire ou plusieurs zones mémoire au lieu de les stocker dans un tableau de chaînes.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Pour résumer un peu (parce que le texte c'est le boxon...) par un schéma succin:

{params index} -1-> [Calcul position ptr] -2-> [Table des ptr] -3-> [Chaines]

-1-> = valeur des index (exemple : x et y pour un tableau 2D)
-2-> = position respective (calculé avec les coefs)
-3-> = pointeur de chaîne

Pour les structures, Cpl, Dobro, ou d'autres encore ont plus de connaissances que moi pour te montrer leur utilité et leurs limites. Vu que je ne les utilise que pour passer x paramètres vers ou depuis une procédure.
Répondre