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 :

Cross-compilation Win64 avec le type TTimeStamp


Sujet :

Lazarus Pascal

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 246
    Points : 535
    Points
    535
    Par défaut Cross-compilation Win64 avec le type TTimeStamp
    Bonjour,

    Je développe une petite application pour faire des requêtes sur une base de données Firebid 3 en utilisant des composants UIB.
    Bien qu'utilisant Windows 10 64 bits, je l'ai d'abord développée sur une installation de Lazarus/FPC (les deux trunc début novembre)créée en version 32 bits avec fpcdeluxe fpcupdeluxe-i386-win32.exe. Ce dernier permettant d'installer le module de x86_64 pour windows, j'ai pu faire fonctionner sans problème mon application en 32b comme en 64b.
    Désirant corriger FPC à causes certaines anomalies (fuites mémoires) gênantes pour d'autres applications, j'ai refait mon installation de Lazarus FPC dans les mêmes conditions. Pas de problème en 32b, mais lors de la compilation en 64b un message signale que le déguggeur ne fonctionnera pas.
    J'ai donc refait l'installation de Lazarus/FPC en 64b avec fpcupdeluxe-x86_64-win64.exe et le module de cross-compilation i386 en 32b.
    Mon application fonctionne très bien en 64b, mais en 32b, la lecture d'un champ de type timestamp provoque une erreur "Invalid floating point operation" lors de l'affichage suivi de l'affichage de la fenêtre assembleur jointe

    Nom : erreur.jpg
Affichages : 267
Taille : 393,9 Ko

    Je suis loin d'être un spécialiste de l'assembleur, mais il me semble que les instructions comme "fild" sont spécifiques au 64b. Comme l'erreur semble bien apparaitre dans la procédure de sysutils concernant les timestamps, s'agit-il d'une erreur dans le module de cross-compilation et existe-t-il un moyen de la réparer?

    André

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 246
    Points : 535
    Points
    535
    Par défaut
    En attendant de trouver mieux, je me dépanne en réinstallant Lazarus/FPC en version 32 bits, avec cross-compilation en 64 bits. Mais pour débugger en 64 bits, je dois changer de débugger, GNU (gdb) heureusement encore livré, à la place de FpDebug installé par défaut.

    André

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 300
    Points
    11 300
    Billets dans le blog
    6
    Par défaut
    Bonsoir,

    Il serait intéressant de comparer les 2 codes asm 32 et 64 bits, alors que certaines au moins des instructions semblent exister pour les 2 mais pê avec des différences subtiles ?
    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 !

  4. #4
    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
    Hello, ca serait bien d'avoir le code en pascal de la ou ca bloque. Utilises tu des variables de type "double" dans ton application ?
    • "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

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 246
    Points : 535
    Points
    535
    Par défaut
    Bonjour et merci de vous intéresser à ce problème.

    Voici un tout petit programme qui met en évidence le problème: une simple application avec un bouton, et sur le OnClick du bouton le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.Button1Click(Sender:TObject);
    var
      ts:TTimeStamp;
      ms:Comp;
    begin
      ts:=DateTimeToTimeStamp(now);
      ms:=TimeStampToMSecs(ts);
      ShowMessage(DateTimeToStr(TimeStampToDateTime(ts)));
    end;
    On y retrouve la fonction de mon premier message, TimeStampToMSecs(ts) qui provoque l'erreur uniquement sur une installation de Lazarus 64b lors de la cross-compilation en 32b. Pas de problème si compilée en 64b sur cette installation ni sur une installation Lazarus 32b compilée en 32b ou cross-compilée en 64b.
    Je n'ai pas trouvé la définition du type Comp résultat de cette fonction...
    En plaçant un point d'arrêt dans la fenêtre assembleur ouverte dans la version 64->32, l'application s'arrêtera lors de la compilation 32->32 et si le fenêtre assembleur est ouverte, vous pouvez constater que le code est identique dans les 2 compilations en 32b. L'erreur doit être ailleurs... Contrairement à ce que je pensais, "fild" existe bien en 32b.

    André

  6. #6
    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
    J'ai fais une petite recherche, il semblerai y avoir un bug avec la fonction TimeStampToMSecs pour la cross compilation en 32bits.
    Le type comp est un alias pour int64
    Il te faudras donc trouver une alternative peut-être avec les TDateTime ou de recoder toi même cette fonction
    • "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

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 246
    Points : 535
    Points
    535
    Par défaut
    Dans GitLab https://gitlab.com/freepascal.org/fp...-/issues/35147 le problème est connu depuis 3 ans, mais toujours pas résolu. Il est bien particulier à la cross-compilation depuis Win64.
    Pour le moment il est préférable de ne pas utiliser cette cross-compilation si on utilise une base de données où le TDateTime est stockée sous le type TTimeStamp.
    André

Discussions similaires

  1. cross compilation avec mingw : probleme avec GTK+
    Par superZozo dans le forum GTK+
    Réponses: 10
    Dernier message: 25/04/2010, 16h36
  2. Cross-compilation avec GCC 4 sous Windows pour Linux
    Par dourouc05 dans le forum Contribuez
    Réponses: 0
    Dernier message: 08/04/2009, 18h25
  3. [Lazarus] Cross-compiler pour MacOS avec Linux
    Par fiens dans le forum Lazarus
    Réponses: 0
    Dernier message: 29/03/2009, 19h10
  4. erreur de compilation : probleme avec type de structure dans une classe
    Par medkarim dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 21/10/2008, 15h33
  5. Cross compilation avec SDL
    Par Pico51 dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 25/08/2008, 09h14

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