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

C++Builder Discussion :

Comparer des versions de logiciel


Sujet :

C++Builder

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 115
    Points : 68
    Points
    68
    Par défaut Comparer des versions de logiciel
    Bonjour a tous,

    Je voudrais savoir comment comparer la version de deux logiciels pour savoir lequel est le plus récent.

    Je m'explique, j'ai une fonction dans mon programme qui me donne la version du logiciel en cours d'utilisation (FAQ : Comment obtenir les informations de version d'une application ?) sous la forme d'un AnsiString.
    Et ce code va également récupérer dans une BDD la version du logiciel pouvant utiliser cette BDD. Ceci également sous la forme d'un AnsiString.

    Pour comparer les différentes version je comparais simplement les deux variables AnsiString pour voir si il y avait une différence.
    Or j'aimerais améliorer se système et pouvoir dire si la version du logiciel inscrite dans la BDD est supérieure ou inférieure à la version du logiciel en cours.

    Pas facile à expliquer mais j'espère avoir été clair.

    Je ne met pas tout le code avec lequel je récupère les différentes version car ce code fonction. Petit exemple de comparaison possible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    AnsiString asVersionLogiciel;
    AnsiString asVersionBDD;
    ....
    asVersionLogiciel = "1.0.2.0";
    asVersionBDD = "1.1.0.0";
    Là j'aimerais que le code me dise que asVersionBDD est supérieur à asVersionLogiciel

    Merci d'avance à tous

  2. #2
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Salut, pour effectuer cette tâche je me suis codé une petite classe. Voici son prototype:
    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
    class TVersion
    {
    public:
        // Constructeur
        __fastcall TVersion();
        __fastcall TVersion(const AnsiString& Src);
        __fastcall TVersion(unsigned int Major, unsigned int Minor, unsigned int Release = 0, unsigned int Revision = 0);
     
        // Destructeur
        __fastcall ~TVersion() = {};
     
        // Assignation
        TVersion& __fastcall operator =(const TVersion& rhs);
     
        // Comparaison
        bool __fastcall operator ==(const TVersion& rhs) const;
        bool __fastcall operator !=(const TVersion& rhs) const;
        bool __fastcall operator < (const TVersion& rhs) const;
        bool __fastcall operator > (const TVersion& rhs) const;
        bool __fastcall operator <=(const TVersion& rhs) const;
        bool __fastcall operator >=(const TVersion& rhs) const;
     
        unsigned int Major;
        unsigned int Minor;
        unsigned int Release;
        unsigned int Revision;
    };
    Étant donné que je sers de ce code dans une application commerciale, je ne peux pas te donner les détails du code. Par contre, tu vas comprendre que c'est pas trop compliqué à coder.

    Une classe te permettra de faire des trucs du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     if(TVersion("3.5.4.98") > TVersion(4, 6))
     {
        TVersion LVers;
        LVers.Major = 5;
        LVers.Minor = 4;
        // On fait quelque chose avec LVers
     }
    J'espère t'avoir aidé.
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  3. #3
    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
    un sujet Delphi qui peut servir : Comme trier des nombres avec des points entre nombres.
    j'avais fourni ma CompareVersion

    Sinon d'un point de vue Alphabétique "1.0.2.0" est inférieur à 1.1.0.0"
    l'opérateur < ou la fonction CompareText

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (asVersionBDD < asVersionLogiciel)
    {
      MigrationBDD(asVersionLogiciel);
    }
    Le problème de comparaison serait plutôt pour "1.0.11.0" et 1.1.0.0"

    tu peux aussi tricher en jouant sur les variables
    c'est ce que je fais pour le projet que je maintiens en mettant systèmatiquement sur deux chiffres, la comparaisons chaine fonctionne sans soucis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    asVersionLogiciel = "01000200"; // ou 01.00.02.00
    asVersionBDD = "01010000"; // ou 01.01.00.00
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    asVersionLogiciel = "01001100"; // ou 01.00.11.00
    asVersionBDD = "01010000"; // ou 01.01.00.00
    tu peux tricher encore autrement avec la fonction inet_addr, cela converti une chaine de la forme a.b.c.d de "0.0.0.0" à "255.255.255.255" en un entier long que tu peux comparer tout simplement par la suite !
    Oui c'est une utilisation très détourné de inet_addr mais une version et une IP ont souvent la même forme, et peu monte à plus de 255 (à part chez MS ou chez Embarcadero avec leur 16.0.4429.46931

    A savoir que TDBXBaseMetaDataReader.MakeStandardVersionFormat contient ce genre de manip, dommage qu'Embarcadero n'a pas l'intelligence de mettre leur fonction en commun, il développe (et re-développe) des fonctions internes à leur classe parfois fort utile !
    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

  4. #4
    Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 115
    Points : 68
    Points
    68
    Par défaut
    merci beaucoup de vos réponses.

    Je vais étudier tout cela. Je dois juste convertir le code pour BuilderC++.
    Merci en tout cas, je vous tiens au courant.

Discussions similaires

  1. Réponses: 0
    Dernier message: 11/05/2010, 18h52
  2. Comparer des numéros de version
    Par Ggamer dans le forum Général Python
    Réponses: 6
    Dernier message: 07/08/2009, 21h19
  3. [CLI] Comparer 2 répertoires dans des versions différentes
    Par Empty_body dans le forum CVS
    Réponses: 1
    Dernier message: 24/11/2008, 13h55
  4. Mettre des versions sur un logiciel !
    Par Pharma dans le forum Delphi
    Réponses: 7
    Dernier message: 18/10/2006, 19h54

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