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 :

[Linux] Défaut de conversion StrToFloat [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2008
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2008
    Messages : 389
    Par défaut [Linux] Défaut de conversion StrToFloat
    Bonjour,
    J'ai sur une application de gestion de tables sous Sqlite un problème étrange apparu après la mise à jour vers Lazarus 1.0.6 - mais il existe aussi sous la version 1.0.4. (retour en arrière suite au problème).
    Je suis sous Linux, j'utilise la version x86-64 et le problème est lié à une seule application. J'ai fait l'essai en en créant une nouvelle avec la conversion en cause, mais voilà je n'en trouve pas la cause et je ne vois pas dans quelle direction chercher.
    Voici le message de défaut
    " 1298,43" is an invalid float.

    Press OK to ignore and risk data corruption.
    Press Cancel to kill the program.
    et ci-dessous la partie du programme créant le défaut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MTOTAL_DISP:=data.divers.FieldByName('TOTAL_DISP').AsString;
    XTOTAL:=StrToFloat(MTOTAL_DISP);
    Lecture dans une table d'une valeur numérique écrite sous une forme texte que je convertis en décimal flottant pour effectuer des calculs.
    MTOTAL_DISP est déclaré comme String et XTOTAL comme Double.
    Tout cela fonctionnait avant une recompilation et le même genre d'action fonctionne bien dans une autre application ; je pense qu'une déclaration est erronée ou qu'il manque une unité de service ou encore un paramètre de compilation ou autre chose, je ne sais pas. Alors un petit coup de main serait le bienvenu.
    Précision encore : je ne suis pas un grand programmeur, juste un petit bidouilleur.
    Merci d'avance.

  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
    Que vaut DecimalSeparator ?
    XTOTAL:=StrToFloat( Trim(MTOTAL_DISP) ); plante-t-il ?
    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
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Par défaut
    Bonjour,
    Citation Envoyé par ovni76 Voir le message
    Voici le message de défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     "    1298,43" is an invalid float.
     
    Press OK to ignore and risk data corruption.
    Press Cancel to kill the program.
    et ci-dessous la partie du programme créant le défaut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MTOTAL_DISP:=data.divers.FieldByName('TOTAL_DISP').AsString;
    XTOTAL:=StrToFloat(MTOTAL_DISP);
    N'est ce pas plutôt " 1298.43" qui est affiché ?

    Que vaut la valeur DecimalSeparator ? AMHA, ce doit être ',' alors qu'auparavant c'était '.'...
    Réessayez le programme en initialisant cette variable à '.' avant la conversion.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DecimalSeparator := '.';

  4. #4
    Membre Expert
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Par défaut
    une tite fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function safeFloatString(aStr: string): string;
    var I: integer;
    begin
      result := aStr;
      if decimalSeparator <> ',' then
        I := pos(',', S)
      else
      if decimalSeparator <> '.' then
        I := pos('.', S);
      if I <> 0 then
        result[I] := decimalSeparator;
    end;
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  5. #5
    Membre éclairé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2008
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2008
    Messages : 389
    Par défaut
    Merci à tous pour vos réponses,

    Mmais mon problème est que cette application fonctionnait correctement avant la recompilation et que j'ai fait l'essai de cette conversion dans une application test et qu'elle fonctionne correctement.
    Quand au séparateur de décimale en début d'application, je précise les contraintes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TFslcl.FormCreate(Sender: TObject);
    begin
      // préparation de l'environnement
      defaultFormatSettings.ShortDateFormat:='DD/MM/YYYY';
      defaultFormatSettings.DateSeparator:='/';
      defaultFormatSettings.DecimalSeparator:=',';
    end;
    Vu que j'ai fait une sauvegarde ces jours ci je ferais une marche arrière sur mes écritures de programmation et je vous donnerai le résultat.
    A+

  6. #6
    Membre émérite
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Par défaut
    Bonjour

    Tu devrais vérifier ce qu'il y a dans DefaultFormatSettings juste avant de faire la conversion, et si c'est toujours ce que tu as défini dans le OnCreate.

    Pour ma part, j'ai observé sous Linux uniquement des modifications non voulues et non systématiques de ces formats pendant l'exécution. Je suppose que c'est une unité utilisée qui change cela, en s'initialisant, mais je n'ai pas encore trouvé laquelle.

    C'est sur le format de date en ce qui me concerne : dans un petit programme de test j'ai tout le temps ShortDateFormat = 'D/M/Y' et DateSeparator = '-', conforme aux définitions système, et dans d'autres plus complexes, après initialisation, cela devient respectivement 'DD/MM/YY' et '/'.

  7. #7
    Membre éclairé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2008
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2008
    Messages : 389
    Par défaut
    Me revoilà après de nombreux essais dont voici le détail :
    Comme indiqué dans un message précédent, j'ai des sauvegardes donc j'ai sauvegarder le dossier de l'application dans sa version bloquante et j'ai remplacé le dossier par un du mois de septembre puis un autre du mois de décembre et à chaque fois j'ai demandé une recompilation puis une exécution.
    Pour ces 2 versions avec la base sqlite de leur époque pas de problèmes.
    Nouvel essai avec la dernière version et sa base de nouveau le problème.
    J'ai donc comme proposé par tintinux ajouté des edit pour juste avant le défaut afficher la valeur des paramètres defaultformatsettings.xxx
    Le résultat est correct j'ai bien mes valeurs déclarées dans l'unité principale, oui je précise : dans mes petites applications de gestion de données j'ai une fiche principale et depuis celle-ci j'appelle des fiches spécialisées avec retour en fin d'action sur la fiche principale.

    Le résultat de mes essais semble indiquer un problème lié à la compilation mais là je suis dépassé.
    J'ai comparer tout ce que je pouvais en comparant les indications des fiches projet, à part une unité ajoutée par moi dans la dernière pas de différences dans les paramètres en rouge.

    Encore une indication : lors du défaut je choisi annuler et une fenêtre s'affiche avec un tas d'indications dont une ligne en gras :
    SYSTUTILS_STRTOFLOATDEF$ANSISTRING$EXTENDED$$EXTENDED
    Si cela vous parle ce n'est pas mon cas.
    Alors Docteurs où chercher ?
    Merci d'avance

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

Discussions similaires

  1. [Lazarus] [Linux] Défaut avec la version 1.0.8 en 64 bits
    Par ovni76 dans le forum Lazarus
    Réponses: 5
    Dernier message: 24/03/2013, 10h00
  2. Modification du shell par défaut sous Linux
    Par see++ dans le forum Général Python
    Réponses: 2
    Dernier message: 03/03/2007, 08h15
  3. Démarrage par défaut sous linux
    Par vica6a dans le forum Mandriva / Mageia
    Réponses: 9
    Dernier message: 11/02/2007, 11h41
  4. Conversion en asm sous Linux
    Par nelob dans le forum Assembleur
    Réponses: 1
    Dernier message: 30/08/2006, 12h59
  5. [Think Pascal] Portage/conversion Think Pascal vers MAC/Windows/Linux
    Par Alain Vitry dans le forum Autres IDE
    Réponses: 1
    Dernier message: 19/03/2005, 11h24

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