Hex- & Dual-Zahlen umwandeln

Friesi

Erfahrenes Mitglied
Code:
i := i + (StrToFloat(b[ c]) * Power(2, Length(b) - c));

er kennt bei mit "Power" nicht?!
und bei der FOR to DO schleife sagt er mir immer:
"FOR-Schleifenvariable muß eine einfache lokale Variable sein"

muss ich da vielleicht noch irgendwas machen?!
wiegesagt bin noch net der delphi crack :(
 

Dario Linsky

Erfahrenes Mitglied
für die funktion Power() musst du oben noch "uses ... Math; einbinden. aber die for-schleife sollte eigentlich keine probleme wegen der zählervariable machen.
 

Friesi

Erfahrenes Mitglied
also hab nun:
Code:
if (RadioGroup1.itemindex=1) then
  begin
    //Eingabe
         zahl:= strtoint(eingabe.text);
         i := 0;
    //Verarbreitung
          for c := 1 to length(zahl) do
          begin
            i := i + (StrToFloat(zahl[ c]) * Power(2, Length(zahl) - c));
          end;

und der fehler mit der FOR Schleife kommt doch noch :(
die var zahl ist ein integer wert! (wenn das helfen sollte)



*UPDATE*
Hab meinen fehler gefunden :)
geht ja net mit einem integer wert :D
 
Zuletzt bearbeitet:

Friesi

Erfahrenes Mitglied
so nun klappt alles :)
nur da ich nicht ganz dumm sterben will *gg*
wäre es nett wenn du mir diese funktion auch nochmal erklärst! also wie man sie auf einem blatt ausrechnet oder im kopf ;) weis ich ja :)

aber vielleicht erklärst du mir warum du das "i" und "c" genommen hast u.s.w :)

wäre echt nett!

Code:
begin
  b := '10100';
  i := 0;
  for c := 1 to Length(b) do
  begin
    i := i + (StrToFloat(b[ c]) * Power(2, Length(b) - c));
  end;
end;
 

Dario Linsky

Erfahrenes Mitglied
Code:
b := '10100';
i := 0;
das sollte sich noch selbst erklären. ;)
Code:
for c := 1 to Length(b) do
mit der schleife nimmst du jedes einzelne zeichen aus dem binärstring ...
Code:
i := i + (StrToFloat(b[ c]) * Power(2, Length(b) - c));
... und dann rechnest du. mit strtofloat() machst du aus dem bit, das du gerade hast eine zahl. diese zahl multiplizierst du einfach mit dem ergebnis von 2 hoch der stelle von diesem bit.

zur laufzeit kriegst du damit dann das gleiche ergebnis wie in folgendem beispiel:
i = 0 // vor der schleife
i = i + 1 * 2^4 // erster durchlauf
i = i + 0 * 2^3 // zweiter durchlauf
i = i + 1 * 2^2 // dritter durchlauf
i = i + 0 * 2^1 // vierter durchlauf
i = i + 0 * 2^0 // fünfter durchlauf

natürlich kannst du das auch so in den code schreiben, aber eine schleife ist allerdings wesentlich schneller und flexibler, denn dadurch kann der binärstring beliebig lang sein.
 

Dario Linsky

Erfahrenes Mitglied
ach ja, und die variablennamen hab ich noch vergessen. i hat sich im laufe der zeit irgendwie als allzweck-variable durchgesetzt und muss für so ziemlich alles herhalten (genau wie "blub", "blah" und "doomedVar" ;)). c steht für "count", also die zählervariable für den schleifenkopf. und b wie binär ist dann noch für die abfolge der einzelnen bits da.
übrigen kannst du das auch noch etwas aufspalten, damit du alles etwas übersichtlicher hast:
Code:
var 
  zaehler, laenge, stelle: Integer;
  binaer: String;
  ergebnis, aktuellesBit: Real;
begin
  ergebnis := 0;
  binaer := '10100';
  for zaehler := 1 to Length(binaer) do 
  begin
    aktuellesBit := StrToFloat(binaer[zaehler]); // aktuelles bit auslesen
    stelle := Length(binaer) - zaehler; // Exponent für die Stelle errechnen
    ergebnis := ergebnis + (aktuellesBit * Power(2, stelle)); // aktuellesBit * 2 ^ stelle
  end;
end;
 

Friesi

Erfahrenes Mitglied
also das mit dual ins dezimal und umgedreht geht ja nun prima :)

jetzt steh ich aber beim Hex-Dezimal vor dem problem mit A-F
wie sage ich dem Programm das A = 10 ist?!
er also mit 10 rechnen soll wenn ein A in der Zahl vorkommt?!

Dann noch eine andere kleine frage!
Wie kann ich eine Fehlermeldung ausgeben wenn ins eingabefeld nur 0 und 1 eingegeben werden darf! Also wenn einer 2 eingibt dann eine Fehlermeldung erscheint!
 

Dario Linsky

Erfahrenes Mitglied
Wie kann ich eine Fehlermeldung ausgeben wenn ins eingabefeld nur 0 und 1 eingegeben werden darf! Also wenn einer 2 eingibt dann eine Fehlermeldung erscheint!
das könnte z.b. so aussehen:
Code:
if (Key > #32) and (Key <> #48) and (Key <> #49) then
begin
  Key := #0;
end;

das mit dem hexadezimal-system kannst du unter anderem mit der funktion IntToHex() machen. ;)