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 :

Passage d'un paramètre tableau dynamique dans une procédure


Sujet :

Delphi

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Passage d'un paramètre tableau dynamique dans une procédure
    Bonjour,

    Je m'interroge sur le passage d'un tableau dynamique comme paramètre d'une procédure. Jusqu'à présent, je croyais qu'il n'était pas nécessaire, dans la déclaration de la procédure, de faire précéder le paramètre de la mention "var" pour que ce dernier soit transmis par référence (le tableau dynamique étant en fait un pointeur).

    Autrement dit, les déclarations :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    type TTabInt = array of Integer;
    procedure AjoutElement(Tab: TTabInt; Elem: Integer);
    devaient, selon moi, permettre de modifier le tableau transmis comme paramètre de la procédure AjoutElement. C'est en particulier ce qui ressort du "Reference Developer Studio 2006 - Guide du langage Delphi" (pp. 159-160) fourni avec Turbo Delphi 2006 (la version que j'utilise).

    Or, à ma grande surprise, une telle syntaxe ne permet pas de modifier le tableau transmis en paramètre (on récupère en sortie exactement le tableau fourni en entrée !). Autrement dit, tout se passe comme si le passage du tableau se faisait par valeur (Delphi gérerait une recopie complète du tableau ??).

    En revanche, l'utilisation de la syntaxe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure AjoutElement(var Tab: TTabInt; Elem: Integer);
    permet bien de modifier le tableau fourni en paramètre.

    Ma question est donc la suivante : y'a-t-il eu dans les dernières versions de Delphi des évolutions au niveau des conventions de passage des paramètres de type pointeur dans les procédures et les fonctions ?
    Y'a-t-il éventuellement une variable d'environnement à ajuster, afin de revenir à un fonctionnement conforme à ce qui est décrit dans la documentation du logiciel ?

    Je vous remercie par avance pour toute info utile sur ce sujet.

  2. #2
    Expert éminent sénior

    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 : 34
    Localisation : Suisse

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Citation Envoyé par Paul Morphy
    Or, à ma grande surprise, une telle syntaxe ne permet pas de modifier le tableau transmis en paramètre (on récupère en sortie exactement le tableau fourni en entrée !). Autrement dit, tout se passe comme si le passage du tableau se faisait par valeur (Delphi gérerait une recopie complète du tableau ??).
    Le passage d'un tableau se fait effectivement toujours par référence, mais s'il n'est pas var, Delphi génère du code pour recopier intégralement le tableau, puis passe l'adresse de ce nouveau tableau à la procédure.

    S'il est var, alors c'est l'adresse du tableau de base qui est passée.

    Enfin, s'il est const, alors c'est aussi l'adresse du tableau initial qui est passée, mais le compilateur empêche le tableau paramètre d'être modifié dans la fonction.

    C'est exactement la même chose qui se passe pour les record, pour les chaînes courtes (ShortString et string[x]), et presque la même chose pour les chaînes longues.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci pour votre réponse, au moins, je sais à quoi m'en tenir (et accessoirement, ça m'aura permis de comprendre la subtile différence entre l'utilisation ou non du const).
    Petite question supplémentaire: pour un objet, ça se passe comment ? Si on n'utilise pas le var, est-ce qu'il passe directement l'adresse, ou est-ce qu'il recopie l'objet (comme pour un tableau) ?

  4. #4
    Expert éminent sénior

    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 : 34
    Localisation : Suisse

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Les variables de type objet sont des pointeurs sur les objets correspondant, donc font 4 octets, donc ils sont toujours passés par valeur.
    Cependant c'est bien le pointeur objet qui est recopié, donc si tu modifies l'objet référencé dans la méthode, il s'agit du bien de l'objet initial, donc les modifications sont gardées.

    Par contre, si tu modifies la référence contenue dans la variable paramètre, celle-ci ne sera pas changée dans la routine appelante - sauf en cas de var.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    OK, c'est clair !
    Merci encore, et Meilleurs Voeux pour 2007 !

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

Discussions similaires

  1. [Conception] Insertion de champs d'un tableau dynamique dans une base de données
    Par loreleï85 dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 12/05/2011, 14h39
  2. Réponses: 1
    Dernier message: 27/05/2008, 11h20
  3. [SQL] Modification de champs d'un tableau dynamique dans une base de données
    Par loreleï85 dans le forum PHP & Base de données
    Réponses: 18
    Dernier message: 27/06/2006, 16h55
  4. Réponses: 1
    Dernier message: 23/06/2006, 11h19
  5. Réponses: 9
    Dernier message: 22/06/2006, 20h06

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