Page 2 sur 7

Publié : lun. 23/avr./2007 10:13
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

Publié : lun. 23/avr./2007 10:32
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:

Publié : lun. 23/avr./2007 11:43
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

Publié : lun. 23/avr./2007 11:52
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:

Publié : lun. 30/avr./2007 20:44
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]

Publié : lun. 30/avr./2007 21:29
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

Publié : mar. 01/mai/2007 6:41
par Kwai chang caine
Exactement, un peu comme la fonction CountGadgetItems(#Gadget) pour une listbox :)

Publié : mar. 31/juil./2007 11:12
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

Publié : mar. 31/juil./2007 12:12
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())

Publié : mar. 31/juil./2007 12:25
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

Publié : mar. 31/juil./2007 12:52
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())

Publié : mar. 31/juil./2007 12:59
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.

Publié : mar. 31/juil./2007 13:03
par gnozal
J'ai ajouté un 2ème code plus élégant ... moins de Peek/Poke :wink:

Publié : mar. 31/juil./2007 13:07
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())

Publié : mar. 31/juil./2007 17:16
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())