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)
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