Page 1 sur 1

[Résolu] Invalid Memory Access sur ProcedureReturn

Publié : mar. 31/août/2010 16:02
par boddhi
Bonjour à tous !

Sous PB 4.50, j'ai un code (beaucoup, beaucoup plus gros) grosso modo construit de cette manière :

Code : Tout sélectionner

Procedure.i Fc_Procedure1(Arg.i)
  Define.i ValeurRetour,Valeur
  
  Repeat
    Valeur+1
    Select Arg
      Case 3
        If Valeur>500 And Arg=3:Goto Etiq_Fc_Procedure1_Erreur:EndIf
    EndSelect
  Until Valeur=1000
  ValeurRetour=Valeur
  Goto Etiq_Fc_Procedure1_Fin

  Etiq_Fc_Procedure1_Erreur:
    ValeurRetour=-3
  Etiq_Fc_Procedure1_Fin:
    ProcedureReturn ValeurRetour
EndProcedure

Procedure.i Fc_Procedure2()
  Define.i ValeurRetour,Valeur
  Repeat
    Valeur+1
    ValeurRetour=Fc_Procedure1(Valeur)
    If ValeurRetour<0:Goto Etiq_Fc_Procedure2_Fin:EndIf
  ForEver

  Etiq_Fc_Procedure2_Fin:  
    ProcedureReturn ValeurRetour
EndProcedure

Debug Fc_Procedure2()
Le ProcedureReturn ValeurRetour de la fonction génère une erreur Invalid Memory Access.

Il semble que le problème vienne du Goto dans Select...End Select car si on enlève Select...End Select, il n'y a plus d'erreur...
Or, ce Select m'est très utile car il me permet de faire un choix sur plus de 120 possibilités...

Est-ce un bug selon vous ???

Re: Invalid Memory Access sur ProcedureReturn

Publié : mar. 31/août/2010 16:57
par Backup
non : pour moi ça n'est pas un bug !

bon faire des "Goto Etiq_Fc_Procedure1_Fin"

n'est peut etre pas le mieux !

tu sais que tu quitte proprement une procedure
des que tu fait un procedurereturn !!

pas besoin d'envoyer vers le endprocedure !

procedurereturn equivaut un endprocedure !! ;)


au lieu de

Code : Tout sélectionner

ValeurRetour=Valeur
  Goto Etiq_Fc_Procedure1_Fin

  Etiq_Fc_Procedure1_Erreur:
    ValeurRetour=-3
  Etiq_Fc_Procedure1_Fin:
    ProcedureReturn ValeurRetour
pourquoi ne fais tu pas un

Code : Tout sélectionner

ValeurRetour=Valeur
 ProcedureReturn ValeurRetour  ; <<<<<<< c'est plus simple que d'utiliser un goto non ?

  Etiq_Fc_Procedure1_Erreur:
    ValeurRetour=-3
 
   

l'architecture ideal de ta procedure devrai etre

Code : Tout sélectionner

Procedure toto (a,b)
    Select a
        Case 1
            ProcedureReturn b
        Case 2
            ProcedureReturn b*a
        Case 3
            ProcedureReturn b*a
        Case 4
            ProcedureReturn b*a
        Case 5
            ProcedureReturn b*a
        Case 6
            ProcedureReturn b*a
             ; etc .......
    EndSelect
    
    
EndProcedure

b=5
For i=1 To 6
    Debug toto (i,b)
Next i



ça te laisse un choix enorme de cette façon :)


autre chose tu fais ;

Code : Tout sélectionner

Case 3
        If Valeur>500 And Arg=3:Goto Etiq_Fc_Procedure1_Erreur:EndIf
question , pourquoi ne pas faire le traitement au lieu de sauter la bas ??

genre :

Code : Tout sélectionner

Case 3
        If Valeur>500 And Arg=3:
          ValeurRetour=-3
procedurereturn ValeurRetour
        EndIf

Re: Invalid Memory Access sur ProcedureReturn

Publié : mar. 31/août/2010 17:19
par Fred
Le goto ne doit jamais etre utilisé à l'interieur d'un 'Select/Case' pour en sortir, ou la pile va etre corrompue

Re: Invalid Memory Access sur ProcedureReturn

Publié : mar. 31/août/2010 18:31
par boddhi
Fred a écrit :Le goto ne doit jamais etre utilisé à l'interieur d'un 'Select/Case' pour en sortir, ou la pile va etre corrompue
Dont acte :)
Merci pour cette réponse rapide. Cdlt

@Dobro
Merci pour toutes tes propositions... :wink:
Le seul souci est que j'ai du code intermédiaire et conditionnel entre les Goto et ProcedureReturn et comme j'ai pas loin de 120 Case, avoir ce code intermédiaire pour chacun d'eux alourdirait le source et leur modification, si besoin, serait fastidieuse...

La solution la plus simple et raisonnable me paraît être l'emploi de If...ElseIf...EndIf en lieu et place de Select...Case...EndSelect.

Merci encore.

Re: Invalid Memory Access sur ProcedureReturn

Publié : mar. 31/août/2010 22:12
par Backup
boddhi a écrit : @Dobro
Merci pour toutes tes propositions... :wink:
Le seul souci est que j'ai du code intermédiaire et conditionnel entre les Goto et ProcedureReturn et comme j'ai pas loin de 120 Case, avoir ce code intermédiaire pour chacun d'eux alourdirait le source et leur modification, si besoin, serait fastidieuse...

La solution la plus simple et raisonnable me paraît être l'emploi de If...ElseIf...EndIf en lieu et place de Select...Case...EndSelect.

Merci encore.
ben je vois pas le probleme 8O

le code "intermediaire" pourrai etre dans une autre procedure
tu n'aurai que l'appel a cette procedure a mettre dans les cases...


en principe , on peu programmer sans goto :) ( c'est moi qui est dit ça les gars !! :lol: )

Re: [Résolu] Invalid Memory Access sur ProcedureReturn

Publié : mer. 01/sept./2010 9:40
par MLD
Salut a tous
dobro a écrit :en principe , on peu programmer sans goto ( c'est moi qui est dit ça les gars !! )
Oui c'est mieux. Le Goto est ce qui a rendu le basic aussi impopulaire dans le milieu des programmeurs professionnels,car l'utilisation de nombreux goto, produit des programmes "dit en spagéttis" qui sont difficilement débugable par un autre programmeur que celui qui l'a conçu.