Autor Beitrag
NewCreed
Hält's aus hier
Beiträge: 6

Win XP Prof, Linux

BeitragVerfasst: Fr 17.12.04 15:37 
Hallo!

Ich weiß, dass es nicht die ganze feine Art ist, sich irgendwo neu im Forum anzumelden und gleich mit ner ganz großen Bitte loszuplatzen, aber es ist wirklich ganz dringend (OK, das würde wahrscheinlich jeder sagen, aber es ist wirklich dringend ;)).

Nun zu meinem Problem, um meine Info-Note aufbessern zu können, gab mir mein Informatik-Lehrer heute ein Projekt auf, dass ich bis Montag fertig machen soll, das diesbezügliche Wissen muss selbst erarbeitet werden. Ich hoffe, dass ihr mir in dieser kurzen Zeit noch helfen könnt.

Er meinte zu mir es gäbe drei verschiedene Arten von Strings. Eine "alte", eine aus PASCAL und eine, die was mit C/C++ zu tun hat.
Meine Vermutung: Shortstring; String; nullterminierter String; stimmt das?

Nun soll ich dazu noch ein Programm schreiben (in Delphi), dass diese Stringarten demonstriert (mit schön vielen Kommentaren im Quelltext) und einer ca. 1-seitigen Dokumentation bezüglich dieses Themas.
Hat hier jemand Ideen, wie ich das ganze Umsetzen kann (mein Wissen ist diesbezüglich, milde ausgedrückt, begrenzt).
Den Lehrer zu fragen hat nichts gebracht, da er der Meinung ist, dass alles selbst zu erarbeiten ist...


Vielen Dank schonmal im Voraus...

NewCreed
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6386
Erhaltene Danke: 146

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Fr 17.12.04 15:40 
Deine Vermutung stimmt mit den Stringtypen.
Themen dazu gibt es Forum genug. Da kannst du mit der Suchfunktion einiges finden. Eventuell solltest du auch noch unter PChar suchen.
patrick
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1481

WIN2k, WIN XP
D6 Personal, D2005 PE
BeitragVerfasst: Fr 17.12.04 15:48 
ersteinmal :welcome:

und jetzt knall ich dir erst mal was vor den latz, weil wir hier mit sowas schon viele schlechte erfahrungen gemacht haben :D :
falls du direkten quelltext willst, wird dir hier im forum keiner helfen, sondern immer nur ansätze liefen.( ist ja deine aufgabe :wink: ).

so, soviel dazu. nun zu deinem problem:
mit den stringtypen liegst du richtig.
was für eine delphi-version hast denn du?
in der delphi-hilfe sind nämlich die einzelnen stringtypen ausführlich erklärt (sogar mit quelltext).
zu finden ist das hier im inhaltsverzeichnis:
Object Pascal Reference -> Data types, variables, and constants -> string types

ich hoffe das hilft dir weiter. ansonsten ->fragen 8)

_________________
Patrick
im zweifelsfall immer das richtige tun!!!
Elite
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 17.12.04 15:49 
Hab hier ein komplettes Demo-Programm rumliegen, das die verschiedenen Strings erklärt. Kann dir den Source aus dem Buch wegen Copyright wahrscheinlich nicht geben, aber es funktioneirt so,
dass ein String in den Speicher geschrieben wird. Dann werden Addresse des 1. Bytes, der Speicherbereich des Strings hexadezimal und dazu der String anzezeigt.
Am wichtigsten wird wohl sein, zu erläutern, wie die Datenstruktur der einzelnen Strings aussieht.

Außerdem hat der Motzi mal ein ziemlich ausführliches String-Tutorial geschrieben. Er wird sich sicher noch melden...
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Fr 17.12.04 15:54 
Ich hab mal zum Thema Strings ein Tutorial geschrieben in dem alles wichtige über diese 3 String-Typen steht, das sollte dir weiterhelfen.. :) Zu finden ist es unter www.manuel-poeter.de - ABER, ich hab dir den Link nicht gegeben, damit du das alles einfach so übernimmst (kontrollieren kann ich es zwar eh nicht, aber trotzdem), es soll dir einfach ein bisschen bei der Erarbeitung helfen. Das Tutorial ist teilweise recht tiefgehend (wahrscheinlich tiefer als du das brauchst), wenn also Fragen dazu auftauchen kannst du sie gerne hier im Forum stellen..!

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
NewCreed Threadstarter
Hält's aus hier
Beiträge: 6

Win XP Prof, Linux

