[Résolu] Invalid Memory Access sur ProcedureReturn

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

[Résolu] Invalid Memory Access sur ProcedureReturn

Message 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 ???
Dernière modification par boddhi le mar. 31/août/2010 18:33, modifié 1 fois.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Invalid Memory Access sur ProcedureReturn

Message 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
Fred
Site Admin
Messages : 2809
Inscription : mer. 21/janv./2004 11:03

Re: Invalid Memory Access sur ProcedureReturn

Message par Fred »

Le goto ne doit jamais etre utilisé à l'interieur d'un 'Select/Case' pour en sortir, ou la pile va etre corrompue
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: Invalid Memory Access sur ProcedureReturn

Message 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.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Invalid Memory Access sur ProcedureReturn

Message 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: )
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

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

Message 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.
Répondre