AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Zwei Versionen über „for“ vergleichen
Thema durchsuchen
Ansicht
Themen-Optionen

Zwei Versionen über „for“ vergleichen

Ein Thema von xZise · begonnen am 13. Dez 2008 · letzter Beitrag vom 24. Dez 2008
Antwort Antwort
Seite 2 von 4     12 34      
Hawkeye219

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

Re: Zwei Versionen über „for“ vergleichen

  Alt 13. Dez 2008, 14:06
Hallo,

Zitat von Uwe Raabe:
Man kann das Ganze auch in einen Int64 packen, dann stehen 4 mal 16 Bit zur Verfügung...
die VCL stellt sogar einen passenden Typ dafür bereit: Delphi-Referenz durchsuchenInt64Rec aus der Unit SysUtils.

Delphi-Quellcode:
var
  V1, V2 : Int64Rec;
begin
  V1.Words[0] := 0; // Buildnummer
  V1.Words[1] := 0; // Revisionsnummer
  V1.Words[2] := 0; // Nebenversionsnummer
  V1.Words[3] := 3; // Hauptversionsnummer

  V2.Words[0] := 1;
  V2.Words[1] := 0;
  V2.Words[2] := 0;
  V2.Words[3] := 2;

  if (Int64(V1) <= Int64(V2)) then
    ShowMessage ('V1 ist kleiner oder gleich V2');
Gruß Hawkeye
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#12

Re: Zwei Versionen über „for“ vergleichen

  Alt 13. Dez 2008, 14:15
Die Buildnummer Hauptversionsnummer sollte dann allerdings nicht größer als High(Smallint) sein, sonst wird der Int64 negativ.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

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

Re: Zwei Versionen über „for“ vergleichen

  Alt 13. Dez 2008, 14:47
Zitat von inherited:
Das Programm will ich sehen, das bei Version 255 ist
Naja Version 255.X.Y.Z ist wirklich unrealistisch. Aber ich würde sagen dass X.Y.Z.255 relatistisch ist (wenn man z.B. das Datum da unterbringt oder so).

An Int (32 bit) dachte ich auch schon, aber dann muss man davon ausgehen, dass sie bei 255 "überläuft". Auch dachte ich, man müsse die if-Konstruktion eigentlich so ganz gut umsetzen können.

Wobei folgendes da ziemlich gut klingt:
Zitat von DeddyH:
Könnte das nicht so funktionieren (ungetestet)?
Delphi-Quellcode:
Result := false;
i := 0;
while (i < Length(oldVersion)) and not Result do
  begin
    case Sign(newVersion[i] - oldVersion[i]) of
      -1: break; //newVersion ist älter -> raus hier
       1: Result := true; //newVersion ist neuer
    end;
    inc(i);
  end;
MfG
xZise
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
 
#14

Re: Zwei Versionen über „for“ vergleichen

  Alt 13. Dez 2008, 14:59
Hallo Philip,

Zitat von Apollonius:
Die Buildnummer sollte dann allerdings nicht größer als High(Smallint) sein, sonst wird der Int64 negativ.
Das Vorzeichen steckt auf Rechnern mit einer Intel-CPU in der Hauptversionsnummer (Words[3], Little-Endian).

Gruß Hawkeye
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#15

Re: Zwei Versionen über „for“ vergleichen

  Alt 13. Dez 2008, 15:02
Das ist mir eigentlich bekant. Gut, dass du mitdenkst.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.132 Beiträge
 
Delphi 12 Athens
 
#16

Re: Zwei Versionen über „for“ vergleichen

  Alt 13. Dez 2008, 23:26
@Hawkeye219: if UInt64(V1) <= UInt64(V2) then


PS: bei FNewVersion hätt ich gedacht, daß dieses True ist, wenn NewXYZ > XYZ wird und nicht bei <=
also insgesammt glaub ich, stümmt was bei der anfänglich genannten IF-Verschachtelung nicht
Delphi-Quellcode:
if NewMajor < Major then
  begin
    if (NewMajor = Major) and (NewMinor < Minor) then
    begin
      if (NewMinor = Minor) and (NewRelease < Release) then
      begin
        if (NewRelease = Release) and (NewBuild < Build) then
        begin
          FNewVersion := false;
        end else
          FNewVersion := true;
      end else
        FNewVersion := true;
    end else
      FNewVersion := true;
  end else
    FNewVersion := true;