BeitragVerfasst: Fr 17.12.04 16:12 
Nein, um Gottes Willen, ich wollte nicht alles so übernehmen, weil ich dan ganze ja auch verstehen muss, da ich dazu ja noch ne Dokumentation abliefern muss, ich werde mir nun erstmal das Tutorial durchkämmen, wenn ich was nicht verstehen sollte, werde ich hier wieder posten... (warum habe ich die dunkle Ahnung, dass es nicht lange dauern wird? ;)).


Also vielen Dank für die bisherigen Antworten


Creed
NewCreed Threadstarter
Hält's aus hier
Beiträge: 6

Win XP Prof, Linux

BeitragVerfasst: Fr 17.12.04 16:34 
Argh... ich bin verwirrt.
Also, der in deinem Tutorial beschriebene AnsiString ist ja bereits ein nullterminierter String. Also habe ich erst 2 Strings unter Delphi ist das richtig? Oder habe ich da jetzt was komplett falsch verstanden?!?
Und was hat es mit den WideStrings auf sich?

Kannn nicht mal jemand für nen kompletten Programmierbeginner die Stringtypen kurz zusammenfassen. Ich komm komplett durcheinander...

Das mit den ShortStrings habe ich verstanden.
Die haben 255 Zeichen, da ein Byte nur 256 Zeichen haben kann und ein Zeichen für die Längenfestlegeung flöten geht.

Wie kann man denn sowas beispielhaft programmieren?

3 Buttons, wobei jeder ne andere Stringart erklärt?

Hmmm, ich danke euch für eure Mühen!


so far...
Creed
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Fr 17.12.04 16:53 
Der dritte String-Typ den dein Lehrer vermutlich gemeint hat ist der PChar. Die AnsiStrings sind intern auch nullterminiert, das ist richtig. Aber das wichtige bei den AnsiStrings ist eben, dass du nicht nicht darum kümmern musst, sondern das Delphi das alles hinter den Kulissen selbst macht. Bei PChars kannst du nicht einfach so Strings per + verknüpfen oder so, sondern man muss alles kompliziert selbst per Hand machen (neuen Speicherblock reservieren, die zwei zu verknüpfenden Strings hintereinander reinkopieren, Nullzeichen setzen).

Ein WideString ist ein String für Unicode. Er besteht nicht aus normalen Chars (1 Byte / Zeichen), sondern aus WideChars (im Normalfall 2 Bytes / Zeichen).

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
NewCreed Threadstarter
Hält's aus hier
Beiträge: 6

Win XP Prof, Linux

BeitragVerfasst: Fr 17.12.04 17:14 
OK, das scheint mir plausibel.

Versteh ich dich dann richtig, dass eine Entwicklung ShortString :arrow: PChar :arrow: (Ansi)String stattgefunden hat?
Gut, das mit den WideStrings kann ich also vergessen, aber meine Frage ist ja beantwortet.

Also vorerst Danke und bis dann dann...
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Fr 17.12.04 18:10 
Nein, die Entwicklung war ShortString -> AnsiString
Den PChar gibts eigentlich schon seit Urzeiten, wird/wurde aber eher im C-Bereich eingesetzt. Delphi/Pascal haben die eigenen String-Typen mitgebracht da man mit denen wesentlich einfacher arbeiten kann. Aber natürlich kann man auch PChars verwenden bzw. muss man verwenden können um mit Win32-API-Funktionen arbeiten zu können da diese in C geschrieben sind und daher PChars erwarten wenn eine Zeichenkette als Parameter übergeben werden muss.

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
Brueggendiek
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 304

Win 98, Win98SE, Win XP Home
D5 Std
BeitragVerfasst: Fr 17.12.04 22:16 
Hallo!

NewCreed hat folgendes geschrieben:
Also, der in deinem Tutorial beschriebene AnsiString ist ja bereits ein nullterminierter String.

