Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi StrToChar??????? (https://www.delphipraxis.net/2313-strtochar.html)

lodda 17. Jan 2003 16:13

Der Typ char ist nicht einstellig. Er ist geanu 1 Byte groß und geht damit von 0 bis 255

sakura 17. Jan 2003 16:18

@Chakotay1308: Ich muss Dich erst einmal enttäuschen. Du hast da ein arges Verstädnisproblem.

Wenn ein String so definiert wäre
Delphi-Quellcode:
type
  String = array[0..255] of char;
, dann könntest Du immer noch auf die 100. Stelle mit StringName[100] zugreifen. Ohne Problem. Zusätzlich: Ein Char ist ein Byte groß, dass heisst, ess kann eine beliebigen Wert zwischen #0 und einschließlich #255 einnehmen.

Nun zum "AS-IS"
Ein String ist ein Pointer auf einen Block mit folgender Definition
Delphi-Quellcode:
type
  PStrRec = ^StrRec;
  StrRec = packed record
    refCnt: Longint;
    length: Longint;
  end;
Das dahinter die eigentlichen Daten stehen, versteckt Delphi vor uns, wie freundlich :)

Der ShortString hat keine direkte Definition, ist von der Logik aber wie folgt aufgebaut:
Delphi-Quellcode:
type
  // ObereGrenze liegt im Bereich von 1..255 (Standard=255)
  ShortString: array[0..ObereGrenze] of AnsiChar;
Du kannst Dir eigene Shortstrings definieren. Ein Datentyp ShortString der Länge 56 Zeichen wäre
Delphi-Quellcode:
type
  MyShortString56 = string[56];

HAF68k 17. Jan 2003 17:10

das ist der eintrag von der delphi hilfe zum thema
mit der ORD-funktion.
Code:
uses Dialogs;
type

   Colors = (RED,BLUE,GREEN);

var

  S: string;
 begin
   S := 'BLUE has an ordinal value of ' + IntToStr(Ord(BLUE)) + #13#10;
   S := S + 'The ASCII code for "c" is ' + IntToStr(Ord('c')) +  ' decimal';
   MessageDlg(S, mtInformation, [mbOk], 0);
 end;
ich hoffe du hast das gemeint.
ansonsten meldest dich halt

Sebastian Nintemann 17. Jan 2003 18:00

Noch einmal zum Thema einstellig:
Ein Char ist insofern einstellig, als das es nur einen Character (Buchstaben) aufnehmen kann, nämlich genau einen aus dem 256 (0..255) Zeichen umfassenden ASCII Alphabet. Zahlenmäßig gesehen ist ein Char (ein Byte) also keineswegs einstellig sondern kann Zahlen im Bereich 0..255 aufnehmen.

Gruß, Sebastian

Hansa 17. Jan 2003 19:05

Hi,

da muß ich meinen Senf für die Nachwuchskünstler eben auch noch dazu geben. Auch um die Verwirrung wenigstens vollständig zu machen. :mrgreen:

Zitat:

Zitat von Grotesquery
Zahlenmäßig gesehen ist ein Char (ein Byte) also keineswegs einstellig sondern kann Zahlen im Bereich 0..255 aufnehmen.

Da werden keine Zahlen aufgenommen. Ein Char ist schon einstellig, weil es eben nur ein Buchstabe ist :!: Wie soll man aber 256 Buchstaben in einem einstelligen Wert unterbringen ? Ganz einfach : in einer Oktalzahl (=1 Byte). Die größte wäre dann eben 11111111, wobei die 1 je Stelle verdoppelt wird. 8 Einsen sind dann 1+2+4+8+16+32+64+128 = 255 im Dezimalsystem zuzüglich der Null, insgesamt also 256.

Stelle Dir a..z vor, dann hätte a den Wert 1 und z den Wert 26. Dann nimmst Du noch die Großbuchstaben, dann sinds schon 52. Dann noch die Umlaute, Zahlen, Punkt, Komma, blablabla. Dann sind es weit über 100. Deshalb sind die Zahlen mit Ihrem ASCII-Wert ("Oktalwert") gespeichert un belegen genau ein Byte. Maximal kriegst Du also 256 Zahlen in einer 8-stelligen Binärzahl unter. Da es aber auch Chinesen gibt, mußte das auf 65XXX erweitert werden. Das ist dann Ansi und die Codepages etc., da blick ich selber nicht genau durch.

Gruß
Hansa

Chewie 17. Jan 2003 19:22

Zitat:

