Routine de comparaison (vérification) de version.

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Routine de comparaison (vérification) de version.

Message par GallyHC »

Bonjour,

Je viens de faire pour un programme une petite routine de verification de version (Par calcul pour être plus fiable). Vous pouvez testé et me donné votre avis. Le source est accéssible sur mon site à l'adresse http://koakdesign.info/?url=4d&val=52, mais je la met aussi ici :).

Code : Tout sélectionner

; +======================================================+
; |                                                      |
; +------------------------------------------------------+
; | COPYRIGHT(C)2007-2012, ALL RIGHT RESERVED KOAKDESIGN |
; +--------------+---------------------------------------+
; | Program type | PUREBASIC 4.51                        |
; +--------------+---------------------------------------+
; | VER & REV    | 0.0.1                                 |
; +--------------+---------------------------------------+
; | Program name | main.pb                               |
; +======================================================+

; +======================================================+
; | Original Version: 3.1.1                              |
; +--------------+---------------------------------------+
; | Created by   | GallyHomeCorp                         |
; | Graphix by   |                                       |
; +--------------+---------------------------------------+
; | Comments:    |                                       |
; +--------------+                                       |
; |                                                      |
; |                                                      |
; |                                                      |
; +======================================================+

; +======================================================+
; | Système d'Exploitation                               |
; +--------------+---------------------------------------+
; | Window       | Oui                                   |
; | Linux        | Oui                                   |
; | MacOS        | Oui                                   |
; +======================================================+

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

DisableASM
EnableExplicit

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

Procedure.b GetVersion(sLogicielVer.s, sOriginalVer.s)
; ROUTINE DE VERIFICATION DES VERSIONS.
  Define i.l
  Define j.l = 1
  Define k.l
  Define numStrA.l = CountString(sLogicielVer, ".")
  Define numStrB.l = CountString(sOriginalVer, ".")

  If numStrA > numStrB
    For i=1 To numStrA - numStrB
      sOriginalVer + ".0"
    Next i
    numStrB = numStrA
  EndIf
  If numStrB > numStrA
    For i=1 To numStrB - numStrA
      sLogicielVer + ".0"
    Next i
    numStrA = numStrB
  EndIf

  For i = numStrA + 1 To 1 Step -1
    j * 10
    k + j * (Val(StringField(sLogicielVer, i, ".")) - Val(StringField(sOriginalVer, i, ".")))
  Next i
  If k > 0
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf

EndProcedure

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

If getVersion("10.10.25.84", "10.10.25")
  Debug "Version Supérieur"
Else
  Debug "Version Non Supérieur"
EndIf
Cordialement,
GallyHC
Dernière modification par GallyHC le sam. 21/juil./2012 22:24, modifié 1 fois.
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Routine de comparaison (vérification) de version.

Message par G-Rom »

Merci du partage, il y a plus d'entête que de code ^^
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Routine de comparaison (vérification) de version.

Message par GallyHC »

G-Rom> c'est clair qu'il y a plus d'entête (ça depend du code aussi lollll), masi bon c'est ma façon de faire je pref mettre entête ect... pour être plus clair dans le code.

All> Tester quand même le code pour voir si j'ai pas fait d'erreur :).

Merci d'avance,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Routine de comparaison (vérification) de version.

Message par MLD »

Salut GallyHC
Chez moi OK win XP SP3.Pas essayer avec W7. :lol: :wink:
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Re: Routine de comparaison (vérification) de version.

Message par Cls »

Salut GallyHC,

jolie fonction. Voici une méthode différente utilisant la récursivité :

Code : Tout sélectionner

;- Fonction de comparaison de 2 versions
; 
; Auteur : Cls
; Version : Juillet 2012
;
Procedure.b Compare(srcVersion.s, dstVersion.s, separator.s = ".")
  
  Compare.b ; Return var
  
  src.i = Val(StringField(srcVersion, 1, separator))
  dst.i = Val(StringField(dstVersion, 1, separator))
  
  If src = dst
    If CountString(srcVersion, separator) = 0 And CountString(dstVersion, separator) = 0
      Compare = 0
    ElseIf CountString(srcVersion, separator) = 0
      Compare = -1
    ElseIf CountString(dstVersion, separator) = 0  
      Compare = 1
    Else
      subSrc.i = FindString(srcVersion, separator, 1) 
      subDst.i = FindString(dstVersion, separator, 1)
      Compare = Compare(Mid(srcVersion, subSrc + 1, Len(srcVersion) - subSrc + 1), Mid(dstVersion, subDst + 1, Len(srcVersion) - subDst + 1), separator) ; Recursivity
    EndIf    
    
  ElseIf src < dst
    Compare = -1
  Else 
    Compare = 1
  EndIf
  
  ProcedureReturn Compare
EndProcedure
Et les tests :

Code : Tout sélectionner

; Tests 
:
Structure CompareTest
  source.s
  destination.s
EndStructure

NewList TestCases.CompareTest()
AddElement(TestCases()) : TestCases()\source = "1.0" : TestCases()\destination = "1.1"
AddElement(TestCases()) : TestCases()\source = "1.0.1" : TestCases()\destination = "1.0.1"
AddElement(TestCases()) : TestCases()\source = "1.8" : TestCases()\destination = "1.6.3"
AddElement(TestCases()) : TestCases()\source = "0.5.9" : TestCases()\destination = "0.5.9.2"


ForEach TestCases()
  Select Compare(TestCases()\source, TestCases()\destination)
    Case -1
      Debug TestCases()\source + " est inférieur à " + TestCases()\destination
    Case 0
      Debug TestCases()\source + " est équivalent à " + TestCases()\destination
    Case 1
      Debug TestCases()\source + " est supérieur à " + TestCases()\destination
  EndSelect
Next
A+
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Routine de comparaison (vérification) de version.

Message par GallyHC »

Bonjour,

Cls> Quand j'ai vu ton code cela ma donnée l'idee d'ajouter comme dans ton code le séparateur :). Merci.

Code : Tout sélectionner

; +======================================================+
; |                                                      |
; +------------------------------------------------------+
; | COPYRIGHT(C)2007-2012, ALL RIGHT RESERVED KOAKDESIGN |
; +--------------+---------------------------------------+
; | Program type | PUREBASIC 4.51                        |
; +--------------+---------------------------------------+
; | VER & REV    | 0.0.1                                 |
; +--------------+---------------------------------------+
; | Program name | main.pb                               |
; +======================================================+

; +======================================================+
; | Original Version: 3.1.1                              |
; +--------------+---------------------------------------+
; | Created by   | GallyHomeCorp                         |
; | Graphix by   |                                       |
; +--------------+---------------------------------------+
; | Comments:    |                                       |
; +--------------+                                       |
; |                                                      |
; |                                                      |
; |                                                      |
; +======================================================+

; +======================================================+
; | Système d'Exploitation                               |
; +--------------+---------------------------------------+
; | Window       | Oui                                   |
; | Linux        | Oui                                   |
; | MacOS        | Oui                                   |
; +======================================================+

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

DisableASM
EnableExplicit

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

Procedure.b GetVersion(sLogicielVer.s, sOriginalVer.s, sSeparator.s = ".")
; ROUTINE DE VERIFICATION DES VERSIONS.
  Define i.l
  Define j.l = 1
  Define k.l
  Define numStrA.l = CountString(sLogicielVer, sSeparator)
  Define numStrB.l = CountString(sOriginalVer, sSeparator)

  If numStrA > numStrB
    For i=1 To numStrA - numStrB
      sOriginalVer + ".0"
    Next i
    numStrB = numStrA
  EndIf
  If numStrB > numStrA
    For i=1 To numStrB - numStrA
      sLogicielVer + ".0"
    Next i
    numStrA = numStrB
  EndIf

  For i = numStrA + 1 To 1 Step -1
    j * 10
    k + j * (Val(StringField(sLogicielVer, i, sSeparator)) - Val(StringField(sOriginalVer, i, sSeparator)))
  Next i
  If k > 0
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf

EndProcedure

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

If getVersion("10.10.25.84", "10.10.25", ".")
  Debug "Version Supérieur"
Else
  Debug "Version Non Supérieur"
EndIf
Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Routine de comparaison (vérification) de version.

Message par falsam »

GallyHC a écrit :Vous pouvez testé et me donné votre avis.
Testé et ça fonctionne. J'ai changé des valeurs pour être certain :p Merci GallyHC.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Routine de comparaison (vérification) de version.

Message par GallyHC »

Bonjour,

Cls > Si tu as le temps tu peux mettre ta fonction sur mon site (cela donnera plusieurs methodes) et ça permettra d'alimenter mon site et en faire une bonne base de codes-sources purebasic.

falsam et MLD > Merci pour vos testes.

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Routine de comparaison (vérification) de version.

Message par Backup »

(en Vacance... mais ... )
pourquoi faire simple ??

Code : Tout sélectionner

