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

Free Pascal Discussion :

[2.2] Impossible d'assigner une variable de type T à une variable de type T


Sujet :

Free Pascal

  1. #1
    Inactif Avatar de Hibou57
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    852
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 852
    Par défaut [2.2] Impossible d'assigner une variable de type T à une variable de type T
    Bonjour tous/toutes,

    Ceci est une suspiscion de bug qui concerne le nouveau FPC 2.2.

    Mieux qu'un long discours préalable, un exemple vous parlera plus directement.

    • Code Pascal : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
       
      PROCEDURE Test;
      TYPE
          T = ARRAY OF Char;
      VAR
          V : T;
      BEGIN
          V := V;
      END;
      Aussi étonnant que cela puisse parraître, ce code ne peut plus être compilé sous FPC 2.2. Il y a renvoie du message « illegal expression » au sujet de la ligne « V := V; ».

      J'ai d'abord pensé à une fonctionnalité volontaire : comme l'assignation des tableaux dynamiques ne copie pas le contenu, mais la référence au contenu, il est possible d'imaginer que cela soit parfois source d'erreur par inattention dans certains codes, et que l'équipe de développement de FPC ait décidé donc d'interdire cette assignation, en ne rendant possible que la copie totale par la fonction Copy. Mais l'exemple suivant montre que cette construction ne fonctionne pas non-plus.
    • Code Pascal : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
       
      PROCEDURE Test;
      TYPE
          T = ARRAY OF Char;
      VAR
          V : T;
      BEGIN
          V := Copy(V);
      END;
      Là encore, le compilateur indique « illegal expression » en désignant l'assignation comme étant fautive.


    Bilan : il semble bien que ce soit un bug, et non pas une fonctionnalité. Ce bug peut potentiellement s'exprimer fréquement, car les assignations de tableaux dynamiques ne sont pas rares.

    J'ai soumis le cas sur le site freepascal.org, dans l'attente d'une réponse dont je vous tiendrai informé(e)s.

    Bonne journée, à+

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 465
    Par défaut
    Cela marche-t-il si on spécifie les bornes du tableau ?

    Si oui, ca me semble logique que ca ne marche pas sans les spécifier: comment faire rentrer un tableau de 10 éléments dans un tableau dont le nombre d'éléments est inconnu... Il faudrait passer par des pointeurs, dans ce cas. Conceptuellement, le raisonnement proposé par FreePascal se tient, à mon goût.

  3. #3
    Inactif Avatar de Hibou57
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    852
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 852
    Par défaut
    Beh, j'ai une info encore plus interessante, et on peut oublier les bornes : le bug ne s'exprime pas de la même manière selon que la directive ExtendedSyntax est active ou non.

    Si vous ajoutez {$EXTENDEDSYNTAX+} au code, le code peut être compilé normalement, mais si vous y ajoutez {$EXTENDEDSYNTAX-}, alors le code ne peut plus être compilé.

    Ors l'interdiction de la "syntax étendue" interdit normalement seulement d'appeler une fonction comme une procédure (ce qui me semble le plus pertinant, raison pour laquelle cette directive est toujours active chez moi, et que le comportement par défaut du compilateur à ce sujet, ne me plaît pas du tout).

    Le fait que le compilateur refuse l'assignation des tableaux dynamiques si la syntax étendue est désactivée, est bien un bug.

    De plus le fait que tout mes codes ayant la directive {$EXTENDEDSYNTAX-}, et étant donné qu'ils pouvaient être compilé normalement avec FPC 2.0, mais qu'il ne peuvent plus l'être avec FPC 2.2, est une autre preuve que c'est bien un bug.

    Et activer la syntax étendue, c'est-à-dire autoriser l'appel de fonctions comme s'il s'agissait de procédures, est une chose que je n'ai pas envie d'accepter.

    Je vais finalement leur signaler dans le "bug tracker", et avec un peu de chance ce sera corrigé dans un prochain snapshot.

    Je ne vois pas trés bien ce que peut être l'origine de ce bug.... peut-être la manière dont est implémenté l'assignation des tableaux dynamiques dans FPC. Mais je ne vois pas comment cela peut bien être implémenté avec des fonctions appelées comme des procédures. Enfin, bref.... maintenant au moins le bug parraît mieux cerné.

  4. #4
    Inactif Avatar de Hibou57
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    852
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 852
    Par défaut
    Okay, le bug est en cours de résolution, ...

    Citation Envoyé par FPC Public bug tracking
    (0015366)
    Jonas Maebe
    2007-10-12 11:29

    Variant assignment is now indeed handled using an internal function which returns the size of the copied data (because that function is also used internally in the rtl, where this information is required in some cases).

    I'll have a look at it.
    Ils/elles ont le sens du service express à la team FreePascal

    Par contre une question me vient : est-ce que cela sous entend que maintenant l'assignation des tableaux dynamiques se fera maintenant par copie plutôt que par référence interne au contenu ? J'en doute, parce que cela mettrait à terre beaucoup de code. Mais pourtant, sauf si je comprend mal, c'est ce que semble pourtant dire cette réponse : il parle bien de quantité de données copiées non ? Ou n'est-ce qu'une formulation ambigü ?

Discussions similaires

  1. Réponses: 10
    Dernier message: 11/01/2015, 23h57
  2. Réponses: 4
    Dernier message: 18/02/2014, 11h06
  3. Réponses: 1
    Dernier message: 26/12/2010, 21h20
  4. retrouver le type d'une meta donnee lors d'une reflexion
    Par pcouas dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 18/11/2008, 09h36
  5. [HTML] Mettre une variable comme adresse d'une Iframe et faire changer cette variable
    Par thefdm dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 29/01/2008, 18h54

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