if or case?

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

if or case?

Beitrag von Bauer321 »

Wenn ich jetzt ein Dropdownfeld Abfragen möchte wie mache ich das besser?

So? ...mit if

Code: Alles auswählen

{Minecraft Beta}
  if Combobox1.Text = '  Minecraft 1.7.3' then Extractjar2('b-1.7.3','Ver. b1.7.3') else
  if Combobox1.Text = '  Minecraft 1.7.2' then Extractjar2('b-1.7.2','Ver. b1.7.2') else
  if Combobox1.Text = '  Minecraft 1.7.2, without "Better Grass"' then Extractjar2('b-1.7.2-nograssfix','Ver. b1.7.2, nograssfix') else
  if Combobox1.Text = '  Minecraft 1.7_01' then Extractjar2('b-1.7_01','Ver. b1.7_01') else
  if Combobox1.Text = '  Minecraft 1.6.6' then Extractjar2('b-1.6.6','Ver. b1.6.6') else
  if Combobox1.Text = '  Minecraft 1.6.5' then Extractjar2('b-1.6.5','Ver. b1.6.5') else
  if Combobox1.Text = '  Minecraft 1.6.4' then Extractjar2('b-1.6.4','Ver. b1.6.4') else
  if Combobox1.Text = '  Minecraft 1.6.3' then Extractjar2('b-1.6.3','Ver. b1.6.3') else
  if Combobox1.Text = '  Minecraft 1.6.2' then Extractjar2('b-1.6.2','Ver. b1.6.2') else
  if Combobox1.Text = '  Minecraft 1.5_01' then Extractjar2('b-1.5_01','Ver. b1.5_01') else
  if Combobox1.Text = '  Minecraft 1.4_01' then Extractjar2('b-1.4_01','Ver. b1.4_01') else
  if Combobox1.Text = '  Minecraft 1.4' then Extractjar2('b-1.4','Ver. b1.4') else
  if Combobox1.Text = '  Minecraft 1.3_01' then Extractjar2('b-1.3_01','Ver. b1.3_01') else
  if Combobox1.Text = '  Minecraft 1.2_02' then Extractjar2('b-1.2_02','Ver. b1.2_02') else
  if Combobox1.Text = '  Minecraft 1.1_02' then Extractjar2('b-1.1_02','Ver. b1.1_02') else
  if Combobox1.Text = '  Minecraft 1.0.2' then Extractjar2('b-1.0.2','Ver. b1.0.2') else
{Minecraft Alpha}
  if Combobox1.Text = '  Minecraft 1.2.6' then Extractjar2('a-1.2.6','Ver. a1.2.6') else
  if Combobox1.Text = '  Minecraft 1.2.5' then Extractjar2('a-1.2.5','Ver. a1.2.5') else
  if Combobox1.Text = '  Minecraft 1.2.4_01' then Extractjar2('a-1.2.4_01','Ver. a1.2.4_01') else
  if Combobox1.Text = '  Minecraft 1.2.3_04' then Extractjar2('a-1.2.3_04','Ver. a1.2.3_04') else
  if Combobox1.Text = '  Minecraft 1.2.3_01' then Extractjar2('a-1.2.3_01','Ver. a1.2.3_01') else
  if Combobox1.Text = '  Minecraft 1.2.0_02' then Extractjar2('a-1.2.0_02','Ver. a1.2.0_02') else
  if Combobox1.Text = '  Minecraft 1.1.2' then Extractjar2('a-1.1.2','Ver. a1.1.2') else
  if Combobox1.Text = '  Minecraft 1.1.0' then Extractjar2('a-1.1.0','Ver. a1.1.0') else
  if Combobox1.Text = '  Minecraft 1.0.17_04' then Extractjar2('a-1.0.17_04','Ver. a1.0.17_04') else
  if Combobox1.Text = '  Minecraft 1.0.16' then Extractjar2('a-1.0.16','Ver. a1.0.16') else
  if Combobox1.Text = '  Minecraft 1.0.15' then Extractjar2('a-1.0.15','Ver. a1.0.15') else
{Minecraft InfDev}
  if Combobox1.Text = '  Minecraft Infdev 18.06.10' then Extractjar2('id-180610','Ver. InfDev 18.06.10');
oder so ... mit case?

Code: Alles auswählen

case Combobox1.Text of
{Minecraft Beta}
  '  Minecraft 1.7.3'     : Extractjar2('b-1.7.3','Ver. b1.7.3');
  '  Minecraft 1.7.2'     : Extractjar2('b-1.7.2','Ver. b1.7.2');
  '  Minecraft 1.7.2, without "Better Grass"':
    Extractjar2('b-1.7.2-nograssfix','Ver. b1.7.2, nograssfix');
  '  Minecraft 1.7_01'    : Extractjar2('b-1.7_01','Ver. b1.7_01');
  '  Minecraft 1.6.6'     : Extractjar2('b-1.6.6','Ver. b1.6.6');
  '  Minecraft 1.6.5'     : Extractjar2('b-1.6.5','Ver. b1.6.5');
  '  Minecraft 1.6.4'     : Extractjar2('b-1.6.4','Ver. b1.6.4');
  '  Minecraft 1.6.3'     : Extractjar2('b-1.6.3','Ver. b1.6.3');
  '  Minecraft 1.6.2'     : Extractjar2('b-1.6.2','Ver. b1.6.2');
  '  Minecraft 1.5_01'    : Extractjar2('b-1.5_01','Ver. b1.5_01');
  '  Minecraft 1.4_01'    : Extractjar2('b-1.4_01','Ver. b1.4_01');
  '  Minecraft 1.4'       : Extractjar2('b-1.4','Ver. b1.4');
  '  Minecraft 1.3_01'    : Extractjar2('b-1.3_01','Ver. b1.3_01');
  '  Minecraft 1.2_02'    : Extractjar2('b-1.2_02','Ver. b1.2_02');
  '  Minecraft 1.1_02'    : Extractjar2('b-1.1_02','Ver. b1.1_02');
  '  Minecraft 1.0.2'     : Extractjar2('b-1.0.2','Ver. b1.0.2');
{Minecraft Alpha}
  '  Minecraft 1.2.6'     : Extractjar2('a-1.2.6','Ver. a1.2.6');
  '  Minecraft 1.2.5'     : Extractjar2('a-1.2.5','Ver. a1.2.5');
  '  Minecraft 1.2.4_01'  : Extractjar2('a-1.2.4_01','Ver. a1.2.4_01');
  '  Minecraft 1.2.3_04'  : Extractjar2('a-1.2.3_04','Ver. a1.2.3_04');
  '  Minecraft 1.2.3_01'  : Extractjar2('a-1.2.3_01','Ver. a1.2.3_01');
  '  Minecraft 1.2.0_02'  : Extractjar2('a-1.2.0_02','Ver. a1.2.0_02');
  '  Minecraft 1.1.2'     : Extractjar2('a-1.1.2','Ver. a1.1.2');
  '  Minecraft 1.1.0'     : Extractjar2('a-1.1.0','Ver. a1.1.0');
  '  Minecraft 1.0.17_04' : Extractjar2('a-1.0.17_04','Ver. a1.0.17_04');
  '  Minecraft 1.0.16'    : Extractjar2('a-1.0.16','Ver. a1.0.16');
  '  Minecraft 1.0.15'    : Extractjar2('a-1.0.15','Ver. a1.0.15');
{Minecraft InfDev}
  '  Minecraft Infdev 18.06.10': Extractjar2('id-180610','Ver. InfDev 18.06.10');
  end;
... oder kann ich das vielleicht sogar irgendwie messen was wie lange dauert? geht das nicht evtl mit GetTickCount(oder so ähnlich) oder wie würde ich die Dauer am genausten ermitteln können?
www.mcpatcher.net | www.hoeper.me

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1632
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: if or case?

Beitrag von corpsman »

Speziell bei der Combobox müsstest du doch den Itemindex abfragen können, oder ?

Einen Case auf Strings kann man glaubig noch nicht sehr lang machen, ich persönlich finde, dass die case Variante aber besser aussieht als die vielen If's.

