Page 1 sur 1

Connaitre le nombre d'arguments (ProgramParameter)

Publié : jeu. 25/août/2005 20:07
par Dr. Dri
comme en C avec l'argc... ce serait assez pratique...

Dri

Publié : sam. 08/oct./2005 1:20
par LeCyb
Une petite boucle et un petit tableau ? :D

Publié : sam. 08/oct./2005 11:35
par Dr. Dri
bah justement si je veux mettre ca dans un tableau je ne peux pas deviner sa taille...

Dri

Publié : sam. 08/oct./2005 13:07
par lionel_om
Faut faire ça avec une LinkedList. Mais c'est vrai que ça serait cool qu'ils soient en mémoire et pas gérés de cette façon...

Publié : sam. 08/oct./2005 15:20
par LeCyb
Et voilou :)

Code : Tout sélectionner

Procedure.l GetArguments()
  Protected Total.s, Current.s, cpt.l, i.l
  Current = ProgramParameter()
  While Current <> ""
    Total + Current + Chr(9)
    cpt + 1
    Current = ProgramParameter()
  Wend

  If cpt = 0
    ProcedureReturn 0
  EndIf

  Dim Args.s(cpt)

  For i = 1 To cpt
    Args(i - 1) = StringField (Total,i,Chr(9))
  Next
  
  ProcedureReturn cpt
EndProcedure

Debug GetArguments()
Debug Args(0)
Debug Args(1)

Publié : sam. 08/oct./2005 15:23
par gansta93
Oui sous forme de ExamineParameters() qui retournerait le nombre de paramètres passés puis NextParameter() qui retournerait le paramètre.

Qu'en pensez-vous ?

Publié : sam. 08/oct./2005 19:36
par Flype
moi je fais comme çà, je trouve çà pratique (pas de global, pas de tableau, pas de liste) mais la technique tableau/liste est bien aussi :

Code : Tout sélectionner

Procedure.l GetArgC(sep.s)
  
  Shared _arg.s, _sep.s
  
  _sep.s = sep
  
  Repeat
    a$ = ProgramParameter()
    If a$
      _arg + a$ + _sep
    Else
      Break
    EndIf
  ForEver
  
  ProcedureReturn CountString(_arg,_sep)
  
EndProcedure
Procedure.s GetArgV(index.l)
  
  Shared _arg.s, _sep.s
  
  ProcedureReturn StringField(_arg,index,_sep)
  
EndProcedure

For i=1 To GetArgC(",")
  Debug GetArgV(i)
Next

Publié : sam. 08/oct./2005 19:43
par Flype
gangsta, c'est vrai que vu comme çà c vraiment plus propre, regardez :

Code : Tout sélectionner

; proposition
If ExamineParameter()
  While NextParameter()
    Debug GetParameter()
  Wend
EndIf

; actuellement
Repeat
  a$ = ProgramParameter()
  If a$
    Debug a$
  EndIf
Until a$=""

Publié : sam. 08/oct./2005 19:51
par Flype
en attendant si on faisait comme si :

Code : Tout sélectionner

Procedure.l ExamineParameter()
  
  Structure _ARGS
    i.l
    c.l
    v.s[32]
  EndStructure
  
  Shared _arg._ARGS
  
  For i=0 To 32
    
    a$ = ProgramParameter()
    
    If a$
      _arg\v[i] = a$
    Else
      _arg\c = i : Break
    EndIf
    
  Next
  
  ProcedureReturn _arg\c

EndProcedure
Procedure.b NextParameter()
  
  Shared _arg._ARGS
  
  _arg\i + 1
  
  If _arg\i < _arg\c
    ProcedureReturn #True
  EndIf
  
EndProcedure
Procedure.s GetParameter()
  
  Shared _arg._ARGS
  
  ProcedureReturn _arg\v[_arg\i]
  
EndProcedure

If ExamineParameter()
  While NextParameter()
    Debug GetParameter()
  Wend
EndIf

Publié : lun. 10/oct./2005 12:31
par lionel_om
C'est pas pratiqye ton dernier exemple car on peut pas revenir en arrière.
Ca serait mieux le meme systeme qu'en C, cad que le programme garde tout dans un tableau ou (liste) et qu'on puisse y accéder directement avec GetArg(index) et CountArg()...

Publié : lun. 10/oct./2005 20:13
par Flype
pas pratique mais pratique pour gansta93...
sinon une dernière proposition, de toutes facons c à la portée de tt le monde... chacun fait sa sauce. :twisted:

Code : Tout sélectionner

Procedure.l GetArgs() 
  
  Structure _ARGS 
    a.l:c.l:v.s[32] 
  EndStructure 
  
  Shared _arg._ARGS 
  
  For i=0 To 32
    
    _arg\v[i] = ProgramParameter() 
    
    If _arg\v[i] = ""
      Break 
    EndIf
    
    _arg\c = i
    
  Next
  
  _arg\a = 1

  ProcedureReturn _arg\c
  
EndProcedure
Procedure.l GetArgC() 
  
  Shared _arg._ARGS 
  
  If _arg\a
    ProcedureReturn _arg\c
  Else
    ProcedureReturn GetArgs()
  EndIf
  
EndProcedure
Procedure.s GetArgV(i.l) 
  
  Shared _arg._ARGS 
  
  ProcedureReturn _arg\v[i]
  
EndProcedure

For x=0 To GetArgC()
  Debug GetArgV(x) 
Next

For x=0 To GetArgC()
  Debug GetArgV(x) 
Next