| déclarer une var tableau dont on ne connaît pas la taille | |
|
|
Auteur | Message |
---|
ambroise
Nombre de messages : 264 Localisation : Haute-Savoie Date d'inscription : 29/04/2012
| Sujet: déclarer une var tableau dont on ne connaît pas la taille Jeu 14 Juin 2012 - 13:58 | |
| Bonjour,
Comment faites-vous pour déclarer une variable tableau alors que vous ne connaissez pas sa taille du fait que celle-ci dépendra d'un nombre d'enregistrements à créer dans le programme ?
Déclarez-vous une taille "au pif" ?
Je vous remercie.
| |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: déclarer une var tableau dont on ne connaît pas la taille Jeu 14 Juin 2012 - 14:30 | |
| Je fais ceci: - Code:
-
dim taille_tableau% ... ' on charge la taille selon les besoins taille_tableau% = 205 on supprime le tableau s'il existe déjà if variable("mon_tableau%")=1 then delete mon_tableau% ' on crée le tableau dim tableau%(taille_tableau%)
ça marche évidemment avec 1 ou 2 dimensions, avec des tableaux d'entiers, de flottants ou de chaînes. | |
|
| |
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: déclarer une var tableau dont on ne connaît pas la taille Jeu 14 Juin 2012 - 14:33 | |
| Soit tu attends de connaître le nombre d'enregistrements avant de déclarer ton tableau, soit tu le dimensionnes largement à l'avance, je ne vois pas comment on peut faire autrement, il n'y a pas de Redim en Panoramic.
On s'est croisés Klaus, effectivement, supprimer et redimensionner, ce qui revient à ma première solution.
Mais si le nombre d'enregistrements varie dans le temps, et qu'il faut rajouter des éléments dynamiquement, je ne vois pas comment on peut faire ! | |
|
| |
Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: déclarer une var tableau dont on ne connaît pas la taille Jeu 14 Juin 2012 - 14:38 | |
| Et dans ce cas, passer par une dlist par exemple pour vider le tableau avant de le supprimer puis le recharger avec les valeurs de la Dlist si on doit en garder les valeurs. Chose à ne pas négliger pour les tableaux variables même si personnellement je n'en ais pas encore le reflexe, utiliser directement une DLIST comme un tableau à taille variable selon les usages | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: déclarer une var tableau dont on ne connaît pas la taille Jeu 14 Juin 2012 - 14:41 | |
| Non, JL35, mais comme j'ai dit dans mon post précédent, il y a: dim taille 1... delete suivi de dim taille 2 ce qui équivaut à un redim. Bien sûr, les anciennes données sont perdues. S'il faut garder les données et réellement agrandir un tableau, il faut passer par une sauvegarde: - Code:
-
dim i%,n%, taille_tableau% : taille_tableau% = 30 dim mon_tableau%(taille_tableau%) ... ' on charge le tableau. ... ' on veut l'agrandir: dim sauvegarde_tableau%(taille_tableau%) for i%=0 to taille_tableau% sauvegarde_tableau%(i%) = mon_tableau%(i%) next i% delete mon_tableau% n% = 390 dim mon_tableau%(n%) for i%=0 to taille_tableau% mon_tableau%(i%) = sauvegarde_tableau%(i%) next i% delete sauvegarde_tableau% taille_tableau% = n% ...
| |
|
| |
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: déclarer une var tableau dont on ne connaît pas la taille Jeu 14 Juin 2012 - 14:43 | |
| Ben oui, ou comme dit Jicehel, le Dlist qui lui n'a pas de limite pour remplacer le tableau, on n'y pense pas assez et c'est beaucoup plus léger (élégant) comme solution. | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: déclarer une var tableau dont on ne connaît pas la taille Jeu 14 Juin 2012 - 14:56 | |
| Exact. C'est une bonne solution car l'extension est automatique. Mais deux problèmes, et de taille: tu ne peux pas avoir des cellules vides, et tu n'as qu'une dimension.
avec un tableau, tu peux faire ceci: dim x%(30),y$(20) x%(17)=3 y$(12)="abc"
Toutes les autres cellules de x% ont la valeur 0, et toutes les autres cellules de y$ contiennent une chaîne vide. Mais ces éléments sont définis. Pour faire la même chose avec un DLIST, il faut faire autant de item_add que cellules prévues, avant de pouvoir accéder à la n-ième.
Et de plus, pour remplacer une valeur dans un dlist, il faut d'abord supprimer la ligne par item_delete, puis la réinsérer au même endroit par item_insert.
La DLIST est un outil génial, mais son utilisation diffère de celle d'un tableau. Ce dernier est fait pour un accès aléatoire en lecture/écriture, alors que les DLIST sont fait pour des traitements séquentiels d'un nombre inconnu d'enregistrements (tous des chaînes de caractères, soit dit en passant, pas de flottants ou entiers sans passer par val() en lecture et str$ en écriture). | |
|
| |
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: déclarer une var tableau dont on ne connaît pas la taille Jeu 14 Juin 2012 - 14:59 | |
| Tu as raison, ce n'est pas l'idéal pour tous les cas, et il y a des impossibilités (plusieurs dimensions), ou tout au moins des difficultés, l'accès est séquentiel en écriture, ce qui n'est pas le cas du tableau. Et le contenu est alphanumérique. | |
|
| |
ambroise
Nombre de messages : 264 Localisation : Haute-Savoie Date d'inscription : 29/04/2012
| Sujet: Re: déclarer une var tableau dont on ne connaît pas la taille Jeu 14 Juin 2012 - 19:07 | |
| Merci pour toutes ces idées... Il me faut maintenant faire mon choix... | |
|
| |
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: déclarer une var tableau dont on ne connaît pas la taille Jeu 14 Juin 2012 - 22:37 | |
| Salut à tous.
Moi, n’étant pas aussi savant que vous, je déclarerais mon tableau avec une dimension très largement plus grande que ce que j’estime que mon tableau pourra contenir. C’est une solution brutale ; c’est du gâchis de la mémoire ; mais ça marche.
Si panoramic disposait du type pointeur pour permettre la gestion dynamique des données, ça sera merveilleux. Peut-être que ça ne tardera pas à venir et la nouvelle version apportera-t-elle la surprise !
| |
|
| |
ambroise
Nombre de messages : 264 Localisation : Haute-Savoie Date d'inscription : 29/04/2012
| Sujet: Re: déclarer une var tableau dont on ne connaît pas la taille Ven 15 Juin 2012 - 8:18 | |
| Bonjour,
Oui, j'y avais pensé. Mais ce n'est pas très adapté à mon programme. En effet, le tableau est construit à partir d'un nombre de données stockées dans un fichier. Et ce fichier est rempli par l'utilisateur. Et nul ne sait jusqu'où l'utilisateur pourra enrichir le fichier ! | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: déclarer une var tableau dont on ne connaît pas la taille Ven 15 Juin 2012 - 8:43 | |
| Es-tu sûr d'avoir besoin d'avoir la totalité du fichier en mémoire simultanément ? | |
|
| |
Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: déclarer une var tableau dont on ne connaît pas la taille Ven 15 Juin 2012 - 9:35 | |
| Si c'est pour ce que je pense, un enregistrement par l'utilisateur. Dans ce cas, le DLIST peut faire l'affaire (à priori, d'après les contraintes que je vois à première vue) A chaque fois que l'utilisateur rajoute quelque chose tu le rajoute dans la DLIST Comme dis plus haut, il faut choisir la solution la plus adapté à ton besoin en étudiant bien avant de quoi tu as besoin et les traitement que tu vas appliquer à ce tableau. (Eventuellement aussi comme disait Klaus, s'il enregistre de manière plus ou moins importante un certains nombre d'éléments d'une même structure, tu peux enregistrer dans un fichier chaque "éléments" quand il est fini et le transmettre à la fin avec tous les entregistrements).
| |
|
| |
Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: déclarer une var tableau dont on ne connaît pas la taille Ven 15 Juin 2012 - 9:39 | |
| Bonjour, Comme dis Klaus, si tu n'a pas besoin d'avoir la totalité du fichier en mémoire, tu peux très bien utiliser les commandes FILEBIN_#### pour créer ton fichier. après pour le chargement/sauvegarde d'un enregistrement tu utilises les commandes FILEBIN_BLOCK_###
et pour parcourir ton fichier, pour récupérer un enregistrement en particulier : FILEBIN_POSITIONEDIT : Oublie ce que j'ai écris, les commandes FILEBIN_### sont limitées à des tableaux d'octets. Ce qui est très limitatifs lorsque l'on veut sauvegarder des valeurs numériques (index de l'enregistrement suivant par exemple) et des chaines de caractères...(ou alors il faut monter une usine à gaz) | |
|
| |
Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: déclarer une var tableau dont on ne connaît pas la taille Ven 15 Juin 2012 - 10:53 | |
| Salut à tous, @Ambroise, je ne sais pas exactement ce que tu veux faire mais je te propose une alternative => pas de tableaux. C'est plus compliqué à mettre en place, mais une fois que as fait tes routines çà roule bien. - Code:
-
' Routine de recherche d'un élément (r$) dans un fichier pour en extraire ' la ligne complète, suivant sa position (pos_r) dans la ligne.Cette ligne ' est inscite dans un nouveau dlist. La routine vérifie toutes les lignes de fc$
dim r$:r$="Jean Claude":' C'est l'élément à rechercher dans fc$ dim pos_r:pos_r=3:' C'est la position de l'élément sur la ligne label rsf,rech_string_fic:' les label(s)
dim a,a$,b$,e$,ls,n,n1,n2,nba,nbe,s$:' variables pour dec_string s$="|":label dec_string
width 0,1040:list 1:width 1,500:height 1,200:label resultat:' juste pour présenter le résultat list 90:width 90,500:left 90,520:' pour travailler sur le fichier fc$ list 91:width 91,500:top 91,220:width 91,500
dim fc$:fc$="test.txt":' fichier de test label cre_fich:gosub cre_fich: ' création du fichier gosub rech_string_fic:' on fait la recherche
END: ' _________________________________________________________________________ rech_string_fic: file_load 90,fc$ for n=1 to count(90) a$=item_read$(90,n) nba=0:ls=len(a$):a=instr(a$,s$):b$=a$ e$=mid$(a$,1,a-1):if pos_r=1 then goto rsf nba=1 repeat ls=ls-a:b$=mid$(b$,a+1,ls):a=instr(b$,s$):nba=nba+1 if a=0 e$=b$ else e$=mid$(b$,1,a-1) end_if until nba=pos_r rsf: if e$=r$ then item_add 91,a$ next n if count(91)=0 then message "Rien trouvé" message " il y a "+str$(count(91))+" résultats" for n1=1 to count(91) a$=item_read$(91,n1) gosub dec_string gosub resultat next n1 return ' ====================== Pour afficher le résultat ============================= resultat: for n2=1 to nbe item_add 1,element$(n2) next n2 return ' =============== Routine de découpage des éléments d'un string =============== dec_string: nba=0:ls=len(a$):a=instr(a$,s$):b$=a$ repeat:' boucle pour compter le nb de s$ dans a$ ls=ls-a:b$=mid$(b$,a+1,ls):a=instr(b$,s$):nba=nba+1 until a=0:nbe=nba+1:if variable ("element$")=0 then dim element$(nbe):' création d'une variable par éléments => element$(n) for n=1 to nba:' boucle de fabrication de element$(n) ls=len(a$):a=instr(a$,s$): element$(n)=mid$(a$,1,a-1):a$=mid$(a$,a+1,ls):element$(n+1)=a$ next n:return ' ______________________________________________________________________________ cre_fich: if file_exists(fc$)=1 then return file_open_write 1,fc$ file_writeln 1,"01|DUPOND|Jean Marie|123 rue de la paix|75000|PARIS" file_writeln 1,"02|DURAND|Jean Claude|456 rue St Martin|06000|NICE" file_writeln 1,"03|MARTIN|Maurice|Clinchamps|61000|ALENCON" file_writeln 1,"04|D'ARC|Jeanne|Place du bucher|45000|ORLEANS" file_writeln 1,"05|LEPLUBO|Jean Claude|14 avenue de la liberté|72100|LE MANS" file_writeln 1,"06|DURAND|Victor|789 avenue de la république|72000|LE MANS" file_close 1 ' ______________________________________________________________________________
A+ | |
|
| |
ambroise
Nombre de messages : 264 Localisation : Haute-Savoie Date d'inscription : 29/04/2012
| Sujet: Re: déclarer une var tableau dont on ne connaît pas la taille Ven 15 Juin 2012 - 13:04 | |
| - Klaus a écrit:
- Es-tu sûr d'avoir besoin d'avoir la totalité du fichier en mémoire simultanément ?
Oui, la totalité. Des mots sont enregistrés dans un fichier-texte au fur et à mesure que l'utilisateur les rencontre, accompagné de leur traduction ou définition. Pour faciliter une recherche ultérieure, le programme doit les afficher par ordre alphabétique dans un list. Le programme lit le fichier, mémorise les mots dans un tableau, les range par ordre alphabétique (je me sers de la routine que tu as proposée dans l'un des post du site - MERCI KLAUS !). La taille de ce tableau est donc variable. Je suis parvenu à mes fins en lisant le fichier une première fois, incrémentant une variable à chaque nouvelle ligne lue. La variable finale me donne la taille du tableau. Je déclare le tableau. Je ferme le fichier puis le réouvre pour cette fois enregistrer les lignes dans le tableau. Je ne sais pas s'il y a mieux, quelque chose de plus rapide. J'ai lu toutes les réponses avec attention. Je m'interroge à propos de ce DLIST que je découvre. Jean-Claude, je vais étudier ton code. Merci à tous. | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: déclarer une var tableau dont on ne connaît pas la taille Ven 15 Juin 2012 - 13:19 | |
| Tu peux faire ceci: - Code:
-
dim taille%, i% dlist 1 file_load 1,"monfichier.txt" taille% = count(1) dim matable$(taille%) for i%=1 to taille% matable$(i%) = item_read$(1,i%) next i% delete 1
et le tour est joué... Tu peux même éventuellement trier la dlist 1, par la commande "sort 1", juste après "file_load...". | |
|
| |
ambroise
Nombre de messages : 264 Localisation : Haute-Savoie Date d'inscription : 29/04/2012
| Sujet: Re: déclarer une var tableau dont on ne connaît pas la taille Ven 15 Juin 2012 - 16:07 | |
| Merci pour toutes ces idées et ces astuces... Dlist cache bien des secrets et sera peut--être bien la solution ! | |
|
| |
Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: déclarer une var tableau dont on ne connaît pas la taille Ven 15 Juin 2012 - 18:18 | |
| L'astuce de Klaus est beaucoup plus simple que la mienne taille%=count(N) c'est tout bête, il fallait y penser.
@Ambroise, une astuce pour le DLIST (qui est un LIST invisible) tu peux en supprimer provisoirement le D pour visualiser ton fichier en cas de débogage.
A+ | |
|
| |
Contenu sponsorisé
| Sujet: Re: déclarer une var tableau dont on ne connaît pas la taille | |
| |
|
| |
| déclarer une var tableau dont on ne connaît pas la taille | |
|