Autor |
Beitrag |
Marco D.
      
Beiträge: 2750
Windows Vista
Delphi 7, Delphi 2005 PE, PHP 4 + 5 (Notepad++), Java (Eclipse), XML, XML Schema, ABAP, ABAP OO
|
Verfasst: Sa 18.11.06 14:37
Ich muss die alternierende Quersumme einer Zahl berechnen. Das macht die Routine Foo:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| function Foo(int: integer): integer; var i: integer; s: string; begin result := 0; for i := 1 to 5 do begin if (i mod 2 = 0) then begin s := inttostr(int); result := result + strtoint(s[5 - i]) end else begin s := inttostr(int); result := result - strtoint(s[5 - i]) end; end; end;
procedure TForm1.Button1Click(Sender: TObject); begin showmessage(inttostr(Foo(36036))); end; |
Aber es kommt immer am Ende des letzten Durchlaufes der for-Schleife eine Meldung:
Zitat: |
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Project1.exe ist eine Exception der Klasse EConvertError aufgetreten. Meldung: ''
---------------------------
OK Hilfe
---------------------------
|
Das kann ich mir nicht erklären.
Mehr über das Verfahren gibts hier.
_________________ Pascal keeps your hand tied. C gives you enough rope to hang yourself. C++ gives you enough rope to shoot yourself in the foot
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Sa 18.11.06 14:49
Ein String beginnt immer bei 1.
So nun läuft dein i von 1 bis 5 - letzlich steht da also:
Delphi-Quelltext 1:
| result := result - strtoint(s[5 - 5]) |
5 - 5 ist null, daher nicht definiert
grüße marc
|
|
Marco D. 
      
Beiträge: 2750
Windows Vista
Delphi 7, Delphi 2005 PE, PHP 4 + 5 (Notepad++), Java (Eclipse), XML, XML Schema, ABAP, ABAP OO
|
Verfasst: Sa 18.11.06 14:52
_________________ Pascal keeps your hand tied. C gives you enough rope to hang yourself. C++ gives you enough rope to shoot yourself in the foot
|
|
Marco D. 
      
Beiträge: 2750
Windows Vista
Delphi 7, Delphi 2005 PE, PHP 4 + 5 (Notepad++), Java (Eclipse), XML, XML Schema, ABAP, ABAP OO
|
Verfasst: Sa 18.11.06 14:52
Perfekt es klappt!
_________________ Pascal keeps your hand tied. C gives you enough rope to hang yourself. C++ gives you enough rope to shoot yourself in the foot
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Sa 18.11.06 14:54
Oder du ziehst nicht i von 5 ab, sondern von 6:
Delphi-Quelltext 1:
| result := result - strtoint(s[6 - i]) |
6 - 1 = 5
6 - 2 = 4
...
6 - 5 = 1
//edit: kommt zwars selbe raus, allerdings negativ 
|
|
Marco D. 
      
Beiträge: 2750
Windows Vista
Delphi 7, Delphi 2005 PE, PHP 4 + 5 (Notepad++), Java (Eclipse), XML, XML Schema, ABAP, ABAP OO
|
Verfasst: Sa 18.11.06 14:58
_________________ Pascal keeps your hand tied. C gives you enough rope to hang yourself. C++ gives you enough rope to shoot yourself in the foot
|
|
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 18.11.06 17:10
yep, mit einen datentyp der die werte auf einen festen platz stellt, z.b. BCD (binary coded decimal). <HTH>
|
|
Marco D. 
      
Beiträge: 2750
Windows Vista
Delphi 7, Delphi 2005 PE, PHP 4 + 5 (Notepad++), Java (Eclipse), XML, XML Schema, ABAP, ABAP OO
|
Verfasst: Sa 18.11.06 17:30
Grenzgaenger hat folgendes geschrieben: | yep, mit einen datentyp der die werte auf einen festen platz stellt, z.b. BCD (binary coded decimal). <HTH> |
Noch nie von gehört. Kannst du mir das mal bitte erklären? :p
_________________ Pascal keeps your hand tied. C gives you enough rope to hang yourself. C++ gives you enough rope to shoot yourself in the foot
|
|
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 18.11.06 17:45
hier sind je 2 Ziffern in einem byte codiert im high und low nibble. der processor kennt das format und kann damit normal rechnen. das bcd format wird normal für kaufmännische anwendungen eingesetzt, da hier der prozessor nicht keine rundungsdifferenzen auftreten, im gegendsatz zu fliesskommazahlen. kannst ja mal kurz im netz (z. B. de.wikipedia.org/wiki/BCD-Code) lurken unter BCD oder in der delphi hilfe.
alternativ hier einen etwas optimierteren code deiner routine
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| FUNCTION Foo(int: INTEGER): INTEGER; VAR i, l: INTEGER; s: string; BEGIN s := IntToStr(int); l := length(s); result := 0; FOR i := 1 TO l DO IF (i MOD 2 = 0) THEN result := result - (INTEGER(s[1 + l - i]) - 48) ELSE result := result + (INTEGER(s[1 + l - i]) - 48); END; |
//Edit: Klammern ergänzt
Zuletzt bearbeitet von Grenzgaenger am Sa 18.11.06 18:12, insgesamt 4-mal bearbeitet
|
|
Marco D. 
      
