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

Delphi Discussion :

Impossibilité de paramètre Var


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti

    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 20
    Par défaut Impossibilité de paramètre Var
    Bonjour,
    En développant en POO avec Delphi, du moins en essayant, je suis arrivé au message d'erreur suivant :
    "un objet constante ne peut être passé comme paramètre var"
    Voici le code (d'exemple)
    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
     
    type
      Monstre = class
      end;
     
      Piece = class
      private
        _m : Monstre;
      public
        property m : Monstre read _m write _m;
      end;
     
      Heros = class
      public
        procedure combattre(var M : Monstre);
      end;
    Et voici, un extrait de son utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    var
      her : Heros;
      p : Piece;
    begin
    //instanciation puis
    her.combattre(p.m);
    //puis libération
    C'est sur her.combattre(p.m) (où p est une pièce, et m la property) que le compilateur bloque avec le message d'erreur "un objet constante ne peut être passé comme paramètre var"...

    Pourquoi ? Passer par une property empêche donc de fournir une variable par adresse ?

    Par la suite, j'ai enlevé le paramètre en tant que var (passage par adresse), et là surprise, en enlevant var, l'objet a quand même été passé par adresse !
    Bref, il y a anguille sous roche ! Auriez-vous une explication ?

    Merci d'avance, Jacques

  2. #2
    Membre Expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Par défaut
    Bonjour,

    Une propriété ne peut pas être considérée comme une variable mais plus comme un "pointeur" vers un attribut d'un objet.

    @++

  3. #3
    Membre averti

    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 20
    Par défaut
    Merci.
    On n'a donc pas besoin de var... s'il s'agit d'un "pointeur"... [un pointeur bien particulier quand même]

    Est-ce que le code proposé vous paraît "valide" ou seriez-vous amené à faire autrement pour combattre ce monstre (qui est contenu dans une pièce) ?
    A+, Merci encore, Jacques

  4. #4
    Expert confirmé

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Par défaut
    Citation Envoyé par doustij
    Merci.
    On n'a donc pas besoin de var... s'il s'agit d'un "pointeur"... [un pointeur bien particulier quand même]

    Est-ce que le code proposé vous paraît "valide" ou seriez-vous amené à faire autrement pour combattre ce monstre (qui est contenu dans une pièce) ?
    A+, Merci encore, Jacques
    Ben c'est-à-dire que je ne vois pas pourquoi tu utilises un paramètre var justement. Sais-tu qu'un objet (instanciation d'une classe) est lui un pointeur réel ? Et que donc la modification des propriétés du paramètre M va changer les mêmes propriétés de p.m (puisque c'est la même zone mémoire).
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  5. #5
    Membre averti

    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 20
    Par défaut
    Tentative de résumé :

    Une procedure avec un paramètre var est capable de modifier le contenu pointé. Il s'agit d'un passage par adresse. Cela sert notamment pour modifier des réels, etc.

    Un objet (une instance de classe) est un pointeur. Le passage d'un objet comme paramètre se fait automatiquement par adresse.

    Le monstre est un objet; Il n'a donc pas besoin d'être passé en var (il l'est automatiquement).
    Les deux procedures suivantes sont donc équivalentes :
    procedure Heros.Combattre(M : Monstre)
    procedure Heros.Combattre(var M:Monstre)
    (ces deux procédures sont d'ailleurs acceptées par Delphi)

    Quand je passe une property d'un objet en paramètre, celle-ci est également transmise par adresse.
    Si je voulais faire un passage par valeur (uniquement) d'un objet ou d'une property, il faudrait d'abord que je clone cet objet (ou cette property) pour avoir une instance différente.

    Est-ce juste ? Y a-t-il des erreurs ?
    Merci pour vos réponses Jacques

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Par défaut
    Il ya bien passage par valeur mais dans le cas de la transmission d'un objet la valeur est une adresse.
    Si l'on ne souhaite pas modifier l'objet pointé il est préférable d'utiliser le mot clé const.

  7. #7
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Bonjour,

    Difficile à formuler, mais tout à fait normal.

    Supposons que notre procedure utilise un paramètre Var
    La procédure va modifier le contenu pointé par l'adresse passée en paramètre.

    Il est impossible de passer la property d'un objet en tant que Var, car la procédure ne connaissant pas l'objet ne pourra pas appeler la procedure Write de la property.

    Si la property est elle-même un objet, inutile de la passer en var : ce qui est cloné est l'adresse de l'objet, mais cette adresse pointera évidemment sur les mêmes données que l'objet initial.

    Donc, en règle générale, on ne passe pas un objet en var lorsqu'on désire seulement manipuler les données. On utilisera le var seulement lorsqu'on veut retourner une instance différente de l'objet.

    Désolé, j'ai pas été très inspiré sur la formulation, c'est peut-être pas très clair.

    modifiables ce qui n'.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 19/08/2010, 17h17
  2. Réponses: 3
    Dernier message: 04/01/2010, 19h32
  3. Réponses: 2
    Dernier message: 10/09/2007, 08h58
  4. Réponses: 10
    Dernier message: 04/07/2006, 20h57
  5. Réponses: 4
    Dernier message: 20/05/2006, 21h41

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