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

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

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

oui ! oui ! c'est cool
c'etait surtout dans le GFA basic
un Gosub-return s'appelle un sous-programme dans l'absolu (procedure en GFA basic et omikron)
et une procedure, est une FONCTION !!

Publié : lun. 23/avr./2007 11:52
par Kwai chang caine
Ouf, tu me rassure
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
Malgre que j'ne donne pas toujours l'impression
Impec, comme quoi, tu vois, pour mon cas y'a peut etre l'ombre, d'une lueur d'espoir

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,
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é 
édite ce message pour comprendre comment faire
tu peux utiliser les boutons reservés a cet effet au dessus de l'éditeur 
[/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

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

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

)
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

Publié : mar. 31/juil./2007 13:07
par Kwai chang caine
Je connais pas qu'est ce qui est plus fort que "mille merci"
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())