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 :

Résultats de AnsiCompareStr('A C', 'ABC') différents entre Delphi (Windows) et Lazarus (Linux) [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre régulier
    Homme Profil pro
    retraité informaticien
    Inscrit en
    Novembre 2008
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : retraité informaticien

    Informations forums :
    Inscription : Novembre 2008
    Messages : 90
    Points : 75
    Points
    75
    Par défaut Résultats de AnsiCompareStr('A C', 'ABC') différents entre Delphi (Windows) et Lazarus (Linux)
    Bonjour,

    En exécutant l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result := AnsiCompareStr('A C', 'ABC');
    j'obtiens result = 1 avec Lazarus 2.2.0, FPC 3.2.2 sous UBUNTU 20.4

    En exécutant la même instruction
    j'obtiens result = -1 avec DELPHI Sydney 10.4 sous Windows 10

    Seule différence entre les 2 sources la clause uses.

    Le source (Lazarus):
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    unit Unit1;
    {$mode objfpc}{$H+}
    interface
    uses
      Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls;
    type
       TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
      public
      end;
    var
      Form1: TForm1;
    implementation
    {$R *.lfm}
    { TForm1 }
    procedure TForm1.Button1Click(Sender: TObject);
    var
      result : Integer;
     
    begin
      result :=AnsiCompareStr('A C', 'ABC');
      ShowMessage(InttoStr(result);
    end;
     
    end.
    Le source (DELPHI)
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    unit Unit1;
    interface
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
      public
      end;
    var
      Form1: TForm1;
    implementation
    {$R *.dfm}
    procedure TForm1.Button1Click(Sender: TObject);
    var
      result : Integer;
     
    begin
      result := AnsiCompareStr('A C', 'ABC');
      ShowMessage(InttoStr(result));
    end;
     
    end.
    Si quelqu'un a une piste ,...Merci

  2. #2
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 416
    Points
    59 416
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Dans le code source de Lazarus, les littéraux de type chaîne de caractères sont stockés en UTF-8 (à moins d'utiliser une directive contraire). Il est donc toujours préférable d'utiliser les routines de l'unité LazUTF8 pour les opérations sur les chaînes de caractères. Ainsi, la comparaison
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result := UTF8CompareStr('A C', 'ABC');
    renvoie bien -1.

    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  3. #3
    Membre régulier
    Homme Profil pro
    retraité informaticien
    Inscrit en
    Novembre 2008
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : retraité informaticien

    Informations forums :
    Inscription : Novembre 2008
    Messages : 90
    Points : 75
    Points
    75
    Par défaut
    Bonjour Alcatiz.
    Merci pour cette réponse rapide.
    Malheureusement je ne suis pas maître du code car cette instruction fait partie du code de fpSpreadsheet (function TsWorksheet.DefaultCompareCells(ACell1, ACell2: PCell; ).
    N'ayant pas trouvé d'information quant à l'usage de la fonction sort je l'ai appelée comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FVisual.sWorksheetGrid1.Worksheet.Sort(sortParams, 0, 0, FVisual.sWorksheetGrid1.worksheet.GetLastRowIndex {3}, FVisual.sWorksheetGrid1.worksheet.GetLastColIndex {1}) ;
    Je vais quand-même mettre le problème comme résolu.
    Bonne journée

  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
    Bonjour,

    le résultat est différent avec Delphi car celui-ci utilise le code page de Windows alors que Lazarus utlise les unicodes et ne supporte pas le code page Windows. Pour que cela fonctionne comme Delphi il faut convertir les données au bon format.
    • "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 régulier
    Homme Profil pro
    retraité informaticien
    Inscrit en
    Novembre 2008
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : retraité informaticien

    Informations forums :
    Inscription : Novembre 2008
    Messages : 90
    Points : 75
    Points
    75
    Par défaut
    @BeanzMaster
    Bonjour.

    Mon problème se pose car je trie une colonne contenant : un nom, un espace suivi d'un prénom.
    Tout se passe comme si les espaces étaient supprimés.

    Si j'ai bien compris il me faut balayer toutes les cellules de la colonne à trier pour les convertir?

    Question subsidiaire :
    Quel fonction utiliser pour effectuer une telle conversion ?

    bonne journée

  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
    Il existe la fonction Utf8ToAnsi https://www.freepascal.org/docs-html...tf8toansi.html qui normalement devrait fonctionner. Mais vu que le résultat est simplement inversé, pourquoi ne pas juste inverser le libellé du sens de ton tri (technique de sioux ).

    Ou juste inverser l'ordre de tes paramètres pour obtenir le résultat souhaité. Ce qui serait le plus simple amha.
    • "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 régulier
    Homme Profil pro
    retraité informaticien
    Inscrit en
    Novembre 2008
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : retraité informaticien

    Informations forums :
    Inscription : Novembre 2008
    Messages : 90
    Points : 75
    Points
    75
    Par défaut
    @BeanzMaster


    Si j'ai bien compris ta réponse => Code Page de Windows = UTF-8 alors qu'ANSI = UniCode , d'où la conversion à l'aide de UTF8toANSI ?



    Pour répondre à ta proposition de 'technique de sioux' (que je n'ai d'ailleurs pas comprise ) :

    Il y a un petit détail supplémentaire qui a son importance, la cellule qui contient un nom suivi d'un espace et d'un ou plusieurs prénoms) peut ressembler à :

    Dupont de Nemours André, Antoine,Anselme.

    Bon après midi

  8. #8
    Membre régulier
    Homme Profil pro
    retraité informaticien
    Inscrit en
    Novembre 2008
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : retraité informaticien

    Informations forums :
    Inscription : Novembre 2008
    Messages : 90
    Points : 75
    Points
    75
    Par défaut Résolu, merci à tous
    Bonsoir à tous

    @BeanzMaster

    J'ai contourné le problème en triant sur 2 clés : une avec le nom, la suivante avec le prénom.
    Mais je n'ai pas testé avec des noms contenant des espaces.

    Je vais donc définitivement clore ce fil pour ne pas trop dériver, mais j'en ouvre un autre avec pour titre : Problème de tri d'un worksheet dans l'environnement Ubuntu.

    A bientôt

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

Discussions similaires

  1. [Lazarus] Problème de transfert TCP/IP entre Delphi/Windows et Lazarus/Linux
    Par Oscar02 dans le forum Lazarus
    Réponses: 8
    Dernier message: 18/05/2018, 22h22
  2. [MySQL] Résultat de requête SQL différent entre PHP et phpMyAdmin
    Par djsid dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 31/12/2009, 11h22
  3. [CR XI] résultat différent entre aperçu et viewer
    Par kikidrome dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 20/06/2008, 14h11
  4. Réponses: 1
    Dernier message: 20/07/2006, 15h21
  5. Résultats différent entre une requête SQL, et la même en VBA
    Par thetaps dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 23/09/2005, 12h05

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