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 :

objet constante ne peut être passé comme paramètre Var


Sujet :

Langage Delphi

Vue hybride

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

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 527
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 527
    Par défaut objet constante ne peut être passé comme paramètre Var
    Bonjour

    Je crois me souvenir avoir vu une solution à ce "problème" que je peux facilement contourner.
    Je voudrais juste savoir si ça vous parle.
    La compilation me sort cette erreur et je pourrais bien sûr faire autrement mais la curiosité mal placée m'incite à poser la question ici.

    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
    18
    19
    20
    21
     
    procedure TFormMain.btnTestsClick(Sender: TObject);
    var
      Lst: TStringList;
      I: Integer;
     
      function test(var S: string): Boolean;
      begin
        S := 'dddd';
        Result := True;
      end;
     
    begin
      Lst := TStringList.Create;
      Lst.Add('toto');
      for I := 0 to Pred(Lst.Count) do
        begin
          test(Lst[I]);   // <------------------
        end;
      FreeAndNil(Lst);
    end;
    [dcc32 Erreur] UnitFormMain.pas(76): E2197 Un objet constante ne peut être passé comme paramètre Var
    Il n'y a pas une manière élégante de contourner ça ?

  2. #2
    Membre Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 539
    Billets dans le blog
    10
    Par défaut
    Par un pointeur

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 933
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 933
    Par défaut
    Passer la liste et l'index en paramètre : function test(aList: TStrings; aIndex :integer): Boolean;

  4. #4
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 527
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 527
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Passer la liste et l'index en paramètre : function test(aList: TStrings; aIndex :integer): Boolean;
    C'est le plus simple oui mais il me semblait qu'une longue discussion sur le sujet avait déjà été développée ici mais peut-être qu'il n'en était rien ressorti au final.
    A force de lire tout ce qui se passe ici on finit par mélanger les choses

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    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
    18
    19
    20
    21
     
    procedure TFormMain.btnTestsClick(Sender: TObject);
    var
      Lst: TStringList;
      I: Integer;
     
      function test(I: Integer): Boolean;
      begin
        Lst[I] := 'dddd';
        Result := True;
      end;
     
    begin
      Lst := TStringList.Create;
      Lst.Add('toto');
      for I := 0 to Pred(Lst.Count) do
        begin
          test(I);  
        end;
      FreeAndNil(Lst);
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 933
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 933
    Par défaut
    Le message n'est peut-être pas très bien choisi mais il n'y a pas d'alternative.

    Tu récupères en fait une copie du pointeur de chaîne (Result de TStringList.Get) et lorsque tu la modifies il est possible qu'elle soit réallouée à une adresse différente. Comment la StringList pourrait-elle le savoir

    C'est le même genre de problème que lorsque tu essaies de modifier un champ d'une propriété de type record et que tu obtiens le message "la partie gauche n'est pas affectable", tu travailles sur une copie du record et l'objet n'a pas conscience de cette modif.

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    quand on regarde à quoi correspond Lst[i] c'est assez logique en fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    property Strings[Index: Integer]: string read Get write Put; default;
    Lst[i] c'est Lst.Strings[i] (grâce à default;), soit une propriété qui possède une fonction Get et une fonction Put..donc vouloir le mettre en var serait l'équivalent de ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    function get: string;
    begin
      Result : ='toto';
    end;
     
    procedure test(var s: string);
    begin
    end;
     
    begin
      test(get);
    end;
    ce qui n'est évidemment pas possible.

    après le fait qu'on puisse écrire s := lst[i] qui appelle Get et lst[i] := s qui appelle Put peut laisser penser que c'est une valeur qu'on peut passer en "var" alors que ce sont bien deux appels totalement différents.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

+ 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. initialiser un ptr passé comme paramétre
    Par fkorbi dans le forum C
    Réponses: 2
    Dernier message: 30/04/2007, 14h09
  4. Réponses: 10
    Dernier message: 04/07/2006, 20h57
  5. Réponses: 6
    Dernier message: 03/09/2003, 10h29

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