Das ist falsch!
Ein AnsiString darf durchaus ein Nullzeichen (#0) enthalten, die Länge wird von Delphi intern bearbeitet. Der AnsiString ist nicht beim Nullbyte zu Ende.
Ein PChar ist dagegen normalerweise beim Nullbyte zu Ende (gibt bei AIP-Aufrufen auch durch Nullbyte getrennte Stringlisten, die sind beim doppelten Nullbyte zu Ende - aber das führt hier zu weit).

Zur Kompatibilität mit API-Aufrufen (da ist ein nullterminierter String nötig) hat ein AnsiString der Länge n immer n+1 Zeichen: die n Datenzeichen und ein von Delphi automatisch angehängtes Nullbyte. Dadurch kann man Pchar(AnsiString) an die API übergeben.

Gruß

Dietmar Brüggendiek
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Sa 18.12.04 15:17 
Brueggendiek hat folgendes geschrieben:
NewCreed hat folgendes geschrieben:
Also, der in deinem Tutorial beschriebene AnsiString ist ja bereits ein nullterminierter String.

Das ist falsch!

Nein, das ist nicht falsch! Du hast recht, beim AnsiString wird intern die Länge mitgespeichert und von daher kann er auch Nullzeichen enthalten, aber schau mal was da rauskommt:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var
  s: String;

s := 'Demonstration';
s[5] := #0;
ShowMessage(s);

Der String wird nur bis zum Vorkommnis des ersten Nullzeichens angezeigt. Außerdem führt Delphi intern immer am Ende des Strings (also an Position Length(String) + 1) immer ein Nullzeichen mit.

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
Sprint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: Sa 18.12.04 15:40 
Motzi hat folgendes geschrieben:
Der String wird nur bis zum Vorkommnis des ersten Nullzeichens angezeigt.

Das liegt aber an Windows und nicht an Delphi.

Zitat:
Außerdem führt Delphi intern immer am Ende des Strings (also an Position Length(String) + 1) immer ein Nullzeichen mit.

Ja, aber nur solange, bis du diesen nicht überschreibst.

_________________
Ciao, Sprint.
Brueggendiek
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 304

Win 98, Win98SE, Win XP Home
D5 Std
BeitragVerfasst: Sa 18.12.04 21:37 
Hallo Manuel!

Gegenbeweis:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var
  s: String;

s := 'Demonstration';
s[5] := #0;
if s = 'Demo' then
  ShowMessage ('Bingo'else
  ShowMessage ('MÖÖÖÖP');

ergibt "MÖÖÖÖP"!

ShowMessage übergibt den Parameter nämlich als PChar an Windows - und für C ist der String beim Nullzeichen zu Ende. Delphi wertet immer die gesamte Stringlänge aus.

Nullterminiert heißt, daß beim Nullzeichen der String zu Ende ist - das ist bei AnsiStrings innerhalb von Delphi-Programmen nicht der Fall. Der Hint im Debugger enthält in Deinem Beispiel übrigens
Zitat:
s = 'Demo'#0'stration'

d.h. Delphi wandelt das korrekt in einen Hint um.

Gruß

Dietmar Brüggendiek
UC-Chewie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 531

WinXP
D5 Ent
BeitragVerfasst: Sa 18.12.04 22:00 
Brueggendiek hat folgendes geschrieben:
Nullterminiert heißt, daß beim Nullzeichen der String zu Ende ist - das ist bei AnsiStrings innerhalb von Delphi-Programmen nicht der Fall.


Und das ist wohl der Diskussion Kern.
Du verstehst unter nullterminiert, dass der String nach der Null zu Ende ist, Manuel versteht darunter aber, dass eine Null am Ende des Strings steht. ;)

_________________
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
NewCreed Threadstarter
Hält's aus hier
Beiträge: 6

Win XP Prof, Linux

BeitragVerfasst: So 19.12.04 22:30 
Wäre vllt jemand noch so freundlich und würde mein Erklärungstext zu Strings durchlesen?
Ich danke euch so, für die Mühe, die ihr euch gemacht habt, um mir zu helfen!


Strings

EINLEITUNG

In der Programmierung (in Delphi) gibt es verschiedene Datentypen (Variablentypen) um Informationen zu speichern. Einer davon sind die Strings, Zeichenketten, die eine Aneinanderreihung von Chars (Zeichen) speichern.
Es gibt drei Arten von Strings, die wir (noch) heutzutage finden.

SHORTSTRINGS

Der älteste Stringtyp ist der ShortString (ShortString ist die seit der Einführung der AnsiStrings verwendete Bezeichnung. Davor waren sie einfach als Strings bekannt). Dieser wurde bis Delphi 2.0 fast ausschließlich verwendet. Dabei wurde ein Array von 256 Zeichen angelegt, wobei das erste dieser Zeichen die Länge des Strings bestimmte, somit hatte der ShortString eine maximale Länge von 255 Zeichen.

LONGSTRINGS

Der zweite Stringtyp ist der LongString (oder heutzutage einfach nur String). Er wurde mit Delphi 2.0 eingeführt und ermöglicht Zeichenketten, die theoretisch unendlich lang sind (und nur durch die Größe des Arbeitsspeichers begrenzt sind). Diese auch als AnsiStrings bekannten Zeichenketten bestehen aus einem, aus 4 Bytes bestehenden Längenzähler, einem ebenfalls aus 4 Bytes bestehenden Referenzzähler und den unbegrenzt langen, darauf folgenden Zeichen. Diese unendlich langen Strings würden allerdings ein Problem darstellen, da der von ihnen genutzte Speicherplatz blockiert würde. Daher bedienen sich die LongStrings eines „Tricks“: Das Array an sich besteht nur aus einem 4 Byte großen Zeiger (Pointer), der dann auf einen dynamisch vergebenen Speicherort im Arbeitsspeicher verweist. So muss der Programmierer nicht schon im Voraus bestimmen, welche Datenmenge zu verarbeiten ist.

Bei beiden Stringarten ist es jedoch möglich den Speicherplatz schon vorher zu begrenzen.

var Name : String[n]

Dabei besteht dann (egal in welcher Delphiversion) der String aus n+1 Chars, wobei das erste Zeichen für die Speicherplatzlänge verwendet wird.

NULLTERMINIERTE SPEICHERKETTEN (PCHARS)

Doch auch unter Delphi 1.x gab es die Möglichkeit Strings zu erstellen, die mehr als 255 Chars enthalten. Diese so genannten PChars funktionieren ähnlich wie die LongStrings, allerdings haben sie einen entscheidenden Nachteil und zwar, dass man vorher die Länge des Strings vorher bestimmen muss. Zwar ist es wieder ein Pointer, der auf ein Bereich im Arbeitsspeicher zeigt, doch dann kommen nur n- viele Zeichen, die dann durch ein #0 (daher nullterminiert = nullbeendet) abgeschlossen werden. Somit besteht ein PChar aus n+1 Zeichen. Die Speichervergabe läuft jedoch nicht wie unter Delphi 2.0 (und folgende) dynamisch ab, sondern muss statisch beantragt werden. Diese Größe lässt sich im Nachhinein nicht mehr modifizieren (jedenfalls nicht ohne den Programmcode zu ändern). Auch wenn diese Prozedur mit dem Anfordern und Freigeben des Speichers recht umständlich ist, so sind diese PChars auch heute noch in Gebrauch, da dieser Stringtyp im Gegensatz zu den anderen mit C kompatibel ist.



Vielen Dank wie immer schon im Voraus...

Creed
wulfskin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: Mo 20.12.04 00:31 
Zitat:
dass man vorher die Länge des Strings vorher bestimmen muss
Vorher doppelt...

Zitat:
Diese Größe lässt sich im Nachhinein nicht mehr modifizieren (jedenfalls nicht ohne den Programmcode zu ändern).
Doch, man kann im nachhinein noch neuen Speicher beantragen (mit ReallocMem). Das heisst, man kann diesen PChar auch dynamisch verändern. Der große Nachteil ist aber und das würde ich noch nennen, dass man keine einfachen Verknüpfungen mehrere String mit dem Pluszeichen durchführen kann sondern immer wieder neuen Speicher reservieren muss und beide an die entsprechende Position reinkopieren muss. Außerdem könntest du noch erwähnen, dass man in Zusammenarbeit mit der Windows API auf PCHars zurückgreifen muss, diese aber ganz einfach durch einen PChar(Str)-Typcast in einen PCHar umwandeln kann.

Viel Erfolg,
Hape!

_________________
Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
Sprint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: Mo 20.12.04 04:30 
NewCreed hat folgendes geschrieben:
Bei beiden Stringarten ist es jedoch möglich den Speicherplatz schon vorher zu begrenzen.

var Name : String[n]

Dabei besteht dann (egal in welcher Delphiversion) der String aus n+1 Chars, wobei das erste Zeichen für die Speicherplatzlänge verwendet wird.


Dein Beispiel ist nur mit kurzen String möglich, nicht aber mit Ansi-/WideStrings. Mit "String[n]" deklarierst du die maximale Länge des ShortStrings und im ersten Zeichen steht die tatsächliche Länge des Strings.

Zitat:
Diese so genannten PChars funktionieren ähnlich wie die LongStrings

Das sehe ich ein bißchen anders. Ein PChar ist nur ein typirisierter Zeiger und Ansi-/WideStrings verhalten sich eher wie ein dynamisches Array das durch Delphi verwaltet wird.

Zitat:
allerdings haben sie einen entscheidenden Nachteil und zwar, dass man vorher die Länge des Strings vorher bestimmen muss. [...] Diese Größe lässt sich im Nachhinein nicht mehr modifizieren

Dadurch das ein PChar nur ein Zeiger ist, kannst du nach Lust und Laune deinen Speicherbereich verkleinern oder vergrößern. Komfortabel wie bei Ansi-/WideStrings ist das natürlich aber nicht.

_________________
Ciao, Sprint.
NewCreed Threadstarter
Hält's aus hier
Beiträge: 6

Win XP Prof, Linux

BeitragVerfasst: Fr 24.12.04 00:52 
Danke an alle, die so fleißig mitgeholfen haben. Das Projekt ist beim Lehrer recht gut angekommen und er war im Allgemeinen zufrieden.

Ich wünsche euch allen eion gesegnetes Fest und einen guten Rutsch.