AGB  ·  Datenschutz  ·  Impressum  







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

Hex to Bin -> Falsche eingabe

Ein Thema von Marcel2906 · begonnen am 19. Aug 2011 · letzter Beitrag vom 19. Aug 2011
Antwort Antwort
Seite 2 von 2     12   
Marcel2906

Registriert seit: 17. Aug 2011
Ort: Warendorf
112 Beiträge
 
Delphi 2010 Professional
 
#11

AW: Code erweitern

  Alt 19. Aug 2011, 09:58
Ich habe mein code nochmals überarbeitet.
Nun bekomme ich die Fehlermeldung:

Zitat:
[DCC Fehler] HexToDez.dpr(46): E2034 Zu viele Parameter
zu folgendem abschnitt:

Code:
begin
 repeat
  erfolgreich := True;
  writeln('Bitte Hexadezimalzahl eingeben:');
  readln(h);
   if not length(h) >= 1 then
    erfolgreich := False;

   for i := 1 to Length(h) do
    begin
     if not (AnsiChar(h[i]) in ['0'..'9','A'..'F','a'..'f']) then
      begin
       Writeln('Fehlerhafte Eingabe!');
       erfolgreich := False;
       Break;
      end;
     end;
 until erfolgreich;
WandleHexInDez(h);        //<------hier
end;
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#12

AW: Code erweitern

  Alt 19. Aug 2011, 10:06
Du solltest den Code ein wenig auftrennen, dann wird alles auch nicht so wuselig.

Hier mal eine Vorlage, wo du die Prüfung und Wandlung noch ausformulieren musst:

Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

procedure Eingabe( var EingabeText : string );
begin

  if EingabeText <> ''
  then
    begin

      Writeln( 'Fehler: ' + EingabeText + ' ist keine Hexadezimalzahl!' );
      Writeln;

    end;

  Writeln( 'Bitte Hexadezimalzahl eingeben:' );
  ReadLn( EingabeText );

end;

function IstHexZahl( const EingabeText : string ) : Boolean;
begin

  // Hier muss noch der Code für die Prüfung rein

  Result := True;
end;

function HexZahlNachInteger( const HexZahl : string ) : Integer;
begin

  // Hier muss noch der Code für die Umwandlung rein

  Result := 0;
end;

procedure Ausgabe( const HexZahl : string; Zahl : Integer );
begin

  Writeln( 'Hex ' + HexZahl + ' ist dezimal ' + IntToStr( Zahl ) );

end;

var
  EingabeText : string;
  Zahl : Integer;

begin
  try

    EingabeText := '';

    // Eingabe

    repeat

      Eingabe( EingabeText );

    until IstHexZahl( EingabeText ) or ( EingabeText = '' );

    if EingabeText <> ''
    then
      begin

        // Verarbeitung

        Zahl := HexZahlNachInteger( EingabeText );

        // Ausgabe

        Ausgabe( EingabeText, Zahl );

      end;

  except
    on E : Exception do
      Writeln( E.ClassName, ': ', E.Message );
  end;

end.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Code erweitern

  Alt 19. Aug 2011, 10:24
if not (AnsiChar(eingabe[i]) in ['0'..'9','A'..'F','a'..'f']) then
Davon würde ich dir schnell mal abraten.

Delphi-Quellcode:
var S: String;

S := '4';
if AnsiChar(S[1]) in ['0'..'9'] then
  ShowMessage('jupp ^^');
S := #$1234;
if AnsiChar(S[1]) in ['0'..'9'] then
  ShowMessage('hä? o.O');


S := 'A';
if AnsiChar(S[1]) in ['A'] then
  ShowMessage('jupp ^^');
S := '';
if AnsiChar(S[1]) in ['A'] then
  ShowMessage('hä? o.O');
// aka
S := #$0041;
if AnsiChar(S[1]) in [#$41] then
  ShowMessage('jupp ^^');
S := #$AD41;
if AnsiChar(S[1]) in [#$41] then
  ShowMessage('hä? o.O');
Den Hinweis, den Delphi dir, bei Verwendung von IN, gibt, sollte man beachten.
(es sei denn, man prüft auch noch, ob dieses Char sich wirklich in einem passenden "ANSI"-bereich befindet)


PS: entweder "erfolgreich" oder Break ... Beides ist hier etwas übertrieben/nutzlos.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#14

AW: Code erweitern

  Alt 19. Aug 2011, 10:38
Bitte gebe deinem ersten Beitrag einen aussagekräftigen Titel.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
ensaron

Registriert seit: 29. Aug 2008
Ort: 10369 Berlin
63 Beiträge
 
Delphi 10.3 Rio
 
#15

AW: Code erweitern

  Alt 19. Aug 2011, 11:10

Den Hinweis, den Delphi dir, bei Verwendung von IN, gibt, sollte man beachten.
(es sei denn, man prüft auch noch, ob dieses Char sich wirklich in einem passenden "ANSI"-bereich befindet)
Hinweis? Da gabs bei mir keinen.
Was wäre denn die bessere Variante?

PS: Das Break ist natürlich nicht notwendig, aber ich finds schöner, die Überprüfung der Eingabe abzubrechen, nachdem das erste ungültige Zeichen entdeckt wurde.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Hex to Bin -> Falsche eingabe

  Alt 19. Aug 2011, 11:52
PS: Das Break ist natürlich nicht notwendig, aber ich finds schöner, die Überprüfung der Eingabe abzubrechen, nachdem das erste ungültige Zeichen entdeckt wurde.
Ich sagte ja "entweder oder".
- man kann die Schleife mit Break verlassen
- oder sie endet über die Until/While-Bedingung
Und da hier Bedingung und Break das Selbe machen, ist Eines überflüssig.

Ich wäre sehr überrascht, wenn hier keine Meldung kommen würde:
if not (eingabe[i] in ['0'..'9','A'..'F','a'..'f']) then
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
ensaron

Registriert seit: 29. Aug 2008
Ort: 10369 Berlin
63 Beiträge
 
Delphi 10.3 Rio
 
#17

AW: Hex to Bin -> Falsche eingabe

  Alt 19. Aug 2011, 12:13
Ich hab in der Repeat..Until-Schleife ja noch eine For-Schleife drin, die Zeichen für Zeichen über die Eingabe drübergeht. Mit dem Break spring ich auf der For-Schleife, nicht aus der Repeat-Schleife, raus.

Ich wäre sehr überrascht, wenn hier keine Meldung kommen würde:
if not (eingabe[i] in ['0'..'9','A'..'F','a'..'f']) then
Anbei ein Screenshot-Beweis ^^ Und nein, den hab ich nicht gefälscht ^^

EDIT: Aaah du meinst, wenn ich das "AnsiChar" rausnehme - Ja dann bekomm ich ne Warnung, dass ich lieber "CharInSet" verwenden sollte ^^
Screenshot wieder ausgenommen, da somit irrelevant ^^

Geändert von ensaron (19. Aug 2011 um 12:17 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Hex to Bin -> Falsche eingabe

  Alt 19. Aug 2011, 12:33
OK, daß dort noch was mit in der Schleife drinsteht, war nicht zu erkennen.
Demnach bezog ich mich natürlich nur auf die oben gepostete Version


Jupp, denn min AnsiChar schneidest so so um die 65.000 weitere Kombinationen einfach weg, bzw. ignosierst sie vergleichst nur das untere Byte, also 256 Möglichkeiten.
Nimmt man aber das obere Byte mit in Bezug, dann gibt es für Jeden AnsiChar-Wert noch 255 weitere Werte, welche eigentlich nicht gemeint waren.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 19:04 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