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 :

Créer un tableau lors de l'appel d'une fonction


Sujet :

Langage Delphi

  1. #1
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2003
    Messages : 422
    Points : 243
    Points
    243
    Par défaut Créer un tableau lors de l'appel d'une fonction
    Bonjour,

    J'ai une fonction qui nécessite un tableau dans ses paramètres, et j'aimerais pouvoir créer ce tableau lors de l'appel de la fonction.

    Voici la situation actuelle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure maProcedure();
    var
      tab: Array of Variant;
    begin
      setlength(tab, 1) ;
      tab[0] := 5 ;
      maFonction(tab) ;
    end ;
     
    procedure maFonction (var tab: Array of variant);
    begin
    end ;
    Ce qui me gêne dans ce code, c'est qu'il me faut déclarer mon tableau dans les var, puis faire un setlength et affecter les valeurs avant d'appeler ma fonction.

    J'aimerais donc savoir si en Delphi il est possible de procéder d'une façon un peu comme celle ci-dessous, en créant le tableau lors de l'appel de la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure maProcedure();
    begin
      maFonction([5]) ;
    end ;
     
    procedure maFonction (var tab: Array of variant);
    begin
    end ;

  2. #2
    Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 76
    Points : 67
    Points
    67
    Par défaut
    non on ne peut pas le faire directement... par contre tu as une solution intermédiaire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    procedure blabla();
    var
      a: array of Variant;
    begin
      MaFonction(a);
    end;
     
    procedure MaFonction(var tab: array of Variant);
    begin
      SetLength(tab, 1);
      tab[0] := 5;
    end;

  3. #3
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2003
    Messages : 422
    Points : 243
    Points
    243
    Par défaut
    Le but c'est justement de pouvoir envoyer un tableau comportant n'importe quoi à la fonction, donc je n'ai pas la possibilité de remplir le tableau après y être entré.

    Je suis donc vraiment obligé de toujours déclarer le tableau avant de l'envoyer dans ma fonction ? Pourtant d'autres langages permettent ce genre de concision....

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 865
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 865
    Points : 11 334
    Points
    11 334
    Billets dans le blog
    6
    Par défaut
    pour que ça marche pê faut-il que tu déclares le tableau en const :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    procedure maFonction (const tab: Array of variant); 
    begin 
    end ;
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  5. #5
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Mais si, tu devrais y arriver.

    Dans l'aide Delphi, ça s'appelle les Paramètres sans type.

    Va donc jeter un oeil sur la Doc.

    Des exemples sont :
    - la fonction Copy (pour recopier le contenu d'un tableau)
    - la proceure SetLength (pour redimensionner un tableau dynamique)
    Bidouilleuse Delphi

  6. #6
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2003
    Messages : 422
    Points : 243
    Points
    243
    Par défaut
    Ok, donc j'ai regardé un peu ces paramètres sans type, et effectivement ça devrait m'être bien utile.

    Mais j'ai encore un problème : je créé mon 'Array of Variant' et appelle ma fonction en le passant en paramètre, mais après je ne parviens pas à le caster pour l'utiliser :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public
      tab: array of Variant ;
     
    procedure MaFonction(var tab); 
    begin 
      self.tab := array of variant(tab) ;
    end;
    Débutant avec Delphi, je ne sais pas comment je peux caster un tableau de variant, mon transtypage est certainement erroné. Qqn peut me donner un coup de main avec ça ?

  7. #7
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Salut, d'abord il faut que tu crée un Type qui soit un array of Variant, comme ça par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      Type
         TArrayOfVar=array of Variant;
    Tout comme l'aide Delphi sur le sujet où est déclaré un Type tableau d'entier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    type
      TBytes = array[0..MaxInt - 1] of Byte;
    Après pour caster et utiliser le tableau il suffit de faire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       TArrayOfVar(tab)[2]:='Bonjour';
       TArrayOfVar(tab)[2]:=5;
    Sinon, revenons sur tes interrogations, hier j'ai lu ton thread en Diagonale, j'avais peu de temps devant moi et certains éclaircissement semblent indispensables étant donné qu'après avoir relu, il me semble t'avoir en voyé sur une fausse piste :

    Tu as dis...
    J'ai une fonction qui nécessite un tableau dans ses paramètres, et j'aimerais pouvoir créer ce tableau lors de l'appel de la fonction.
    ...
    J'aimerais donc savoir si en Delphi il est possible de procéder d'une façon un peu comme celle ci-dessous, en créant le tableau lors de l'appel de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure maProcedure();
    begin
      maFonction([5]) ;
    end ;
    La réponse est oui !

    par exemple,avec un tableau de variants :
    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 maProcedure();
    begin
      maFonction([5,'Bonjour',True]) ;
    end ;
     
    procedure maFonction (var tab: Array of variant);
    var i:integer;
         s:string;
         b:boolean;
    begin
       i:=tab[0];
       s:=tab[1];
       b:=tab[2];
     
       //affiche bonjour
       ShowMessage(s);
    end ;
    Un autre exemple avec un tableau de string :
    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
    22
    23
    24
    procedure maProcedure();
    begin
      Affiche(['Bonjour','tout','le','monde']) ;
      Affiche(['Salut','tout','seul']);
    end ;
     
    procedure Affiche(var Mots: Array of string);
    var i:integer;
         NbreElements:integer;
        Phrase:string;
    begin
       //low(Mots) renvoie l'indice de tableau le plus bas (0)
       /high(Mots) renvoie l'indice de tableau le plus élevé (Nbre éléments-1)
     
       NbreElements:=hugh(Mots)-low(Mots)+1;
     
       //Construit une Phrase à partir des mots du tableau
       Phrase:='';
       for i:=low(Mots) to high(Mots) do
          Phrase:=Phrase+Mots[i]+' ';
     
       //affiche Phrase
       ShowMessage(InttoStr(NbreElements)+' mots ==> '+Phrase);
    end ;

    Après une autre technique qui peut t'être utile à connaître avec Delphi, c'est comment réaliser une fonction "Polymorphique" qui puisse accepter comme des paramètres différents. par exemple une fonction ou une procedure que l'on pourrait utiliser indiféremment comme ça (en vis à vis j'ai mis les paramètres) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    begin
       MaFonction(5,10);  //MaFonction(A,B:integer);
       MaFonction('Salut !'); //MaFonction(S:string);
       maFonction([5,'Bonjour',True]) ; //MaFonction(var tab: Array of variant);
    end;
    Dans ce cas, on définit chaque fonction de façon indépendante en rajoutant la directive overload après leur ligne de déclaration :

    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
    22
    23
    24
    25
    26
    27
    28
    29
     
    procedure MaFonction(A,B:integer); overload;
    begin
      ShowMessage(InttoStr(A)+'+'+InttoStr(B)+'='+InttoStr(A+B));
    end;
     
    procedure MaFonction(S:string); overload;
    begin
      ShowMessage(S);
    end;
     
    procedure MaFonction(var Mots: Array of Variant); overload;
    var i:integer;
         NbreElements:integer;
        Phrase:string;
    begin
         //low(Mots) renvoie l'indice de tableau le plus bas (0)
       /high(Mots) renvoie l'indice de tableau le plus élevé (Nbre éléments-1)
     
       NbreElements:=hugh(Mots)-low(Mots)+1;
     
       //Construit une Phrase à partir des mots du tableau
       Phrase:='';
       for i:=low(Mots) to high(Mots) do
          Phrase:=Phrase+Mots[i]+' ';
     
       //affiche Phrase
       ShowMessage(InttoStr(NbreElements)+' mots ==> '+Phrase);
    end ;
    Dans ce cas tu trouveras des explications supplémentaires dans l'aide Delphi, à la rubrique Redéfinition de procédures et de fonctions

    Voilà, voilà, j'espère que tout ça pourra t'aider à construire des Procédures et fonctions TRES génériques.
    Bidouilleuse Delphi

  8. #8
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2003
    Messages : 422
    Points : 243
    Points
    243
    Par défaut
    Ok, merci pour toutes tes informations. C'est drôle puisqu'au début j'avais instinctivement essayé de faire de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    appelMaFonction([int1, int2]);
    Mais j'étais resté devant un message d'erreur, donc j'avais pensé que ce n'était pas la bonne méthode.

    Par contre je retombe face au même message d'erreur qui m'avait bloqué au début, et j'ai à nouveau besoin d'un coup de main

    Voici la situation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    const
      maConstante = 1 ;
    .....
    maFonction(maConstante, [param1, param2]) ;
     
    procedure maFonction(numero: integer; params: var Array of variant) ;
    begin
    end ;
    J'obtiens le message
    Constant object cannot be passed as var parameter
    Je présume donc que c'est la constante qui pose problème, bien que ce ne soit pas elle qui soit un 'var parameter'.
    Je suis obligé de la passer comme argument dans maFonction, alors comment faire ?

  9. #9
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Je commence un peut mieux à cerner ton problème...
    En fait tu souhaiterais passer un tableau de paramètres à ta fonction, de n'importe quelle longueur, avec la possibilité de modifier ces paramètres ?
    Bref il faut être plus précis sur ton objectif, mais j'espère pouvoir te devancer sur tes souhaits...

    Sinon, si d'autres langages permettent ce que tu désire réaliser, c'est sans doute parce que ces langages ne sont pas compilés (PHP,pearl,etc..).


    Attention le var là dedans :
    procedure maFonction(numero: integer; params: var Array of variant) ;
    var, se met AVANT le nom de la variable ! (d'ailleurs, excuses moi, je me suis aussi trompé dans mon précédent post )

    procedure maFonction(numero: integer; var params:Array of variant) ;
    Ensuite, si tu mets le mot var, Delphi attends une variable, pas un tableau de variables que tu peux modifier !!!

    Donc 3 possibilités s'offrent à toi à partir de là :
    1) Dans maFonction tu utilises les paramètres transmis par ton tableau en tant que valeurs non modifiables.
    2) tu souhaites pouvoir modifier ces paramètres dans maFonction , et les récupérer au retour de la procedure :
    a) Tu acceptes de déclarer un tableau de Variant dans la procedure qui appelle maFonction. Puis tu récupères les valeurs modifiées après cet appel
    b) tu ne souhaites pas déclarer un tableau de Variant, alors il faut utiliser un tableau de pointeurs de Variant.

    Possibilité 1)
    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
     
    const
      maConstante = 1 ;
    .....
    begin
      maFonction(maConstante, [param1, param2]) ;
      //Param1 et param2 n'ont pas changés
    end;
     
    procedure maFonction(numero: integer; params:Array of variant) ;
    var s:string;
    begin
      s:=params[0]; //autorisé (lecture seule)
      params[0]:='Bonjour'; //absolument interdit !
    end ;
    Possibilité 2.a)
    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
     
    const maConstante = 1 ;
    var tab:array of variant;
         Param1,Param2:string;
    begin
      Param1:='Bonjour';
     
      //creation d'un tableau de variant sans SetLength ni affectations fastidieuse)
      //(ca peut t'intéresser)
      tab:=VarArrayOf([param1, param2]);
      maFonction(maConstante, tab);
      Param1:=tab[0];
      Param2:=tab[1];
      ShowMessage(Param1);
    end;
     
    procedure maFonction(numero: integer;var params:Array of variant) ;
    begin
      params[0]:='Salut';
    end ;



    Possibilité 2.b)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    const maConstante = 1 ;
    var Param1,Param2:Variant;
    begin
      Param1:='Bonjour';
      maFonction(maConstante, [@param1, @param2]);
      ShowMessage(Param1);
    end;
     
    procedure maFonction(numero: integer;params:Array of PVariant) ;
    begin
      params[0]^:='Salut';
    end ;

    J'espère t'avoir aidé...
    Bidouilleuse Delphi

  10. #10
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2003
    Messages : 422
    Points : 243
    Points
    243
    Par défaut
    Merci, j'ai encore dû résoudre 1 ou 2 petits problèmes pour passer les paramètres du Array of variant à ma fonction, mais c'était lié à mon programme et non à ta solution.

    Maintenant tout fonctionne correctement grâce à ta solution, merci

  11. #11
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par MiJack
    Merci, j'ai encore dû résoudre 1 ou 2 petits problèmes pour passer les paramètres du Array of variant à ma fonction, mais c'était lié à mon programme et non à ta solution.

    Maintenant tout fonctionne correctement grâce à ta solution, merci
    Par curiosité, laquelle (de solution) as tu choisi ?
    Bidouilleuse Delphi

  12. #12
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2003
    Messages : 422
    Points : 243
    Points
    243
    Par défaut
    Citation Envoyé par waskol
    Par curiosité, laquelle (de solution) as tu choisi ?
    La 1

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

Discussions similaires

  1. IE7 lors de l'appel d'une fonction JS
    Par foued_scorpion dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 21/04/2007, 14h19
  2. Erreur lors de l'appel d'une fonction
    Par larimoise dans le forum MATLAB
    Réponses: 6
    Dernier message: 21/04/2007, 11h02
  3. Réponses: 3
    Dernier message: 13/12/2006, 16h01
  4. Réponses: 2
    Dernier message: 09/01/2006, 09h38
  5. Réponses: 5
    Dernier message: 06/01/2006, 11h41

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