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 Pascal Discussion :

Procédure avec paramètre sans type


Sujet :

Langage Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut Procédure avec paramètre sans type
    Bonjour à toutes et à tous,

    Je cherche à faire une procédure unique d'enregistrement de différents types de records.

    Cela veut dire que cette procédure doit accepter un paramètre "sans type" précis.

    Il me semblais avoir vu cela, mais je ne trouve rien à ce sujet. J'ai peut-être rêvé.

    Au cas où cela ne serait par un rêve, comment fait-on ?

    Cordialement.

    Pierre.

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 931
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    N'est-ce pas une syntaxe type procedure Test(const Param); ?

    Le passage en var doit également être possible.
    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 !

  3. #3
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Bonjour,

    N'est-ce pas une syntaxe type procedure Test(const Param); ?

    Le passage en var doit également être possible.
    Oui, merci, c'est effectivement ça. Je ne la retrouvais pas ça j'omettais le mot 'const' ou 'var'.

    Pour autant, je n'ai pas l'impression que cela va m'aider à résoudre mon problème.

    La procédure que je veux "généraliser est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure Enregistrer;
    var
      i: Integer;
      FchDonnees: file of TDonnees_A; // Je veux pouvoir remplacer TDonnees_A par TDonnees_B ...
    begin
      AssignFile(FchDonnees, 'Monfichier.txt');
      ReWrite(FchDonnees);
      for i:= 0 to High(MesDonnees) do
        Write(FchDonnees, MesDonnees[i]);
      CloseFile(FchDonnees);
    end;
    J'ai déjà fait quelques essais, mais sans succès. Il faudrait que je puisse passer en paramètre non pas des variables, mais des types !

    Cordialement.

    Pierre.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 934
    Par défaut
    C'est ce qui s'appelle un paramètre non typé.

    Citation Envoyé par ChPr Voir le message
    Pour autant, je n'ai pas l'impression que cela va m'aider à résoudre mon problème.
    Ça va dépendre de la façon dont le tableau est déclaré.
    Si c'est un tableau de données numériques et de chaînes de taille fixe, pas de problème puisque les données sont contiguës.
    Mais si le tableau contient des chaînes de taille variable ça ne fonctionnera pas puisque dans les faits ce sont des pointeurs.


    Citation Envoyé par ChPr Voir le message
    La procédure que je veux "généraliser est :
    La première remarque (par rapport au code de tourlourou) est qu'un paramètre non typé, eh bien on ne connaît pas sa taille ! Il faut donc au minimum un paramètre supplémentaire pour la spécifier.
    Dans le cas d'AssignFile/Rewrite, il en faudrait même deux afin de limiter la taille du fichier. Un étant le nombre d'éléments et l'autre la taille de l'élément (si la taille est omise, Rewrite la considère de 128 octets).

    La procédure serait par conséquent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure Enregistrer(const aBuffer; aItemSize, aCount: integer);
    var
      F :File;  // Fichier non typé
    begin
      AssignFile(F, 'Monfichier.dat');
     
      Rewrite(F, aItemSize);            // En spécifiant la taille d'un élément, sinon 128 octets.
      BlockWrite(F, aBuffer, aCount);   // Ce serait une erreur d'écrire seulement ici aCount*aItemSize puisque
                                        // la taille du fichier serait à l'arrivée de aCount*aItemSize*128 octets.
      CloseFile(F);
    end;
     
    // Appel
    Enregistrer(MonTableau[0], SizeOf(TUnElement), Length(MonTableau));

    Une autre approche est bien sûr par stream :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure Enregistrer(const aBuffer; aSize: integer);
    begin
      with TFileStream.Create('Monfichier.dat', fmCreate) do
      try
        WriteBuffer(aBuffer, aSize);
      finally
        Free;
      end;
    end;
     
    // Appel légèrement différent puisqu'on peut y passer la taille totale du tableau
    Enregistrer(MonTableau[0], Length(MonTableau) *SizeOf(TUnElement));
    A la lecture, il y aura une étape supplémentaire qui consistera à déterminer le nombre d'éléments dans le fichier (Taille_du_fichier div SizeOf(TUnElement)) afin d'allouer le tableau avant l'appel de la fonction "Charger".

  5. #5
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    ... Ça va dépendre de la façon dont le tableau est déclaré. ...
    Mes différents tableaux sont composés de données de type TDonnees_A, TDonnees_B ... Par 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
    TDonnees_A = record
      aa: String[128];
      bb: String[64];
      cc: Extended;
      dd: Integer;
    end;
     
    TDonnees_B = record
      aa: String[128];
      bb: String[128];
      cc: Extended;
      dd: Extended;
      ee: Integer;
      ff: Integer;
    end;
    Avec la même procédure, il faut que j'enregistre par exemple un tableau de 10 données de type TDonnees_A ou bien 20 données de type TDonnees_B.

    Est-ce que dans ce cas cela pourrait fonctionner ?

    Cordialement.

    Pierre.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 934
    Par défaut
    C'est le but

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Enregistrer(MonTableau[0], SizeOf(TDonnees_A), Length(MonTableau));
    Enregistrer(MonTableau[0], SizeOf(TDonnees_B), Length(MonTableau));
    Après, si tu comptes être compatible Windows/Linux, il faut obligatoirement remplacer ce type Extended par autre chose, double par exemple. La taille d'un Extended étant dépendante de la plateforme.

Discussions similaires

  1. Procédure : avec ou sans paramètre ?
    Par paskal++ dans le forum Langage
    Réponses: 1
    Dernier message: 13/05/2008, 00h17
  2. Problème procédure avec paramètres
    Par Aizen64 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 07/06/2007, 10h40
  3. connexion odbc avec paramètre sans prompt connect
    Par Mihalis dans le forum Bases de données
    Réponses: 11
    Dernier message: 15/05/2007, 19h19
  4. Fonction ou procédure avec paramètres optionnels ?
    Par [Silk] dans le forum Langage
    Réponses: 3
    Dernier message: 05/05/2006, 13h55
  5. [Débutant]Procédure avec paramètres entrée / sortie
    Par jeromejanson dans le forum Langage
    Réponses: 13
    Dernier message: 10/10/2005, 08h30

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