Page 1 sur 2

Routine de comparaison (vérification) de version.

Publié : sam. 21/juil./2012 11:29
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

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

Publié : sam. 21/juil./2012 11:50
par G-Rom
Merci du partage, il y a plus d'entête que de code ^^

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

Publié : sam. 21/juil./2012 13:30
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

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

Publié : sam. 21/juil./2012 15:01
par MLD
Salut GallyHC
Chez moi OK win XP SP3.Pas essayer avec W7. :lol: :wink:

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

Publié : sam. 21/juil./2012 17:09
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+

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

Publié : sam. 21/juil./2012 20:41
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

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

Publié : sam. 21/juil./2012 23:01
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.

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

Publié : lun. 23/juil./2012 1:36
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

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

Publié : lun. 23/juil./2012 11:27
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


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

Publié : lun. 23/juil./2012 11:33
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$))

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

Publié : lun. 23/juil./2012 11:40
par Backup
lepiaf31 a écrit : Pourquoi ne pas simplement écrire :

Code : Tout sélectionner

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

t'as essayé ?

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

Publié : lun. 23/juil./2012 12:37
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

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

Publié : lun. 23/juil./2012 12:42
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
:)

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

Publié : lun. 23/juil./2012 12:47
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

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

Publié : lun. 23/juil./2012 12:49
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: