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

Lazarus Pascal Discussion :

Avertissement ou erreur avec New pointeur [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre chevronné

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Points : 1 884
    Points
    1 884
    Par défaut Avertissement ou erreur avec New pointeur
    Bonjour à tous.

    Avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    type
        PMyClass = ^TMyClass;
        TMyClass = class
            // ...
         end;
    Pour créer un pointeur sur une instance de TMyClass, j'ai toujours fait comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var
       MyClass: TMyClass;
       P: PMyClass;
    begin
      MyClass:= TMyClass.Create;
      // ...  
      New(P);
      P^:= MyClass;
      //...
    end;
    J'obtiens un warning : use extended syntax of NEW and DISPOSE for instance of objects

    Si j'utilise la syntaxe étendue de NEW, j'obtiens une erreur : The extended syntax of new or dispose isn't allowed for a class
    Faudrait savoir !!!

    Par contre, en redéfinissant : MyClass = object , la syntaxe étendue marche.

    Merci d'avance.
    Cordialement
    Thierry

  2. #2
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Salut Thierry il y un directive à cocher dans les options de compilation mais je sais plus ou . Si tu essayes le tuto de Gilles sur les enregistrements étendus, je pense que tu auras également une erreur dans le même genre.
    Le plus simple essayes d'ajouter la directive $X ou $EXTENDEDSYNTAX à ton projet
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  3. #3
    Membre chevronné

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Points : 1 884
    Points
    1 884
    Par défaut
    Salut Beanz,

    J'ai trouvé le warning à décocher dans les options du compilateur/messages : le 15° en partant de la fin (lazarus 1.6.4)

    Merci à toi
    Bonne soirée

    Thierry

    [EDIT] : aucun résultat avec les 2 directives que tu as mentionnées.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 671
    Points : 13 065
    Points
    13 065
    Par défaut
    Personnellement, je ne comprends pas cette construction

  5. #5
    Membre chevronné

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Points : 1 884
    Points
    1 884
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Personnellement, je ne comprends pas cette construction
    Avant de recevoir un warning, je ne connaissais pas cette deuxième procédure New.

    procedure New(var P: Pointer; Cons: TProcedure);

    Pour un pointeur sur un objet, Cons = appel au constructeur de l'objet --> New crée l'instance.
    Pour Dispose, on indique le destructeur.

    https://www.freepascal.org/docs-html...ystem/new.html
    https://www.freepascal.org/docs-html...m/dispose.html

    Pour moi, cela n'apporte rien, et je ne vais pas modifier ma façon de faire "ancestrale".
    D'autant plus, que cela ne marche pas avec une classe (même si le constructor n'a pas de paramètres).

    Cordialement
    Thierry

  6. #6
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 550
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 550
    Points : 3 916
    Points
    3 916
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Personnellement, je ne comprends pas cette construction
    Pareil !!!
    Un objet (instance) de classe est déjà un pointeur, je dirai même que cela peut aboutir à du code présentant de gros risque de plantage car il devient relativement aisé d'affecter un objet non conforme en terme de type.

    Ce genre de déclaration avancée était surtout réservée aux enregistrements en vue des allocations dynamiques, qui sont implicites avec les objets au sens Delphi et FPC.
    L'emploi de New avec un pointeur de classe va allouer la mémoire nécessaire mais n'initialisera pas l'objet et n'appellera pas le constructeur contrairement à l'appel au constructeur de la classe.

    Je ne connaissais pas non plus la procédure New avec constructeur, il semble que cela soit réservé aux Object, ancienne construction du Pascal Objet à laquelle a succédé la classe telle que nous la connaissons. en outre, attention à la signature du constructeur attendu (aucun paramètre).

    Cdlt

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  7. #7
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 308
    Points
    4 308
    Par défaut
    Citation Envoyé par e-ric Voir le message
    Pareil !!!
    Un objet (instance) de classe est déjà un pointeur, je dirai même que cela peut aboutir à du code présentant de gros risque de plantage car il devient relativement aisé d'affecter un objet non conforme en terme de type.

    Ce genre de déclaration avancée était surtout réservée aux enregistrements en vue des allocations dynamiques, qui sont implicites avec les objets au sens Delphi et FPC.
    L'emploi de New avec un pointeur de classe va allouer la mémoire nécessaire mais n'initialisera pas l'objet et n'appellera pas le constructeur contrairement à l'appel au constructeur de la classe.

    Je ne connaissais pas non plus la procédure New avec constructeur, il semble que cela soit réservé aux Object, ancienne construction du Pascal Objet à laquelle a succédé la classe telle que nous la connaissons. en outre, attention à la signature du constructeur attendu (aucun paramètre).

    Cdlt
    Je confirme, il s'agit de l'ancienne méthode d'allocation de mémoire pour les objets, utilisé jusqu'en Turbo Pascal. On peut encore s'en servir pour l'allocation de pointeurs sur des enregistrements.
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

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

Discussions similaires

  1. erreur avec les pointeurs (je sais pas d'où ça vient)
    Par EpiTouille dans le forum Débuter
    Réponses: 15
    Dernier message: 01/01/2012, 17h48
  2. pointeur nu avec new ou smart pointer?
    Par r0d dans le forum Débuter
    Réponses: 7
    Dernier message: 07/12/2011, 11h33
  3. Réponses: 7
    Dernier message: 17/11/2011, 11h16
  4. Erreur avec pointeur Run-Time Check Failure #3
    Par Cornichon dans le forum Débuter
    Réponses: 5
    Dernier message: 20/09/2010, 14h19
  5. une erreur avec les pointeur..
    Par lecyberax dans le forum C
    Réponses: 12
    Dernier message: 15/04/2006, 13h04

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