AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

else ifs werden übersprungen

Ein Thema von xZise · begonnen am 11. Sep 2007 · letzter Beitrag vom 12. Sep 2007
Antwort Antwort
Seite 2 von 3     12 3      
Dax
(Gast)

n/a Beiträge
 
#11

Re: else ifs werden übersprungen

  Alt 11. Sep 2007, 19:27
Zitat von xZise:
Der sinn eines Updates ist es aber nicht, die gleiche Version nochmal zu downloaden
Und bei einer langen Kette funktioniert das auch nicht
Damit sprach ich auch den von die vermuteten Bug im Delphi-Debugger an...

Wie du um die Teilabfragen herumkommst: Berechne eine Versions-ID so:
Delphi-Quellcode:
funtion VersionID(Major, Minor, Release, Build: Word): Int64;
begin
  Result := Int64(Major) shl 48 or Int64(Minor) shl 32 or Release shl 16 or Build;
end;
Wenn du diese IDs vergleicht, hast du alles, was du über die else-ifs ausdrücken wolltest, implizit dabei.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#12

Re: else ifs werden übersprungen

  Alt 11. Sep 2007, 19:35
Das Kernproblem lässt sich auch auf einen Integervergleich reduzieren:
Delphi-Quellcode:
function MakeVersion(major, minor, release, build:byte):Cardinal;
begin
   result := (major shl 24) or (minor shl 16) or (release shl 8) or build;
end;
if MakeVersion(ReadInteger('Version', 'Major', 0), ....) > MakeVersion(Major, Minor, ...) then
   Avaiable;
Kein Teil darf dann über 255 hinausgehen. (Aber Versionen wie 3.260.70.577 sind ja eher selten)
Sollte dies ein Problem sein, dann macht man eben einen Fliesskommazahlvergleich:
Delphi-Quellcode:
function MakeVersion(major, minor, release, build:integer):Double;
begin
   result := (((major * 10000.0) + minor) * 10000.0 +release)*10000.0 + build;
end;
Andreas
  Mit Zitat antworten Zitat
ringli

Registriert seit: 7. Okt 2004
508 Beiträge
 
Delphi 11 Alexandria
 
#13

Re: else ifs werden übersprungen

  Alt 11. Sep 2007, 19:43
Sory, hatte in meinem Beitrag eine dazugehörige Prozedur vergessen. Habe den Beitrag nochmal editiert.
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#14

Re: else ifs werden übersprungen

  Alt 11. Sep 2007, 22:37
Zitat von s-off:
Zitat von xZise:
Oder wirft er vielleicht eine Exception?
Ja, und zwar deshalb, weil Du nur
with TIniFile(ExtractFilePath(ParamStr(0)) + 'info.ini') do schreibst, es aber
with TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'info.ini') do sein müsste; das 'Create' fehlt.


Zitat von shmia:
Das Kernproblem lässt sich auch auf einen Integervergleich reduzieren:
Delphi-Quellcode:
function MakeVersion(major, minor, release, build:byte):Cardinal;
begin
   result := (major shl 24) or (minor shl 16) or (release shl 8) or build;
end;
if MakeVersion(ReadInteger('Version', 'Major', 0), ....) > MakeVersion(Major, Minor, ...) then
   Avaiable;
Und was bringt mir ein solcher Vergleich? (Auch an Dax)

Ich habe das so gemacht:
if (ReadInteger('Version', 'Major', 0) >= Major) and (ReadInteger('Version', 'Minor', 0) >= Minor) and (ReadInteger('Version', 'Release', 0) >= Release) and (ReadInteger('Version', 'Build', 0) > Build) then
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#15

Re: else ifs werden übersprungen

  Alt 11. Sep 2007, 22:55
Hallo Fabian,

angenommen, ich arbeite mit Version 1.0.0.42, und die .ini-Datei kündigt Version 2.0.0.0 an. Mit deinem Code aus Beitrag #1 erhalte ich ein Update, mit deinem neuen Code aus Beitrag #14 nicht mehr. Und das nur, weil die Build-Nummer der neuen Version nicht hoch genug ist...

Gruß Hawkeye
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#16

Re: else ifs werden übersprungen

  Alt 11. Sep 2007, 23:14