Procedure.b GetVersion(sLogicielVer.s, sOriginalVer.s, sSeparator.s = ".")
	; by Dobro
	; ROUTINE DE VERIFICATION DES VERSIONS.	
	ori$=RemoveString(sOriginalVer.s,sSeparator.s) :lori=len(ori$)
	ver$=RemoveString(sLogicielVer.s,sSeparator.s) :lver=len(ver$)
	if lori<lver
		ver$=mid(ver$,1,lori)
	endif
	if lver>lori
		ori$=mid(ori$,1,lver)
	endif	
	if val(ver$) > val( ori$)
		ProcedureReturn #True
		Else
		ProcedureReturn #False
	EndIf  
EndProcedure

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

If getVersion("10.09.25.84", "10.10.25", ".")
	Debug "Version Supérieur"
	Else
	Debug "Version Non Supérieur"
EndIf
; EPB

Dernière modification par Backup le lun. 23/juil./2012 11:57, modifié 4 fois.
lepiaf31
Messages : 510
Inscription : dim. 25/mars/2007 13:44
Localisation : Toulouse, France
Contact :

Re: Routine de comparaison (vérification) de version.

Message par lepiaf31 »

Dobro a écrit :

Code : Tout sélectionner

  if val(ver$) > val( ori$)
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf  

Si j'ecris ca dans un programme mes profs me trucident ^^
Pourquoi ne pas simplement écrire :

Code : Tout sélectionner

ProcedureReturn (val(ver$) > val(ori$))
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Routine de comparaison (vérification) de version.

Message par Backup »

lepiaf31 a écrit : Pourquoi ne pas simplement écrire :

Code : Tout sélectionner

ProcedureReturn (val(ver$) > val(ori$))

t'as essayé ?
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Routine de comparaison (vérification) de version.

Message par GallyHC »

Bonjour tous,

J'ai un problème avec ton code, je m'explique. Si je met :

Code : Tout sélectionner

Procedure.b GetVersion(sLogicielVer.s, sOriginalVer.s, sSeparator.s = ".")
   ; by Dobro
   ; ROUTINE DE VERIFICATION DES VERSIONS.   
   ori$=RemoveString(sOriginalVer.s,sSeparator.s) :lori=Len(ori$)
   ver$=RemoveString(sLogicielVer.s,sSeparator.s) :lver=Len(ver$)
   If lori<lver
      ver$=Mid(ver$,1,lori)
   EndIf
   If lver>lori
      ori$=Mid(ori$,1,lver)
    EndIf
    
    Debug ori$ + "*"
    Debug ver$ + "*"
    
   If Val(ver$) > Val( ori$)
      ProcedureReturn #True
      Else
      ProcedureReturn #False
   EndIf  
EndProcedure

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

If getVersion("10.10.25.84", "10.10.25", ".")
   Debug "Version Supérieur"
   Else
   Debug "Version Non Supérieur"
EndIf
La version a teste est 10.10.25 qui est aussi egale a 10.10.25.00 pour etre cohérant avec les versions à testé.

Par logique 10.10.25.00 est inférieur que 10.10.25.84 donc la fonction doit répondre "Version Supérieur", mais la j'ai "Version Non Supérieur", donc cela ne fonctionne pas. c'est pour cela que je formate les versions en identique avant de faire le test (avec le même nombre de ".").

Cordialement,
GallyHC
Dernière modification par GallyHC le lun. 23/juil./2012 12:43, modifié 1 fois.
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Routine de comparaison (vérification) de version.

Message par Backup »

oui j'aurai du preciser

pour ce cas , il faudrait ecrire
10.10.25.84", "10.10.25.00"
c'est pareil si tu met 10.9.25 ça ne marchera pas , par contre , 10.09.25 ça va le faire

il faut pour ma version , mettre le nombre de digit egale au plus grand :) .entre les points

par exemple si on choisi le format "100.009.025" (il y a trois digits entre les points , donc le "9" doit s'ecrire "009" et "25" -> "025"

c'est juste un choix de format a faire au depart
:)
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Routine de comparaison (vérification) de version.

Message par GallyHC »

Oui tu as pas forcement tord, mais si tu testes des version de soft x ou y tu n'es pas sur du formatage et c'est la ou le bas blesse :).

Disons que celle de Cls et la mienne est plus generique alors.

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Routine de comparaison (vérification) de version.

Message par Backup »

oui :)
moi je code en general pour moi-meme ... alors je défini moi meme le type de format :)

je ne dis pas que mon code est mieux que le votre , je donne juste une version plus "simple" :)
et donc forcement plus limitée ;)

bon allez je retourne en vacances :lol:
Répondre