Mit Gettickcount würde es Prinzipiell schon gehen, aber die eine If / das eine Case gibt dir immer eine Differenz von 0,, da sie ja in Millisekunden gemessen wird. Selbst auf einem sehr alten Rechner dürfte dieser Code allein keine Millisekunde laufen. Rufe ihn 10000 oder 100000 mal auf, und messe dann mit Gettickcount.
--
Just try it

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: if or case?

Beitrag von Socke »

Prinzipiell kann der Compiler bei Case besser optimieren als bei einer Folge von If-Abfragen; im schlimmsten Fall (keine Optimierung) erhältst du aber ziemlich ähnlichen Programmcode (ebenfalls eine Folge von If-Abfragen).

Code: Alles auswählen

var
t1, t2: String;
z,i: Integer;
begin
  t1 := Copy(Combobox1.Text, Length('  Minecraft '), Length(Combobox1.Text);
  val(t1, z, i)
  if i <> 0 then // infdev version
    t1 := Copy(Combobox1.Text, Length('  Minecraft Infdev '), Length(Combobox1.Text);
    // text transformieren
  end;
  t2 := 'Ver. a' + t1;
  t1 := 'a-' + t1;
  ExtractJar2(t1, t2);
end;
Da musst du dir nur noch was für deinen Gras-fix was ausdenken.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: if or case?

Beitrag von Bauer321 »

ja okay danke ;) dann nehm ich erstmal die case variante die ist übersichtlicher und wenns da eh nur um max +- 1ms geht werd ich das wohl kaum optimieren müssen ;)
corpsman hat geschrieben:[...] Einen Case auf Strings kann man glaubig noch nicht sehr lang machen [...]
man kann sogar nach großen kleinen Buchstaben und so durchsuchen ... einfach mal im wiki gucken^^
www.mcpatcher.net | www.hoeper.me

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: if or case?

Beitrag von MAC »

Also ich wusste das auch nich nicht.
Vlt sollte man Das 'Minecraft ' vor jedem String abschneiden, ich könnte mir vorstellen, das es dadurch schneller wird, Aber wie corpsman beschrieben hat.
Speicher am anfang := Time;
Rechne das ganze 1000 000 mal
Speicher am Ende := Time;
gibt Ende - Anfang aus...

Aber generell kann man sagen:
Der Code wird nicht oft abgefragt, also würde ich es so schreiben wie du es am besten lesen kannst...

Code: Alles auswählen

Signatur := nil;

Displaced
Beiträge: 83
Registriert: So 12. Jul 2009, 10:08

Re: if or case?

Beitrag von Displaced »

Ich würde die Versionen per Hand in eine Array eintragen, dann den String vernünftig Parsen um die Versionnummer zu bekommen und dann aus der Array den String nehmen und eine Zeile fürs extrahieren schreiben. Ist glaub ich übersichtlicher.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: if or case?

Beitrag von Christian »

Geschwindigkeitsmässig sollt das teoretisch keinen unterschied machen mach also was dir besser gefällt
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

creed steiger
Beiträge: 958
Registriert: Mo 11. Sep 2006, 22:56

Re: if or case?

Beitrag von creed steiger »

Displaced hat geschrieben:Ich würde die Versionen per Hand in eine Array eintragen, dann den String vernünftig Parsen um die Versionnummer zu bekommen und dann aus der Array den String nehmen und eine Zeile fürs extrahieren schreiben. Ist glaub ich übersichtlicher.
rein für die Übersichtlichkeit würd ichs auch so machen

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: if or case?

Beitrag von Maik81ftl »

corpsman hat geschrieben:Speziell bei der Combobox müsstest du doch den Itemindex abfragen können, oder ?

Einen Case auf Strings kann man glaubig noch nicht sehr lang machen, ich persönlich finde, dass die case Variante aber besser aussieht als die vielen If's.

Mit Gettickcount würde es Prinzipiell schon gehen, aber die eine If / das eine Case gibt dir immer eine Differenz von 0,, da sie ja in Millisekunden gemessen wird. Selbst auf einem sehr alten Rechner dürfte dieser Code allein keine Millisekunde laufen. Rufe ihn 10000 oder 100000 mal auf, und messe dann mit Gettickcount.
kann ich dir nur recht geben.

in diesem fall würde ich ebenfalls via Itemindex die case nutzen. gerade bei der gröse der abfrage.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Antworten