Comment connaitre le nombre d'élément d'un tableau [Résolu]

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

ce que j'ai dit, c'est qu'une procedure est plus longue, car elle laisse des parametres sur la pile, puis ensuite au retour remet la pile en etat
et ceci prends du temps !

ce problème est amoindri avec les gosub-return
donc il sont plus rapide :D
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Bonjour DOBRO

Bah, c'est bien ce que j'ai dit que t'avais dit non ?? 8O
Tu m'avais parlé aussi de l'histoire que dans les anciens basic les procedures c'etait gosub, return etc ... et que dans pure on appellait une procedure quelque chose qui etait plutot une instruction.

Donc mon podium il est bon non ???

Ou alors, j'ai encore rien compris comme dab :oops:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Kwai chang caine a écrit :Bonjour DOBRO

Bah, c'est bien ce que j'ai dit que t'avais dit non ?? 8O
Tu m'avais parlé aussi de l'histoire que dans les anciens basic les procedures c'etait gosub, return etc ... et que dans pure on appellait une procedure quelque chose qui etait plutot une instruction.

Donc mon podium il est bon non ???

Ou alors, j'ai encore rien compris comme dab :oops:
oui ! oui ! c'est cool :D

c'etait surtout dans le GFA basic

un Gosub-return s'appelle un sous-programme dans l'absolu (procedure en GFA basic et omikron) :D

et une procedure, est une FONCTION !! :D
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Ouf, tu me rassure :D

Je n'aurais jamais voulu déformer un de tes propos, mais bien au contraire dire que tu m'en avais déjà parlé aussi pour les gosub.
Il me semblait bien que c'etait avec le GFA, car j'en avais un vaste souvenir quand je le programmais aussi.

Mais quand on est pas sur, vaut mieux fermer ......

La preuve que j'ecoute attentivement ce que vous m'enseigner tous :wink:
Malgre que j'ne donne pas toujours l'impression :oops:

Impec, comme quoi, tu vois, pour mon cas y'a peut etre l'ombre, d'une lueur d'espoir :lol: :lol:
RV
Messages : 209
Inscription : sam. 18/nov./2006 15:16

Message par RV »

Salut Kwai chang caine

Je reviens au début de ton post et ne comprends pas ou tu peux avoir un problème, à part si je suis hors sujet.
Moi aussi j'utilise le tableau à 1 colonne (Dim a.s(100)) et pour connaître le nombre de lignes utilisées j'opère ainsi :

Code : Tout sélectionner

    nbmax.l=0
    Dim a.s(100)

    nbmax=nbmax+1:a(nbmax)="premier"
    nbmax=nbmax+1:a(nbmax)="second"
    nbmax=nbmax+1:a(nbmax)="troisième"
et pour lire le tout,

Code : Tout sélectionner

    For i=1 To nbmax
         debug a(i)
    Next i
pareil si tu lis les données d'un fichier

Code : Tout sélectionner

    nbmax=0
    If ReadFile(1,fichier$)
        Repeat
            nbmax=nbmax+1
            a(nbmax)=ReadString(1)
        Until Eof(1)
    EndIf
nbmax te donne la dernière ligne utilisée.


Je suis hors sujet, nan?


[Modo] utilise les balises code lorsque tu pote un code
et Quote lorsque tu poste un text cité :D

édite ce message pour comprendre comment faire
tu peux utiliser les boutons reservés a cet effet au dessus de l'éditeur
:D
[/Modo]
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

RV a écrit : Je suis hors sujet, nan?
non tu n'es pas hors sujet, Kwai voulais une fonction plus rapide
que de devoir parcourir tout le tableau pour connaître le nombre d'éléments :D
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Exactement, un peu comme la fonction CountGadgetItems(#Gadget) pour une listbox :)
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Bonjour à tous

Décidément ces tableaux ........ :? Y m'énerve, y m'énerve, comme dirait les freres bario (Pour ceux qui ont connu :wink:)

Comment feriez vous pour mettre ce code dans une procedure:

Code : Tout sélectionner

Dim Tablo.s(10)

Tablo(0) = "0"
Tablo(1) = "1"
Tablo(2) = "2"
Tablo(3) = ""
Tablo(4) = "4"
Tablo(5) = ""
Tablo(6) = ""
Tablo(7) = ""

For i = 1 To PeekL(@Tablo() - 8) - 1
 If Tablo(i) <> ""
  DernierElement = i
 EndIf
Next

Debug DernierElement
Du style:

Code : Tout sélectionner

Dim Tablo.s(10)

Tablo(0) = "0"
Tablo(1) = "1"
Tablo(2) = "2"
Tablo(3) = ""
Tablo(4) = "4"
Tablo(5) = ""
Tablo(6) = ""
Tablo(7) = ""

Procedure DernierElementTablo(Tablo)
 Le code du dessus
Endprocedure

Debug DernierElementTablo(Tablo)
Merci pour votre aide
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message par gnozal »

Kwai chang caine a écrit :Comment feriez vous pour mettre ce code dans une procedure ?

Code : Tout sélectionner

Procedure UBound(*Array)
  ProcedureReturn PeekL(*Array - 8) - 1
EndProcedure

Dim Tablo.s(10)

Tablo(0) = "0"
Tablo(1) = "1"
Tablo(2) = "2"
Tablo(3) = ""
Tablo(4) = "4"
Tablo(5) = ""
Tablo(6) = ""
Tablo(7) = ""

Debug UBound(Tablo())
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Bonjour GNOZAL

Merci de ton aide. 8)
Mais ce n'est pas tout a fait ce que je voulais.