oder seh ich das grad irgendwie falsch?

gekürzt:
Delphi-Quellcode:
isNewVersion := (NewMajor > Major) or
  ((NewMajor = Major) and ((NewMinor > Minor) or
  ((NewMinor = Minor) and ((NewRelease > Release) or
  ((NewRelease = Release) and (NewBuild > Build))))));


Selber nutze ich auch gern Records, welche sich dann auch mal ganz leicht nach LongWord, bzw. LargeInt/UInt64 casten lassen:

Delphi-Quellcode:
Type TSmallVersion = packed Record
    Build: Word;
    Minor, Major: Byte;
  End;

  TVersion = packed Record
    Build, Release: Word;
    Minor, Major: Word;
  End;
Oder wie wäre es mal mit den neuen Funktionalitäten von Delphi?
und dann einfach nur noch
Delphi-Quellcode:
Var NewVersion, Version: TVersion;

...
If NewVersion <= Version Then ...
Delphi-Quellcode:
Type TSmallVersion = packed Record
    Build: Word;
    Minor, Major: Byte;

    Class Operator Implicit(Rec: TSmallVersion): LongWord;
    Class Operator Implicit(Value: LongWord): TSmallVersion;
    Class Operator Implicit(Rec: TSmallVersion): String;
    Class Operator Implicit(Value: String): TSmallVersion;

    Class Operator Explicit(Rec: TSmallVersion): LongWord;
    Class Operator Explicit(Value: LongWord): TSmallVersion;
    Class Operator Explicit(Rec: TSmallVersion): String;
    Class Operator Explicit(Value: String): TSmallVersion;

    Class Operator Equal (Oper1, Oper2: TSmallVersion): Boolean;
    Class Operator NotEqual (Oper1, Oper2: TSmallVersion): Boolean;
    Class Operator LessThan (Oper1, Oper2: TSmallVersion): Boolean;
    Class Operator LessThanOrEqual (Oper1, Oper2: TSmallVersion): Boolean;
    Class Operator GreaterThan (Oper1, Oper2: TSmallVersion): Boolean;
    Class Operator GreaterThanOrEqual(Oper1, Oper2: TSmallVersion): Boolean;

    Class Operator Add (Oper1, Oper2: TSmallVersion): TSmallVersion;
    Class Operator Subtract (Oper1, Oper2: TSmallVersion): TSmallVersion;
    Class Operator BitwiseAnd(Oper1, Oper2: TSmallVersion): TSmallVersion;
    Class Operator BitwiseOr (Oper1, Oper2: TSmallVersion): TSmallVersion;
  End;

  TVersion = packed Record
    Build, Release: Word;
    Minor, Major: Word;

    Class Operator Implicit(Rec: TSmallVersion): UInt64;
    Class Operator Implicit(Value: LongWord): TSmallVersion;
    Class Operator Implicit(Rec: TSmallVersion): String;
    Class Operator Implicit(Value: String): TSmallVersion;

    Class Operator Explicit(Rec: TSmallVersion): UInt64;
    Class Operator Explicit(Value: UInt64): TSmallVersion;
    Class Operator Explicit(Rec: TSmallVersion): String;
    Class Operator Explicit(Value: String): TSmallVersion;

    Class Operator Equal (Oper1, Oper2: TSmallVersion): Boolean;
    Class Operator NotEqual (Oper1, Oper2: TSmallVersion): Boolean;
    Class Operator LessThan (Oper1, Oper2: TSmallVersion): Boolean;
    Class Operator LessThanOrEqual (Oper1, Oper2: TSmallVersion): Boolean;
    Class Operator GreaterThan (Oper1, Oper2: TSmallVersion): Boolean;
    Class Operator GreaterThanOrEqual(Oper1, Oper2: TSmallVersion): Boolean;

    Class Operator Add (Oper1, Oper2: TSmallVersion): TSmallVersion;
    Class Operator Subtract (Oper1, Oper2: TSmallVersion): TSmallVersion;
    Class Operator BitwiseAnd(Oper1, Oper2: TSmallVersion): TSmallVersion;
    Class Operator BitwiseOr (Oper1, Oper2: TSmallVersion): TSmallVersion;
  End;


