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

Langage Delphi Discussion :

Comparer des records


Sujet :

Langage Delphi

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2021
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Comparer des records
    Je dois comparer 2 variables d'un même type record assez long (plus de 200 champs, certains étant eux-mêmes des record dont certains assez gros aussi).
    Or si on a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Type 
    Toto = record
    end
     
    Var 
    Var1, Var2 : Toto
    le test
    If Var1=Var2 ne fonctionne pas.
    J'ai essayé avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CompareMem (@Var1    , @Var2    , SizeOf(Toto    )
    Mais le type contient des réels, et cette comparaison échoue même si var1 et Var2 contiennent bien les mêmes données.
    Je peux donc soit comparer 1 à 1 les centaines de champs du record et des sous-record, soit essayer de trouver un moyen de faire une itération sur lesdits champs et les comparer en fonction des types.

    Ma question est donc : est-ce possible ?
    Car j'ai eu beau chercher, je n'ai rien trouvé

    Je ne peux évidemment pas modifier mon record ou le transformer en autre chose, étant donné que le programme a près de 30 ans et que ces structures viennent du Pascal et que la compatibilité avec les anciennes versions doit être maintenue.

  2. #2
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 967
    Points
    6 967
    Par défaut
    Citation Envoyé par Sined69 Voir le message
    Type
    Toto = record
    end

    Var
    Var1, Var2 : record
    La déclaration devrait être :
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2021
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Oups, oui, pardon.

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Dommage de poursuivre un sujet existant car on ne saura jamais si votre question sera "résolue"

    Le problème c'est les chaines, les tableaux, même si le contenu est identique, les pointeurs ne sont pas les mêmes, c'est souvent dupliqués en mémoire.

    Il te faut faire une function CompareToto(const Var1, Var2: Toto): Boolean; qui fera la comparaison, soit à la main en écrivant tout le code de comparaison, soit en utilisant les RTTI.
    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
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    à priori je partirais sur les RTTI pour obtenir la liste des membres du record et leur type et faire une comparaison adaptée à chaque membre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function RTTICompare<T>(const A, B: T): Boolean;
    begin
      ...
    end;
    voilà reste plus qu'à remplacer les "..."

    personnellement je le ferais avec mon unité RTTI, mais c'est possible de le faire avec celle de Delphi.

    un autre approche serait de sérialiser les records en JSON et de comparer les deux chaînes obtenues...par contre je ne sais pas trop avec quelle précision les réels sont encodés.

    dans mon unité JSON c'est défini, dans la partie Delphi je ne sais pas trop comment c'est géré...mais ça doit pouvoir se faire aussi
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Dommage de poursuivre un sujet existant car on ne saura jamais si votre question sera "résolue"
    Voilà qui est fait, seul le titre pourrait être à corriger (je n'ai fait que lire en diagonale)

    @sidned69 j'ai ôté la partie nécromancie
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2021
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    à priori je partirais sur les RTTI pour obtenir la liste des membres du record et leur type et faire une comparaison adaptée à chaque membre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function RTTICompare<T>(const A, B: T): Boolean;
    begin
      ...
    end;
    voilà reste plus qu'à remplacer les "..."

    personnellement je le ferais avec mon unité RTTI, mais c'est possible de le faire avec celle de Delphi.

    un autre approche serait de sérialiser les records en JSON et de comparer les deux chaînes obtenues...par contre je ne sais pas trop avec quelle précision les réels sont encodés.

    dans mon unité JSON c'est défini, dans la partie Delphi je ne sais pas trop comment c'est géré...mais ça doit pouvoir se faire aussi
    Merci, je vais me pencher là-dessus

Discussions similaires

  1. comparer des champs date time
    Par HULK dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 25/01/2005, 14h02
  2. [Date] Comparer des dates au format mySQL "date
    Par Marc_P dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 25/10/2004, 15h15
  3. comparer des sons
    Par heidi79 dans le forum DirectX
    Réponses: 2
    Dernier message: 12/08/2003, 01h18
  4. [LG][FAQ]comparer des fichiers
    Par lucke dans le forum Langage
    Réponses: 11
    Dernier message: 01/06/2003, 18h02
  5. Comparer des fichiers de données : Quel Langage ?
    Par Anonymous dans le forum Langages de programmation
    Réponses: 6
    Dernier message: 24/04/2002, 22h37

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