Zitat von xZise:
Und was bringt mir ein solcher Vergleich? (Auch an Dax)
Durch die Umwandlung der verschiedenen Versionszahlen in einen Integer erreichst du genau das, was du willst: ein Vergleich VerA > VerB ergibt nur dann true wenn [u]mindestens eine[b] Versionszahl von VerB größer ist als die entsprechende Versionszahl aus VerA. Das ist einfache Arithmetik Der Grund dafür ist simpel: du hast vier Zahlen A, B, C und D, die man als Werte der ersten, zweiten, ... Position eines Stellenwertsystems S1 ansehen kann. Durch die von uns vorgeschlagene Umwandlung der vier Zahlen in eine einzige transferierst du diese Zahlen A, B, C, D in ein anderes Stellenwertsystem S2, dass diesmal pro Stelle *mehr* Informationen enthalten kann. Da S1 und S2 wohlgeordnet sind, gelingt dieser Vergleich immer.

Oder anders gesagt: weil 10A + B > 10C + D das selbe ist wie (A > B and C >= D) or (A >= B and C > D) - was sich auf beliebig viele Stellen erweitern lässt

Edit: unter der Vorraussetzung, dass A, B, C, D die eigenen Versionszahlen sind und E, F, G, H die auf dem Server, könnte dein Vergleich auch einfach not (A <= E and B <= F and C <= G and D <= H) sein.
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#17

Re: else ifs werden übersprungen

  Alt 11. Sep 2007, 23:19
Hi Hawkeye219
Mist ^^ ich habe beim letzten Vergleich das = vergessen OOPs


Zitat von Dax:
Zitat von xZise:
Und was bringt mir ein solcher Vergleich? (Auch an Dax)
Durch die Umwandlung der verschiedenen Versionszahlen in einen Integer erreichst du genau das, was du willst: ein Vergleich VerA > VerB ergibt nur dann true wenn [u]mindestens eine[b] Versionszahl von VerB größer ist als die entsprechende Versionszahl aus VerA. Das ist einfache Arithmetik Der Grund dafür ist simpel: du hast vier Zahlen A, B, C und D, die man als Werte der ersten, zweiten, ... Position eines Stellenwertsystems S1 ansehen kann. Durch die von uns vorgeschlagene Umwandlung der vier Zahlen in eine einzige transferierst du diese Zahlen A, B, C, D in ein anderes Stellenwertsystem S2, dass diesmal pro Stelle *mehr* Informationen enthalten kann. Da S1 und S2 wohlgeordnet sind, gelingt dieser Vergleich immer.

Oder anders gesagt: weil 10A + B &gt; 10C + D das selbe ist wie (A &gt; B and C &gt;= D) or (A &gt;= B and C &gt; D) - was sich auf beliebig viele Stellen erweitern lässt

Edit: unter der Vorraussetzung, dass A, B, C, D die eigenen Versionszahlen sind und E, F, G, H die auf dem Server, könnte dein Vergleich auch einfach not (A <= E and B &lt;= F and C &lt;= G and D &lt;= H) sein.
Ich weiß Aber wo liegt der Vorteil gegenüber den oben genannten Code (#14)?
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#18

Re: else ifs werden übersprungen

  Alt 11. Sep 2007, 23:24
Oben genannter Code enthält Fehler, obwohl er auf den ersten Blick richtig erscheinen mag - unser Code enthält keine Fehler, weil es gegen die Axiome der Mathematik verstieße

shmias Code ist aber, zugegebenermaßen, fehleranfällig als der, den ich gepostet habe, gerade weil Build-Zahlen manchmal schon über die Byte-Grenze hinauswachen.
  Mit Zitat antworten Zitat
grenzgaenger
(Gast)

n/a Beiträge
 
#19

Re: else ifs werden übersprungen

  Alt 11. Sep 2007, 23:34
entweder du machst 'n INT vergleich wie DAX und shmia sagten, oder du hängst 'ne build Nr. hinten an, welche über deine versionen ständig heraufgezählt wird und frägst auf diese ab... projekt -- >optionen --> versionsinfo --> buildnummer
dann sieht deine versionsnummer so aus 1.5.2.368 und die nächst version z.b. so 2.1.13.428

in deiner ersten version, haste auf alle fälle den >= vergleich vergessen...

grüsse und noch viel erfolg
  Mit Zitat antworten Zitat
grenzgaenger
(Gast)

n/a Beiträge
 
#20

Re: else ifs werden übersprungen

  Alt 11. Sep 2007, 23:36
Zitat von Dax:
shmias Code ist aber, zugegebenermaßen, fehleranfällig als der, den ich gepostet habe, gerade weil Build-Zahlen manchmal schon über die Byte-Grenze hinauswachen.
wohl eher häufig, aber was spricht dagegen, die build nummer als in zu implementieren? ca. 2 Mrd. builds, dürften für den otto normal programmierer genügen und die reicht ja in aller regel aus, um eine neue version eindeutig zu identifizieren ...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz