Null-terminiert: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
K (Für C++ Programmiere{r})
K
 
(Eine dazwischenliegende Version von einem anderen Benutzer wird nicht angezeigt)
Zeile 1: Zeile 1:
Strings in der Programmiersprache '''C''' sind Felder (Arrays) die Zeichen (Char) enthalten. Das Ende der Zeichenkette ist markiert mit dem Endezeichen "'''\0'''".
+
Strings in der Programmiersprache '''C''' sind Felder (Arrays), die Zeichen (Char) enthalten. Das Ende der Zeichenkette ist markiert mit dem Endezeichen "'''\0'''".
  
===Wieso benutzt OpenGL Null-terminierte Strings?===
+
===Darstellungsmöglichkeiten von Strings===
OpenGL ist eine API welche selbst in '''C''' geschrieben wurde. Da '''C''' keine anderen Strings kennt als das Charakter-Array wurde auch in OpenGL auf dieses Konzept zurück gegriffen.
+
====ShortString in Delphi====
 +
5,"Hallo"
 +
Hier bedeutet der Wert 5, dass der String 5 Zeichen lang ist. Der Wert 5 wird hier (meines Wissens) im ersten Byte des Arrays gespeichert.
  
Meist wird nicht das Feld selbst übergeben sondern eine Zeiger (Pointer) auf das Feld. (Pointer auf Null-terminierte Strings heißen deshalb in Pascal/Delphi auch '''PChar'''). Damit ist man dann theoretisch in der Lage den String zu benutzen. Üblich ist meist noch, die Länge des Strings mit anzugeben (In OpenGL wird darauf meist verzichtet.).
+
====Null-terminiert====
 +
"Hallo",0
 +
Das letzte Byte des Strings hat den Wert 0, was angibt, dass der String hier zu ende ist. Die Länge eines solchen Strings kann man sich natürlich leicht berechnen.
 +
 
 +
Diese Methode hat den Vorteil, dass der String keine Längenbegrenzung hat, er kann also auch ein paar Megabyte groß sein. Bei einer Methode ähnlich zu ShortString bräuchte man dafür bereits eine 4 Byte große Längenangabe.
 +
 
 +
Der Nachteil ist aber natürlich, dass man sich die Länge des Strings berechnen muss, wenn man sie benötigt. Null-terminierte Strings sind also bei vielen Operationen etwas langsamer.
 +
 
 +
===Wieso benutzt [[OpenGL]] null-terminierte Strings?===
 +
Für Standards ist es immer wünschenswert möglichst wenig Fehleranfälligkeiten (hier im Bezug auf Überläufe oder Overflows) und gleichzeitig möglichst wenig Spezialfälle zu bieten. Hier wurde also auf die etwas geringere Performance keine Rücksicht genommen.
 +
 
 +
Meist wird nicht das Feld selbst übergeben sondern ein Zeiger (Pointer) auf das Feld. (Pointer auf null-terminierte Strings heißen deshalb in Pascal/Delphi auch '''PChar'''). Damit ist man dann theoretisch in der Lage, den String zu benutzen. Wenn man im Delphi-Stil die Länge eines Strings haben möchte, muss man sich diese wie bereits erwähnt selbst berechnen, also den String nach dem "'''\0'''"-Zeichen durchsuchen.
  
 
===Für C++ Programmierer===
 
===Für C++ Programmierer===
Die STL-Klasse "String" erlaubt auch den gespeicherten String als "C-String" also als Null-terminierten String zu verwenden. Der entsprechende Funktionsaufruf ist {{INLINE_CODE|String.c_str()}}.
+
Die STL-Klasse "std::string" erlaubt auch, den gespeicherten String als "C-String", also als null-terminierten String, zu verwenden. Der entsprechende Funktionsaufruf ist {{INLINE_CODE|String.c_str()}}.

Aktuelle Version vom 13. Juli 2011, 01:35 Uhr

Strings in der Programmiersprache C sind Felder (Arrays), die Zeichen (Char) enthalten. Das Ende der Zeichenkette ist markiert mit dem Endezeichen "\0".

Darstellungsmöglichkeiten von Strings

ShortString in Delphi

5,"Hallo"

Hier bedeutet der Wert 5, dass der String 5 Zeichen lang ist. Der Wert 5 wird hier (meines Wissens) im ersten Byte des Arrays gespeichert.

Null-terminiert

"Hallo",0

Das letzte Byte des Strings hat den Wert 0, was angibt, dass der String hier zu ende ist. Die Länge eines solchen Strings kann man sich natürlich leicht berechnen.

Diese Methode hat den Vorteil, dass der String keine Längenbegrenzung hat, er kann also auch ein paar Megabyte groß sein. Bei einer Methode ähnlich zu ShortString bräuchte man dafür bereits eine 4 Byte große Längenangabe.

Der Nachteil ist aber natürlich, dass man sich die Länge des Strings berechnen muss, wenn man sie benötigt. Null-terminierte Strings sind also bei vielen Operationen etwas langsamer.

Wieso benutzt OpenGL null-terminierte Strings?

Für Standards ist es immer wünschenswert möglichst wenig Fehleranfälligkeiten (hier im Bezug auf Überläufe oder Overflows) und gleichzeitig möglichst wenig Spezialfälle zu bieten. Hier wurde also auf die etwas geringere Performance keine Rücksicht genommen.

Meist wird nicht das Feld selbst übergeben sondern ein Zeiger (Pointer) auf das Feld. (Pointer auf null-terminierte Strings heißen deshalb in Pascal/Delphi auch PChar). Damit ist man dann theoretisch in der Lage, den String zu benutzen. Wenn man im Delphi-Stil die Länge eines Strings haben möchte, muss man sich diese wie bereits erwähnt selbst berechnen, also den String nach dem "\0"-Zeichen durchsuchen.

Für C++ Programmierer

Die STL-Klasse "std::string" erlaubt auch, den gespeicherten String als "C-String", also als null-terminierten String, zu verwenden. Der entsprechende Funktionsaufruf ist String.c_str().