// die Definitionen der Funktionen hab ich mir erstmal gesparrt
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  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: Zwei Versionen über „for“ vergleichen

  Alt 14. Dez 2008, 10:40
Zitat von himitsu:
[...]
also insgesammt glaub ich, stümmt was bei der anfänglich genannten IF-Verschachtelung nicht[,...]
Doch doch: So wie ich es anfangs genannt habe passt das.

Wenn die Hauptversionsnummer größer ist, springt er ins else -> Result := true:
Delphi-Quellcode:
if NewMajor <= Major then
begin
  [...]
end else
  FNewVersion := true;
Ansonsten macht er das mit der Nebenversionsnummer, der Releasenummer oder der Buildnummer.

MfG
xZise
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.132 Beiträge
 
Delphi 12 Athens
 
#18

Re: Zwei Versionen über „for“ vergleichen

  Alt 14. Dez 2008, 12:24
Zitat von xZise:
Doch doch: So wie ich es anfangs genannt habe passt das.

Wenn die Hauptversionsnummer größer ist, springt er ins else -> Result := true:
eben nicht richtig

Delphi-Quellcode:
// New = 3.9.0.0
// Current = 4.8.0.0

if NewMajor{3} <= Major{4} {=true} then
  begin
    if NewMinor{9} <= Minor{8} {=false} then
    begin
      ...
    end else
      FNewVersion := true; {das Ergebnis}
  end else
    FNewVersion := true;
hiernach wäre die 4.8 kleiner als 3.9, da 8 < 9

Der nächste Versionsteil darf nur geprüft werden, wenn die vorherigen Teile gleich sind.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von inherited
inherited

Registriert seit: 19. Dez 2005
Ort: Rosdorf
2.022 Beiträge
 
Turbo Delphi für Win32
 
#19

Re: Zwei Versionen über „for“ vergleichen

  Alt 14. Dez 2008, 12:43
Ich mache das mit Versionen so:
Delphi-Quellcode:
  TVersion = packed record
    case Integer of
      0: (AsInt: Cardinal;);
      1: (AsArray: Array[0..3] of Byte;);
      2: (Major: Byte; Minor: Byte; Release: Byte; Build: Byte;);
  end;
Nikolai Wyderka

SWIM SWIM HUNGRY!
Neuer Blog: hier!
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

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

Re: Zwei Versionen über „for“ vergleichen

  Alt 14. Dez 2008, 12:55
Moin himitsu,
Stimmt Aber deine Funktion ergibt auch "wahr", da Major != NewMajor ist.

Zitat von himitsu:
[...]
Delphi-Quellcode:
if NewMajor {3} < Major {4} {true} then
begin
  if (NewMajor {3} = Major {4} {false}) and (NewMinor < Minor) then
  begin
    if (NewMinor = Minor) and (NewRelease < Release) then
    begin
      if (NewRelease = Release) and (NewBuild < Build) then
      begin
        FNewVersion := false;
      end else
        FNewVersion := true;
    end else
      FNewVersion := true;
  end else
    FNewVersion := true;
end else
  FNewVersion := true;
Um genau zu sein, ist die Überprüfung ob die Werte gleich sind obsolet, da sie eh nie durchkommen würden (wobei dadurch das nicht mehr gehen würde).

Mein Vorschlag:
Delphi-Quellcode:
FNewVersion := false;
if NewMajor = Major then
begin
  if NewMinor = Minor then
  begin
    if NewRelease = Release then
    begin
      if NewBuild > Build then
      begin
        FNewVersion := true;
      end;
    end
    else if NewRelease > Release then
      FNewVersion := true;
  end
  else if NewMinor > Minor then
    FNewVersion := true;
end
else if NewMajor > Major then
  FNewVersion := true;
Zu Nikolai: Wie machst du den Vergleich?
Delphi-Quellcode:
var
  Ver, NewVer : TVersion;
begin
  if Ver... < NewVer... then
    FNewVersion := true
  else
    FNewVersion := false;
end;
MfG
xZise
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


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 01:10 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