Beiträge: 2750
Windows Vista
Delphi 7, Delphi 2005 PE, PHP 4 + 5 (Notepad++), Java (Eclipse), XML, XML Schema, ABAP, ABAP OO
|
Verfasst: Sa 18.11.06 17:52
Delphi-Quelltext 1:
| Result := Result - INTEGER(s[1 + l - i]) - 48 |
Würdest du mir diese Zeile bitte erklären? Vor allem die 48.
Und warum ermittelst du die Länge von s bevor s die Zahl zugewiesen wird? Was genau ist denn bei diesem Verfahren nun der Vorteil?
_________________ Pascal keeps your hand tied. C gives you enough rope to hang yourself. C++ gives you enough rope to shoot yourself in the foot
|
|
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 18.11.06 18:02
hast recht, das mit der längengabe, hat sich 'n fehler beim layouten eingeschlichen, der ist korrigiert.
das mit dem 48 lässt sich aufklären mit 'n blick auf www.torsten-horn.de/techdocs/ascii.htm, da ich jetzt einfach die zahl, die im string steht manuell umrechne, damit erspare ich mir den aufwand über den strtoint... das integer sagt dass es sich um kein zeichen sondern um einen integer handelt, wenn ich von dem integer dann 48 abziehe komme ich ganz normal auf den wert der ziffer... das andere ist die indexierung. plus 1, da der string jetzt ab 1 und nicht mehr bei 0 beginnt, ist hier für den index eine stelle hinzuzufügen.
<HTH>
|
|
Marco D. 
      
Beiträge: 2750
Windows Vista
Delphi 7, Delphi 2005 PE, PHP 4 + 5 (Notepad++), Java (Eclipse), XML, XML Schema, ABAP, ABAP OO
|
Verfasst: Sa 18.11.06 18:06
Grenzgaenger hat folgendes geschrieben: | hast recht, das mit der längengabe, hat sich 'n fehler beim layouten eingeschlichen, der ist korrigiert.
das mit dem 48 lässt sich aufklären mit 'n blick auf www.torsten-horn.de/techdocs/ascii.htm, da ich jetzt einfach die zahl, die im string steht manuell umrechne, damit erspare ich mir den aufwand über den strtoint... das integer sagt dass es sich um kein zeichen sondern um einen integer handelt, wenn ich von dem integer dann 48 abziehe komme ich ganz normal auf den wert der ziffer... das andere ist die indexierung. plus 1, da der string jetzt ab 1 und nicht mehr bei 0 beginnt, ist hier für den index eine stelle hinzuzufügen.
<HTH> |
Danke, ich schau's mir mal an. 
_________________ Pascal keeps your hand tied. C gives you enough rope to hang yourself. C++ gives you enough rope to shoot yourself in the foot
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: So 19.11.06 15:47
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
Marco D. 
      
Beiträge: 2750
Windows Vista
Delphi 7, Delphi 2005 PE, PHP 4 + 5 (Notepad++), Java (Eclipse), XML, XML Schema, ABAP, ABAP OO
|
Verfasst: So 19.11.06 15:50
Danke, aber das hat sich erledigt. 
_________________ Pascal keeps your hand tied. C gives you enough rope to hang yourself. C++ gives you enough rope to shoot yourself in the foot
|
|
wulfskin
      
Beiträge: 1349
Erhaltene Danke: 1
Win XP
D5 Pers (SSL), D2005 Pro, C, C#
|
Verfasst: So 19.11.06 16:53
Martok hat folgendes geschrieben: | 4. Stelle von 13549586 ist 9 |
Mhhhh, ich seh die vier an vierter Stelle....
_________________ Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: So 19.11.06 19:08
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
wulfskin
      
Beiträge: 1349
Erhaltene Danke: 1
Win XP
D5 Pers (SSL), D2005 Pro, C, C#
|
Verfasst: So 19.11.06 19:12
_________________ Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
|
|
|