Ton code me donne le dimensionnement du tableau = 10
Alors que le miens donne le dernier enregistrement = 4

Je sais que cette fonction n'existe pas dans PURE, on en a parlé au début de ce POST. :cry:

Alors j'ai fait ce bout de code qui se "paluche" tous le tableau afin de trouver le dernier enregistrement, meme si le tableau est beaucoup plus grand.
Ce que je n'arrive pas à faire, c'est passer le tableau dans la procedure pour pouvoir le lire et en ressortir le dernier enregistrement, puis retourner le chiffre 4

Encore merci
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message par gnozal »

Kwai chang caine a écrit :Bonjour GNOZAL

Merci de ton aide. 8)
Mais ce n'est pas tout a fait ce que je voulais.
Je pensais que tu voulais un UBound sous forme de procédure.
C'est çà que tu voulais ?

Avec Peek / Poke

Code : Tout sélectionner

Procedure.l UBound(*Array)
  ProcedureReturn PeekL(*Array - 8) - 1
EndProcedure

Procedure.l DernierElementTablo(*Array)
  Protected i.l, DernierElement.l, *AddresseChaine
  For i = 0 To UBound(*Array)
    *AddresseChaine = PeekL(*Array + i * 4)
    If *AddresseChaine
      If PeekS(*AddresseChaine) <> ""
        DernierElement = i
      EndIf
    EndIf
  Next
  ProcedureReturn DernierElement
EndProcedure


Dim Tablo.s(10)

Tablo(0) = "0"
Tablo(1) = "1"
Tablo(2) = "2"
Tablo(3) = ""
Tablo(4) = "4"
Tablo(5) = ""
Tablo(6) = ""
Tablo(7) = ""

Debug DernierElementTablo(Tablo())
ou encore :

Avec astuce de pointeurs

Code : Tout sélectionner

Procedure.l UBound(*Array)
  ProcedureReturn PeekL(*Array - 8) - 1
EndProcedure

Structure StringArray
  s.s[0]
EndStructure

Procedure.l DernierElementTablo(*Array)
  Protected i.l, DernierElement.l, *TempArray.StringArray
  *TempArray = *Array
  For i = 0 To UBound(*Array)
    If *TempArray\s[i] <> ""
      DernierElement = i
    EndIf
  Next
  ProcedureReturn DernierElement
EndProcedure

Dim Tablo.s(10)

Tablo(0) = "0"
Tablo(1) = "1"
Tablo(2) = "2"
Tablo(3) = ""
Tablo(4) = "4"
Tablo(5) = ""
Tablo(6) = ""
Tablo(7) = ""

Debug DernierElementTablo(Tablo())
Dernière modification par gnozal le mar. 31/juil./2007 13:07, modifié 3 fois.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

OOOOOOO OYOYO OYOYO !!! (Extrait du livre de la jungle :lol: )

C'est exactement ce que je voulais.
Je crois que je te l'ai deja dit, mais ça fait rien, c'est tellement bon :

Tu es un ange

Mille merci GNOZAL.
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message par gnozal »

J'ai ajouté un 2ème code plus élégant ... moins de Peek/Poke :wink:
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Je connais pas qu'est ce qui est plus fort que "mille merci" :D

Dis voir c'est pas genant si je modifie ton code pour que y'ai "tout le jus dedans" ma/ta procedure :

Code : Tout sélectionner

Procedure.l DernierElementTablo(*Array) 
 
 Structure StringArray 
  s.s[0] 
 EndStructure 
 
 Protected i.l, DernierElement.l, *TempArray.StringArray 
 *TempArray = *Array 
 
 For i = 0 To PeekL(*Array - 8) - 1 
  If *TempArray\s[i] <> "" 
   DernierElement = i 
  EndIf 
 Next 
 
 ProcedureReturn DernierElement 

EndProcedure 

Dim Tablo.s(10) 

Tablo(0) = "0" 
Tablo(1) = "1" 
Tablo(2) = "2" 
Tablo(3) = "" 
Tablo(4) = "4" 
Tablo(5) = "" 
Tablo(6) = "2" 
Tablo(7) = "" 

Debug DernierElementTablo(Tablo())
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

La méthode employée par Gnozal liste tous les éléments du tableau, ce qui n'est pas nécessaire, la logique voudrait qu'on parte de la fin et que l'on s'arrête au premier élément non vide trouvé.
Aussi dim ..(10) donne 11 éléments pourquoi s'amuser à retrancher 1 élément?

Code : Tout sélectionner

Procedure.l UBound(*Array)
  ProcedureReturn PeekL(*Array - 8)
EndProcedure

Structure StringArray
  s.s[0]
EndStructure

Procedure.l DernierElementTablo(*Array)
  Protected i.l, DernierElement.l, *TempArray.StringArray
  *TempArray = *Array
  For i =UBound(*Array) To 0 Step -1
    If *TempArray\s[i] <> ""
      DernierElement = i
      Break
    EndIf
  Next
  ProcedureReturn DernierElement
EndProcedure

Dim Tablo.s(10)

Tablo(0) = "0"
Tablo(1) = "1"
Tablo(2) = "2"
Tablo(3) = ""
Tablo(4) = "4"
Tablo(5) = ""
Tablo(6) = ""
Tablo(7) = ""
Debug DernierElementTablo(Tablo())
Répondre