Zitat von Hansa
Maximal kriegst Du also 256 Zahlen in einer 8-stelligen Binärzahl unter. Da es aber auch Chinesen gibt, mußte das auf 65XXX erweitert werden. Das ist dann Ansi und die Codepages etc., da blick ich selber nicht genau durch.

Merkt man :mrgreen:
Ne, quatsch, ich kenn mich auch nicht so aus, aber meines Wissens ist ANSI die 8bit-Erweiterung von ASCII (7Bit). Die 16bit-Variante mit 65536 Zeichen heißt Unicode (das ist dann für die Chinesen :wink: ). Daneben gibt es noch Multibyte-Zeichensätze, die benutzen auf jeden Fall 7Bit, und falls das achte Bit einen bestimmten Wert hat, wird das nächste Byte auch noch mitbenutzt. Ist also komplizierter als DualByte (UniCode), aber platzsparender, da nicht immer zwei Bytes benötigt werden.

sakura 17. Jan 2003 19:25

@Hansa
Ein Byte oder Char ist keine "Oktalzahl", da sich dieser Begriff auf das Oktalsystem bezieht. (Dezimalsystem: 0..9, Binaärsystem: 0..1; Hexadezimalsystem: 0..9,A..F; Oktalsystem: 0..7)

Genau genommen sind die Pascaltypen Char und Byte gleich. Intern (in Assembler) macht Delphi absolut keinen Unterschied zw. Byte und Char. Lediglich für uns Programmierer gibt es einen Unterschied.

Hansa 17. Jan 2003 19:36

Hi,

Zitat:

Zitat von Chewie
Merkt man :mrgreen:
Ne, quatsch, ich kenn mich auch nicht so aus, aber meines Wissens ist ANSI die 8bit-Erweiterung von ASCII (7Bit). Die 16bit-Variante mit 65536 Zeichen heißt Unicode (das ist dann für die Chinesen :wink: ).

Unicode und Ascii: Für mich fast dasselbe. ASCII hat aber definitiv 8 Bit (vielleicht reden wir aneinander vorbei, es gibt auch extended ASCII, dann meine ich eben das)!!! für eben 256 verschiedene Werte.

Mit sieben Bit komme ich nur auf 128. Verdoppele ich ab 256 (8 Bit)wieder Achtmal und addiere dann gibt das 65XXX.

Gruß
Hansa

Hansa 17. Jan 2003 19:43

Hi Sakura,

Zitat:

Zitat von sakura
Genau genommen sind die Pascaltypen Char und Byte gleich. Intern (in Assembler) macht Delphi absolut keinen Unterschied zw. Byte und Char. Lediglich für uns Programmierer gibt es einen Unterschied.

Ja, so ist das. Der Compiler setzt das Zeichen in seinen Ascii-Wert (oder sonstwas zurück). Mit diesem wird dann gerechnet, (SHL, SHR usw.). D.h., da werden die Funktionen ORD, CHR usw. automatisch aufgerufen, um uns die Arbeit zu ersparen. Ich wollte das lediglich einmal in Erinnerung rufen. Denn dadurch kommen auch Rundungsdifferenzen etc. zustande. Gerechnet wird eben letztenendes nur auf Basis von 0 und 1. Also Strom AUS oder Strom EIN.

Gruß
Hansa

sakura 17. Jan 2003 19:51

Zitat:

Zitat von Hansa
Ja, so ist das. Der Compiler setzt das Zeichen in seinen Ascii-Wert (oder sonstwas zurück)

Der Compiler setzt gar nichts zurück. Wenn der Compiler es nicht verhindern würde, dann könntest Du folgendes tun
Delphi-Quellcode:
var
  B: Byte;
  C: Char;
...
B := 65;
C := 'A';
if B = C then
  ...
Der Lauf würde True ergeben, nur der Compiler erlaubt den Vergleich nicht!
Delphi-Quellcode:
var
  B: Byte;
  C: Char;
...
B := 65;
C := 'A';
asm
  Mov AL, B
  Mov AH, C
  CMP AL, AH
  JNZ @@OOPS
  ...
@@OOPS:
Das würde ohne Probleme gehen und True ergeben. Intern sind Byte und Char IDENTISCH.

Zitat:

Zitat von Hansa
D.h., da werden die Funktionen ORD, CHR usw. automatisch aufgerufen, um uns die Arbeit zu ersparen.

Schlußfolgerung aus oben. Der Compiler macht GAR NICHTS.

Zitat:

Zitat von Hansa
Denn dadurch kommen auch Rundungsdifferenzen etc. zustande.

Byte Ganzzahln wie Byte und Integer dies sind, kommt es nicht zu Rundungsfehlern!
...:cat:...


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:06 Uhr.
Seite 2 von 4     12 34      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz