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

Contribuez Delphi Discussion :

Fonction 'read' : erreur incompréhensible de typage !


Sujet :

Contribuez Delphi

  1. #1
    Candidat au Club
    Homme Profil pro
    retraité
    Inscrit en
    Août 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 80
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : retraité
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Août 2021
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Fonction 'read' : erreur incompréhensible de typage !
    Bonjour !

    Consultant en réseaux retraité, je me replonge dans Delphi après de très nombreuses années où j'ai gagné ma vie avec Paradox. Ex-utilisateur de la version Delphi 2, j'utilise depuis peu la version actuelle d'Embarcadero. Je me considère comme un nouveau débutant, donc !

    Un proverbe Néerlandais dit : "Il cherche sans succès son cheval alors qu'il est assis dessus !"

    Quelqu’un peut-il me dire comment me débarrasser d'une erreur 2010 (non concordance de typage, clause "read") dans le programme hyper simple suivant (lecture de la première ligne d'un fichier texte) :

    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
    Const
      fn='F:\Data Root\A_DnLd\pixes.txt';
     
    var
      Form1:  TForm1;
      fx:   file;
      st:  string;
     
    implementation
     
    begin
      begin
        assignfile(fx,fn);
        reset(fx);
        read(fx,st);
      end;
    end.
    Les arguments passés à "read" sont du type attendu (tels que décrits dans le manuel de référence en ligne)

    J'ai creusé du côté des "paramètres non typés" mais je ne trouve rien ! Merci de me décoincer (et sans rire SVP !)

    Pierre

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    System.Read a remplacer surement par un System.Readln pour faciliter la lecture ligne par ligne et j'utiliserais Text au lieu de file

    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
     
    procedure TForm1.Button2Click(Sender: TObject);
    var
       FLNC: TextFile;
       Line: string;
    begin
          AssignFile(FLNC, FileName);
          Reset(FLNC);
          try
             if not Eof(FLNC) then
             begin
                Readln(FLNC, Line);
                ShowMessage(Line);             
             end;
          finally
             CloseFile(FLNC);
          end;
    end;
    Code validé sur Delphi 10 (je n'ai pas Delphi 2010 qui est bcp plus ancien)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Candidat au Club
    Homme Profil pro
    retraité
    Inscrit en
    Août 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 80
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : retraité
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Août 2021
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Remerciements
    Cher Monsieur,

    Merci pour votre si aimable et rapide réponse. L'erreur a disparu effectivement. C'est "textfile" au lieu de "file" qui fait la différence. Je m'interroge cependant sur la logique du diagnostic qui semble impliquer que le résultat d'un "read" ou "readln" ne peut pas être renvoyé dans une variable string, ce qui est contraire au pattern indiqué dans l'aide ? Dans quoi alors ? Dans un bloc mémoire référencé par un pointeur ? Je ne suis pas encore assez versé dans le langage pour en décider !

    Mille cordialités, Pierre

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Effectivement, un file non typé, est un binaire pur, j'utilisais BlockRead dans un Buffer ou vers un Record selon le cas mais depuis je privilégie le TFileStream
    Je n'ai aucun souvenir sur l'utilisation de Read sur un fichier binaire, je crois que l'on peu lui faire lire des types simples comme un Integer ou des ShortString mais je n'ai jamais pratiqué, j'utilisais du "file of" et donc Read lisait directement un record entier qui ensuite était casté en différent type car chaque ligne si toujours de même taille (128), le contenu devait être interprété selon l'entête.

    En 2010, une chaine string c'est plus complexe que l'on croit, c'est une UnicodeString donc chaque caractère est sur 2 octets, et que signifie lire une String depuis un fichier, est-ce juste lire une suite de caractère ou aussi les méta-data de la chaine (StrRec, soit Taille, Encodage, ...)
    Le fichier lui même pouvant être ANSI, UTF8, UTF16, la lecture de texte de nos jours est plus complexe qu'à l'époque de D2 et Win95 où l'on ne gérait souvent que le Windows-1252 et rien d'autres (Delphi utilisait que les versions ANSI des API Windows)

    Du coup, en refléchissant à tout ça que veut dire read(fx,st); ?
    On indique pas de taille limite, pas de caractère de fin (en dehors des normes comme le caractère OEF)


    EDIT : au fait pourquoi on est dans le forum "Contribuez" et non dans "Débuter" ?

    et aussi
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Candidat au Club
    Homme Profil pro
    retraité
    Inscrit en
    Août 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 80
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : retraité
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Août 2021
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Merci encore !

    Pierre

  6. #6
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 611
    Points
    3 611
    Par défaut
    Historiquement ça a peut-être pu passer tel quel car les string étaient des tableaux de 256 caractères dont le premier contenait la taille du texte, mais maintenant ce n'est plus le cas.

    Si c'est sur une version récente de Delphi, je recommande de passer par System.IOUtils et les méthodes de la classe TFile qui simplifient grandement la lecture et l'enregistrement de fichiers textes. Avec le USES ajouté, ça pourrait faire ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      if TFile.Exists(FileName) then
        ShowMessage(TFile.ReadAllText(FileName));
    end;

  7. #7
    Candidat au Club
    Homme Profil pro
    retraité
    Inscrit en
    Août 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 80
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : retraité
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Août 2021
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Merci à vous aussi !

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/01/2013, 18h17
  2. ERREUR incompréhensible lors de la création d'une fonction
    Par BATAK dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 15/10/2009, 22h36
  3. [1.x] Erreur incompréhensible : avec la fonction __toString()
    Par Malonix dans le forum Symfony
    Réponses: 3
    Dernier message: 01/07/2009, 12h15
  4. Erreur sur fonction READ (Communication Série)
    Par Kartoon67 dans le forum LabVIEW
    Réponses: 11
    Dernier message: 22/04/2009, 13h40
  5. Réponses: 3
    Dernier message: 25/07/2006, 18h00

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