_________________________
1ère structure
Code : Tout sélectionner
Structure BuildArrayInfo
FileName.S
ExecStatus.I
*SeqBegin
*SeqEnd
SeqSize.I ; En octet
*ArrayTable
*ArrayTableEnd
ArrayTableSize.I ; (nombre de pointeurs)
LineMeanLength.I ; Taille moyenne d'une ligne
EndStructure
Avant d'exécuter LoadStringArray(), tu lui cuisines cette structure comme dans l'exemple (allocation + réglages), puis tu exécutes la fonctions. Après cela tu as toutes les infos nécessaires pour gérer et libérer l'espace alloué par la fonction.
La structure BuildArrayInfo contient 9 champs:
1 champ d'entrée
7 champs de sortie
1 champ mixte
\FileName.S (ENTREE) Nom du fichier texte à charger
\LineMeanLength (ENTREE/SORTIE) Fixe la longueur moyenne d'une ligne en caractères. Ceci est dû au fait que l'on charge un fichier texte sans savoir combien de lignes de textes sont stockées dans ce fichier. Si = 0 en entrée, la fonction fixe une valeur par défaut de 10 caractères. (Donc, en gros, tu t'en fous de cette valeur, le "bordel interne" s'en charge pour toi)
\ExecStatus (SORTIE) Retourne l'état d'exécution de la fonction
= 0 : a échoué, n'a pas pu ouvrir le fichier texte demandé
= 1 : a échoué, n'a pas pu allouer le bloc mémoire RAM de la taille du fichier
= 3 : a échoué, n'a pas pu charger le fichier en mémoire
= 7 : a échoué, n'a pas pu créer la table des pointeurs de chaîne
= 15 : a réussi
Ces valeurs sont tirées des 4 constantes suivantes (convention perso) :
#FileOpened = 1
#MemAllocated = 2
#FileLoaded = 4
#TableCreated = 8
\SeqBegin (SORTIE) Adresse du bloc mémoire (="séquence") contenant toutes les chaînes
\SeqEnd (SORTIE) Adresse de fin de la séquence
\SeqSize (SORTIE) Taille en octets de la séquence
\ArrayTable (SORTIE) Adresse du bloc mémoire (="table") contenant tous les pointeurs de chacune des chaînes
\ArrayTableEnd (SORTIE) Adresse de la fin de la table
\ArrayTableSize (SORTIE) Quantité totale de chaînes (= quantité totale de pointeurs de chaîne)
_____________________________
2ème structure
Code : Tout sélectionner
Structure TextLineInfo
TextLine.S[1 << 24]
EndStructure
Code : Tout sélectionner
Define *Chaine.TextLineInfo
Define ArrayInfo.BuildArrayInfo
ArrayInfo\FileName = "MONFICHIERTEXTE.TXT"
LoadArrayString(ArrayInfo)
*Chaine = ArrayInfo\ArrayTable
*Chaine\TextLine[67891] = "Salut" ; Accès à l'une des chaînes
D'après ta dernière phrase, ce type de fonctionnement est parfaitement adapté à ton besoin (tu ne veux pas modifier la taille des chaînes mais seulement chercher dedans)
Je ne fais que répondre à ta demande!
Aussi, si tu persévères avec ce procédé, je te présente cette procédure ASM que j'avais posté pour Kwaï il y a un moment.
Elle se moque des caractères système. Elle n'a pas de frontières de recherche dans la mémoire, donc il faut la limiter (Limit = \SeqEnd, dans ton cas précis, c'est la fin du bloc contenant toutes les chaîne).
Code : Tout sélectionner
Procedure.L FindChar(*Index, Ascii.I, Limit.I)
; Retourne l'adresse mémoire du caractère Ascii recherché
; dans la zoné mémoire entre (*Index) et (*Index + Limit)
! mov eax, [p.v_Ascii]
! mov edi, [p.p_Index]
! mov ecx, [p.v_Limit]
! mov ebx, edi
! cld
! repne scasb
! mov eax, edi
! dec eax
ProcedureReturn
EndProcedure
;Exemple
X.S = "Bonjour, voici une chaîne"
Debug Chr(PeekC(FindChar(@X, Asc("î"), @X + Len(X) - 1) ) )
C'est aussi cette séquence ASM qui sert de départ pour créer la fonction. Aussi, si ma procédure LoadStringArray() te semble trop usine à gaz, ce qui peut se comprendre, ben fais la même à partir de ce bout de code-ci! C'est vrai que chacun a ses manières de développer son code...
Maintenant, si tu veux plus performant, ben il y a les les tables associatives. Sujet récent ici. Mais dans tous les cas, il y a des difficultés.
Ce qu'il faut c'est ne pas désespérer. Tu n'as pas appelé ton projet Moëbius pour rien. Le jeu en vaut la chandelle!
Ollivier