Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Einfache Fall-Entscheidung bei hexadezimalen Werten? (https://www.delphipraxis.net/129048-einfache-fall-entscheidung-bei-hexadezimalen-werten.html)

ryLIX 11. Feb 2009 18:01


Einfache Fall-Entscheidung bei hexadezimalen Werten?
 
Hallo,
ich suche nach einer Möglichkeit schnell, anhand eines eingegebenen Wertes, zu ermitteln aus welchen Grundwerten sich dieser zusammen setzt.

Die Grundwerte habe ich vorgegeben. Diese sind 1,2,4,8 und C.
Der Bereich des eingegebenen Wertes erstreckt sich über die komplette hexadezimale Zahlenreihe (0-F).

Nun versuche ich eine Funktion zu finden die ohne Case oder If Struktur auskommt.
Welche Möglichkeiten habe ich da in Delphi/Pascal?
Da dieses Konstrukt aus Case oder If doch etwas groß wäre und auch ein wenig langsam. Oder irre ich mich da?

Hawkeye219 11. Feb 2009 18:11

Re: Einfache Fall-Entscheidung bei hexadezimalen Werten?
 
Hallo Markus,

meinst du so etwas?

Delphi-Quellcode:
if Odd(Value) then {1 vorhanden};
if Odd(Value shr 1) then {2 vorhanden};
if Odd(Value shr 2) then {4 vorhanden};
if Odd(Value shr 3) then {8 vorhanden};
Gruß Hawkeye

Jens Hartmann 11. Feb 2009 18:14

Re: Einfache Fall-Entscheidung bei hexadezimalen Werten?
 
Hallo,

was genau wird den eingegeben.

Ich vermute die Grundwerte sind die Einzelteile eines HEXA-Wertes.


Jetzt willst du erkenne, wenn jemand z.B 1C4C eingibt, welche zwei Grundwerte dahinter versteckt sind, Oder?

Gruß Jens

ryLIX 11. Feb 2009 18:19

Re: Einfache Fall-Entscheidung bei hexadezimalen Werten?
 
Hmm fast.
Eher so:

Eingabe: B
Dann sollten die Grundwerte zurück gegeben werden. Also 1,2 und 8.

Wie ich das ganze zwischenspeichere weiß ich im Moment noch nicht :roll:
Insgesamt ist das ein 16 stelliger Hexcode der eingegeben wird.

Ich hatte nun angefangen die einzelnen Stellen aufzutrennen und wollte die dann weiter verarbeiten.
Zur Zeit ist der Plan das ganze über eine Tabelle zu machen wo der Grundwert die Position im Schlüssel und der Textwert drin sind.

Da ich den HexCode auf Textwerte überstetzen möchte (mache derzeit noch von Hand).

Rote Kiste:

Ja so war das vorgesehen Jens.

Jens Hartmann 11. Feb 2009 18:28

Re: Einfache Fall-Entscheidung bei hexadezimalen Werten?
 
Also wenn ich das dann jetzt verstanden habe, wäre dann folgendes Dein Ziel:

Eingabe B = Rückgabe 1,2,8
Eingabe C = Rückgabe C
Eingabe D = Rückgabe 1,4,8

Wenn das so wäre, kann man das doch mit einer case Anweisung lösen:

Delphi-Quellcode:
case Eingabe of

A: IrgendeinString := 2,8
B: IrgendeinString := 1,2,8
C: IrgendeinString := C

...

usw.
Vieleicht hilft dir das ja

Gruß Jens

ryLIX 11. Feb 2009 18:35

Re: Einfache Fall-Entscheidung bei hexadezimalen Werten?
 
Zitat:

Zitat von Jens Hartmann
Also wenn ich das dann jetzt verstanden habe, wäre dann folgendes Dein Ziel:

Eingabe B = Rückgabe 1,2,8
Eingabe C = Rückgabe C
Eingabe D = Rückgabe 1,4,8

Wenn das so wäre, kann man das doch mit einer case Anweisung lösen:

Vieleicht hilft dir das ja

Gruß Jens

Das mit der Eingabe ist soweit korrekt.


Zitat:

Zitat von ryLIX
Nun versuche ich eine Funktion zu finden die ohne Case oder If Struktur auskommt.
Welche Möglichkeiten habe ich da in Delphi/Pascal?
Da dieses Konstrukt aus Case oder If doch etwas groß wäre und auch ein wenig langsam. Oder irre ich mich da?

:zwinker:

Die Idee mit Case oder If ist mir auch gekommen finds aber irgendwie Umständlich und ich hab den Verdacht das es irgendwie einfach geht.

Jens Hartmann 11. Feb 2009 18:44

Re: Einfache Fall-Entscheidung bei hexadezimalen Werten?
 
Ich weiß nicht genau, da habe ich auch keine Ahnung,

aber vieleicht ginge sowas wie den HEX-Wert umzuwandeln

Delphi-Quellcode:

Label1.Caption := IntToHex(1000,4);
Das Ergebnis von oben wäre dann "03E8"

genauso, könntest du umgekehrt arbeiten

Delphi-Quellcode:
x := StrToInt('$03E8);

Das Ergebnis wäre wieder 1000

Ich hoffe das hilft Dir, ansonsten weiß ich auch nicht.

Gruß

jens

ryLIX 11. Feb 2009 19:02

Re: Einfache Fall-Entscheidung bei hexadezimalen Werten?
 
Der Schlüssel ist ja schon im HexFormat.

Code:
0000204406B01421
Nun setzt sich jede Stelle des Codes aus den Grundwerten zusammen.
Das auftrennen in einzelne Werte ist ja nicht das Problem.

Ich dazu eine Wertetabelle woraus ich ablesen kann welcher Grundwert an welcher Stelle welchen Text hat.
Das ganze hab ich mir in eine SQL Tabelle geschrieben um es mit dem Programm besser verarbeiten zu können.

Was mir nun halt Fehlt ist dieses erkennen der Grundwerte.
Für uns Menschen ja kein Problem aber wie man das einfach nach Delphi umsetzt ist mir nicht ganz klar.

Wenn keiner ne bessere Idee hat werd doch wohl auf das Case Modell zurück greifen.
Möchte nur ausschließen das es nicht "leichter" geht.

Jens Hartmann 11. Feb 2009 19:05

Re: Einfache Fall-Entscheidung bei hexadezimalen Werten?
 
Sorry,

aber da weiß ich auch nicht weiter. Bin allerdings auch nicht der absolute Profi.
Vieleicht hast Du ja bei jemand anderem mehr Glück

Gruß

Jens

Hawkeye219 11. Feb 2009 19:46

Re: Einfache Fall-Entscheidung bei hexadezimalen Werten?
 
Markus, die Aufgabenstellung klingt für mich immer noch etwas widersprüchlich. Sei mir also nicht böse, wenn ich sie immer noch falsch verstanden habe:

Delphi-Quellcode:
procedure AnalyzeKey (const aKey: string);
var
  Msg  : string;
  Map  : string;
  Value : Integer;
  ch   : Char;
begin
  Msg := 'Eingegebener Schlüssel: ' + aKey + #13#13;

  // alle Stellen des Schlüssels verarbeiten
  for ch in aKey do
    begin
      // eine Stelle in einen Zahlenwert umwandeln
      Value := StrToIntDef('$' + ch, 0);

      // Faktoren ermitteln, aus denen sich der Zahlenwert zusammensetzt
      Map := '';
      if Odd(Value) then Map := Map + '1 ';
      if Odd(Value shr 1) then Map := Map + ' 2 ';
      if Odd(Value shr 2) then Map := Map + ' 4 ';
      if Odd(Value shr 3) then Map := Map + ' 8 ';

      // Ergebnis an Ausgabetext anhängen
      Msg := Msg + #13 + ch + ' -> ' + Map;
    end;

  // Ergebnis ausgeben
  ShowMessage (Msg);
end;
Gruß Hawkeye


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:42 Uhr.
Seite 1 von 2  1 2      

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