IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Valeur d'un paramètre qui change durant l'appel


Sujet :

Langage Delphi

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut Valeur d'un paramètre qui change durant l'appel
    Bonjour à tous

    J'ai 2 composants
    Le premier o_Communication avec cette procedure:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    function o_Communication.Informe(Texte:string):boolean;//
    var Prix:double;Quantite:integer;
    begin
        result:=false;
        {...}
        Gestion.MAJ(Prix,Quantite);//Objet Gestion déclaré précédemment//ICI Prix=40 et Quantite=100
     
    end;
    et le second o_gestion avec cette procedure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    o_gestion.MAJ(const Prix:double;const Quantite:integer);
    begin
        Enregistre(Prix,Quantite);//Arrivée ici Prix=40 mais Quantite=0 !!!
    {...}
    end;

    Or quand o_Communication.Informe appelle o_gestion.MAJ, en suivant pas à pas, la variable Prix est reçue correctement, mais Quantite est toujours 0.

    J'ai pensé à une mauvaise gestion de pointeur faisant dérailler le programme, mais même en intervertissant Quantite et Prix dans la déclaration, ça donne toujours la même chose,

    Auriez-vous une idée du problème. C'est probablement évident. Mais pour le moment je ne vois rien...

    Merci d'avance

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut
    L'adresse de Quantite lors de l'appel de la procedure est ($2FA47A8) deux pas à pas plus loin elle devient au moment d'exécuter la procedure devient ($18FC84)

  3. #3
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    ton code exemple ne permet pas de comprendre le problème, mais vu que tu passes tes paramètres par valeur, il est normal que leur adresse change

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    ton code exemple ne permet pas de comprendre le problème, mais vu que tu passes tes paramètres par valeur, il est normal que leur adresse change
    Merci pour la réponse...

    Mais je ne comprends pas. Dans la procedure les variables sont déclarées constantes, donc leur adresse ne devrait pas changer. Sinon à quoi servirait de déclarer une variable "const" ? La déclarer sans devrait donner la même chose...

    Déclarer cette procedure comme suit
    procedure A(N:integer);

    serait alors strictement identique à
    procedure A(const N:integer);

    ...

    Sans oublier que la déclrarer comme suit
    procedure A(var N:integer);

    Impliquerait que lors de l'appel, il y a d'abord une copie de la variable à une nouvelle adresse qui serait exécuté, ensuite cette copie serait communiquée à la procédure à son lancement, procédure qui modifierait la valeur de la copie, et une fois la procédure exécutée, la valeur de de l'adresse de la copie modifiée serait finalement retranscrit à l'adresse originale.



    Est-ce que je me trompe?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut
    J'ai trouvé un conflit entre la valeur Quantite de l'objet appelant et celle de l'objet appelé.

    J'appelais l'objet via un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    with gestion do begin
    ...
        with Gestion do begin 
           MAJ(Prix,Quantite);//Objet Gestion déclaré précédemment//Conflit entre Quantite de Communication et Quantite de Gestion
        end;
    end;
    Quand j'inspectais la variable, il donnait la valeur de Quantite de l'objet appelant "Communication" (la bonne valeur)
    Mais lors de l'appel , il envoyait la valeur de Quantite de l'objet "Gestion" (la valeur qui allait être changé).

    Merci à tous.

    Merci à Paul qui a le dont de stimuler les neurones paresseuses.

  6. #6
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    Citation Envoyé par sgmsg Voir le message
    Merci pour la réponse...

    Mais je ne comprends pas. Dans la procedure les variables sont déclarées constantes, donc leur adresse ne devrait pas changer. Sinon à quoi servirait de déclarer une variable "const" ? La déclarer sans devrait donner la même chose...

    Déclarer cette procedure comme suit
    procedure A(N:integer);

    serait alors strictement identique à
    procedure A(const N:integer);
    du point de vue de l'appel c'est strictement identique ...dans le cas d'un Integer ... par contre s'il est constant, la procédure ne peux pas en modifier la valeur. En fait l'intérêt sur un Integer est très limité.

    si le paramètre est un String par contre, le fait de s'assurer qu'il ne sera pas modifié par la procédure permet au compilateur de transmettre la chaîne sans incrémenter son compteur de référence car il a la garantie que la procédure n'y touchera pas (ce qui peut provoquer des problèmes dans certains cas limite d'ailleurs, mais c'est un autre sujet)

    Citation Envoyé par sgmsg Voir le message

    Sans oublier que la déclrarer comme suit
    procedure A(var N:integer);

    Impliquerait que lors de l'appel, il y a d'abord une copie de la variable à une nouvelle adresse qui serait exécuté, ensuite cette copie serait communiquée à la procédure à son lancement, procédure qui modifierait la valeur de la copie, et une fois la procédure exécutée, la valeur de de l'adresse de la copie modifiée serait finalement retranscrit à l'adresse originale.



    Est-ce que je me trompe?
    pourquoi Delphi ferait-il cela ?! non avec var, c'est directement l'adresser de la variable qui est transmise.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    procedure test1(var x: Integer);
    begin
      @x = adresse 1
    end;
     
    procedure test1(x: Integer); // idem avec const
    begin
      @x = // quelque part sur la pile d'appel
    end;
     
    var
      i: Integer; // adresse 1
    begin
      test1(i); // test1(adresse 1)
      test2(i); // test2(copie i sur la pile)
    end;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 14
    Dernier message: 01/04/2020, 10h05
  2. Réponses: 1
    Dernier message: 14/04/2015, 12h35
  3. [EG] Avoir N résultat pour un paramètre qui change N fois sous SEG
    Par SASMetrics dans le forum Outils BI
    Réponses: 6
    Dernier message: 04/11/2010, 17h14
  4. Réponses: 8
    Dernier message: 18/06/2008, 17h56
  5. Réponses: 6
    Dernier message: 18/01/2007, 10h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo