-
Bereich der
Erfindung
-
Die vorliegende Erfindung betrifft
ein verbessertes objektorientiertes Betriebssystem für einen
Computer. Sie betrifft insbesondere ein Betriebssystem, das auf
C++ Programmiertechniken basiert. Die im Handel erhältliche
Ausgestaltung dieses Betriebssystems ist das von Psion Software
Plc in England hergestellte Betriebssystem EPOC32. EPOC32 ist ein
bevorzugtes Betriebssystem in der mobilen Rechenumgebung.
-
Beschreibung des Standes
der Technik
-
Die Programmiersprache C++ wird weithin
zum Schreiben von Anwendungsprogrammen für Computer wie Personal Computer
eingesetzt, wird jedoch nur selten zum Schreiben von Betriebssystemen
verwendet. Beim Schreiben für
Personal Computer gibt es im Allgemeinen keine zwingende Forderung,
die Größe des ablauffähigen Codes
zu minimieren oder die Zahl der zum Ausführen von Schritten in dem Programm
benötigten
Zyklen minimal zu halten. Die wichtigeren Anforderungen sind gewöhnlich Leistung
und Programmiererfreundlichkeit.
-
Es gibt aber auch andere Zusammenhänge, in
denen der ablauffähige
Code ein Minimum an Raum belegen (z. B. um die Menge an für dessen
Speicherung benötigten
ROM und/oder RAM minimal zu halten) und in der geringstmöglichen
Anzahl von Zyklen ablaufen muss (z. B. um die Leistungsaufnahme
minimal zu halten).
-
Umgebungen wie mobiles Rechnen (z.
B. Personal Digital Assistants), Smart Phone (z. B. zelluläre GSM-Telefone
mit eingebauter Textverarbeitung, Senden/Empfangen von Facsimile
und Internet-Browsing Fähigkeiten)
sowie Netzwerkcomputer ("NC") sind Beispiele
für Situationen,
in denen es vorteilhaft ist, die Code-Größe des Betriebssystems zu minimieren;
es können
nämlich
die Hardware-Kosten (besonders für
ROM und/oder RAM) reduziert werden. Dies ist besonders in den obigen
Zusammenhängen
von Bedeutung, da ein breiter Verbraucheranklang im Allgemeinen
von relativ niedrigen Hardwarepreisen abhängig ist. Ebenso ist die Minimierung
von Prozessorausführungszyklen
des Betriebssystems in mobilen Rechen- und Smart-Phone-Situationen sehr
wichtig, da dadurch die Leistungsaufnahme minimiert wird, und eine
minimale Leistungsaufnahme ist für
eine lange Batterielebensdauer wesentlich. Ein in C++ geschriebenes,
vollständig
entwickeltes Betriebssystem hätte
im Allgemeinen eine erhebliche Größe und einen großen Leistungsbedarf.
Es wäre
daher für
mobile Rechenumgebungen, Smart-Phone- und NC-Umgebungen nicht geeignet.
-
Es wird ferner im Allgemeinen als
schwierig angesehen, ein vollfunktionelles Betriebssystem in C++ zu
entwerfen, das die strengen Anforderungen an Code-Größe und Zyklus-Overhead
erfüllt,
besonders die strengen Anforderungen in Verbindung mit Mobil-, Smart-Phone-
und NC-Rechenumgebungen.
-
Terminologie
-
"Objekte der String-Klasse"
-
In C++ wird Text (z. B. Folgen von
Buchstaben, die tatsächlich
auf einem Computerbildschirm erscheinen) als „Objekt" dargestellt. Der in C++ oder anderen
objektorientierten Sprachen bewanderte Implementierer wird mit dieser
Kategorisierung vertraut sein. Solche textbezogenen Objekte sind
von einem besonderen Typ, den wir nachfolgend als "Objekte der String-Klasse" bezeichnen werden:
Die Art von Klasse, zu der ein Objekt gehört (z. B. bei Text die String-Klasse),
definiert die zulässigen
Manipulationen, die an diesem Objekt ausgeführt werden können. Es
können
nur bestimmte Manipulationen an Objekten der String-Klasse durchgeführt werden
(z. B. Verkettung von 2 Textstrings miteinander). Ein bestimmtes
Objekt der String-Klasse repräsentiert somit
einen bestimmten Textstring. Es kann nur auf bestimmte, gut definierte
Weisen manipuliert werden.
-
Die folgenden Schritte werden in
konventioneller C++ Programmierung durchgeführt, um ein Objekt der String-Klasse
von einem Textelement zu erzeugen, wobei sich der Text in einer
Datei im Ablagesystem befindet:
-
- – Reservieren
einer Pufferstelle im Speicher
- – Lesen
des Texts in den Puffer mit einer Dateilesefunktion
- – Benutzen
einer Stringerzeugungsfunktion, um die gepufferten Daten in ein
Objekt der String-Klasse umzuwandeln
- – Verwerfen
des Pufferinhalts
-
Die eigentliche Speicherstelle des
Textstrings lässt
sich in C++ nur schwer identifizieren, aber man braucht diese Stelle
auch eigentlich gar nicht zu kennen, da das Objekt der String-Klasse direkt manipuliert wird,
und dadurch wird der eigentliche Textstring manipuliert. Damit kennt
das Objekt der String-Klasse tatsächlich den Speicherort des
Textstrings und kann alle notwendigen Speichermanagementaufgaben
in Verbindung mit Textmanipulationen handhaben.
-
Mehrere Objektklassen
der String-Klasse
-
In der Version von C++, die als ANSI/ISO
C++ Standardentwurf bekannt ist, werden alle Objekte der String-Klasse
(gemäß dem Beispiel
der String-Klasse in diesem Teil des C++ Standard Library Entwurfs
des obigen Standards <string> genannt) auf eine
Weise gehandhabt, die die Durchführung
von hochentwickelten Speichermanagementaufgaben zulässt (z.
B. Neuzuweisung von Pufferraum für
Text, der wachsen oder schrumpfen kann oder gespleißt werden
kann – volldynamischer
Text). Aber dieses Niveau an Speichermanagement benötigt viel
Code und kann einen beträchtlichen
Freispeicherraum erfordern.
-
Zwei Beispiele für ein konventionelles
C++ Speichermanagement illustrieren dies:
-
Beispiel 1: C++ Handhabung
von Literaltext
-
In C++ gibt es viele Fälle, in
denen Quellcode Textstrings enthält.
Diese Strings werden als 'Literaltext' bezeichnet und werden
nach der Kompilation des Quellcodes zu ablauffähigem Objektcode permanent
im Pufferspeicher gespeichert. Wenn Literaltext manipuliert werden
soll, dann muss davon ein Objekt der String-Klasse erzeugt werden.
Die Erzeugung dieses Objektes der String-Klasse führt jedoch
an sich zur Erzeugung des Textstrings im Speicher, den das neu erstellte
Objekt der String-Klasse tatsächlich
manipuliert. Somit wird der Textstring im Speicher dupliziert: einmal
im ursprünglichen
Puffer, der bei der Kompilation des Quellcodes entsteht, und dann
wieder in der Speicherstelle in Verbindung mit dem Objekt der String-Klasse,
so dass der Text manipuliert werden kann.
-
Wie oben erwähnt, sind Code-Raum und Leistungsaufnahme
in einigen Rechenumgebungen wesentliche Faktoren. In konventionellen
C++ (wie es im ANSI/ISO C++ Standardentwurf implementiert wird),
gibt es jedoch keinen Mechanismus, um die inhärente Speicherduplizierung
von Literaltext zu überwinden.
Dies ist problematisch, besonders für ein Betriebssystem, da es
in einem Betriebssystem viele Situationen gibt, in denen Literaltext
gehandhabt werden muss.
-
Beispiel 2: C++ Handhabung
von längenbegrenztem
Text
-
In C++ handhabt ein Programmierer
Text mit Freispeicher. Text, dessen Länge begrenzt ist, erfordert in
der Tat nicht den völlig
flexiblen Ansatz, der zum Handhaben von Text notwendig ist, dessen
Länge nicht begrenzt
ist. In konventionellem C++ können
jedoch ausschließlich
völlig
flexible, vollfunktionelle Objekte der String-Klasse verwendet werden,
unabhängig
von der Textlänge.
Dies ergibt großen
Overhead im Speichermanagementcode, da die Handhabung von Freispeicher
code- und zyklusintensiv ist.
-
Insgesamt ist Textspeichermanagement
in C++ code- und zyklusintensiv. Da Code-Raum und Leistungsaufnahme
in mobilen Umgebungen wesentliche Faktoren sind, würde der
Ansatz mit konventionellem C++ zu einem Betriebssystem führen, das
im Hinblick auf Code-Größe und Leistungsbedarf
unakzeptabel wäre.
-
Aussage der
Erfindung
-
Das Betriebssystem der vorliegenden
Erfindung definiert Objekte der String-Klasse (d. h. gemäß Definition
im ANSI/ISO C++ Standardentwurf) um, indem es sie durch eine Dreifachstruktur
von Objekten der String-Klasse substituiert, nämlich drei neue Klassen von
Objekten. Es wird nicht auf alle drei neuen Klassen die konventionelle,
alle Leistungsmerkmale aufweisende Speichermanagementfunktionalität in Verbindung
mit <string> des ANSI/ISO C++ Standardentwurfs
angewendet. In vielen Umgebungen ist zwar die volle Funktionalität nützlich,
aber in (unter anderem) mobilen Rechenumgebungen, in denen Code-Raum
und Leistungsaufnahme wesentliche Faktoren sind, ist sie problematisch.
-
Somit besteht das erfinderische Konzept
der vorliegenden Erfindung verallgemeinert darin, Code-Größe und Zyklus-Overhead
minimal zu halten, indem in einem Computerbetriebssystem eine Familie
von drei verschiedenen Klassen zur Handhabung von Textstrings bereitgestellt
wird: jede Klasse ist für
einen anderen Umstand geeignet. Das gibt Flexibilität: so kann
beispielsweise die alle Leistungsmerkmale umfassende Speichermanagementfunktionalität jetzt
allein auf diejenigen Textstrings angewendet werden, die sie tatsächlich benötigen.
-
Wir nennen diese neue Familie der
String-Klassenobjekte "Deskriptoren". In einer bevorzugten
Ausgestaltung nennen wir die Mitglieder dieser Familie „Zeigerdeskriptoren", „Pufferdeskriptoren" und „Freispeicherdeskriptoren". Es muss darauf
hingewiesen werden, dass diese Konzepte sich (auch wenn sie damit
verwandt sind) von den etablierten Konzepten von „Zeiger", „Puffer" und „Freispeicher" unterscheiden, mit
denen der kompetente Implementierer vertraut sein wird. Es muss
auch darauf hingewiesen werden, dass sich die in dieser Spezifikation
vorgesehenen Deskriptoren in keiner Weise auf die VMS-Einrichtung
desselben Namens und auch nicht auf den UNIX-Begriff für kleine
ganze Zahlen beziehen, die zum Identifizieren aktiver Betriebssystemdateien
verwendet werden. Der kompetente Implementierer wird verstehen,
dass ein Betriebssystem entwickelt werden kann, in dem die Zahl
der Klassen zum Handhaben von Textstrings größer ist als drei: solche Varianten
fallen in den Umfang der vorliegenden Erfindung. Die Dreifachstruktur
ist die minimale (und in den meisten Fällen effektivste) Proliferation
von Klassen. Ferner sind Deskriptoren vorzugsweise polymorph; somit kann
eine einzige Funktion auf alle Deskriptoren wirken. Dies führt zu erheblichen
Code-Einsparungen und, in einem geringeren Ausmaß, zu geringerem Zyklus-Overhead,
da sonst modifizierte Funktionen für jeden der verschiedenen Deskriptoren
notwendig wären.
-
Spezifischer ausgedrückt, in
einem ersten Aspekt der Erfindung wird ein Computer bereitgestellt,
der so programmiert ist, dass er Objekte der String-Klasse mit einem
objektorientieren Betriebssystem manipulieren oder darauf zugreifen
kann, dadurch gekennzeichnet, dass die Objekte der String-Klasse
von einer einzigen Basisklasse stammen und das Betriebssytem alle
solchen Objekte der String-Klasse gemäß einer oder mehreren der folgenden
Anforderungen handhabt:
-
- (a) Objekte der String-Klasse für Literaltext
werden als zu einer Klasse gehörig
gehandhabt, in der ein Zeiger auf die Speicherstelle zeigt, an der
der Textstring gespeichert wird;
- (b) Objekte der String-Klasse für längenbegrenzten Text werden
als zu einer Klasse gehörig
gehandhabt, in der ein Puffer Text einer vorbestimmten Länge speichert;
- (c) Objekte der String-Klasse, die Freispeicher benutzen, werden
als zu einer Klasse gehörig
gehandhabt, die die volle Menge an verfügbaren Speichermanagementfunktionen
erfordert.
-
Die Erfindung basiert auf der Erkenntnis,
dass zum Erzielen signifikanter Verringerungen von Code und Zyklus-Overhead
das Betriebssystem umstrukturiert werden muss, indem die konventionelle,
einzelne Objektform der String-Klasse (zum Beispiel) durch drei
verschiedene Formen dieses Objektes substituiert werden: jede Form
wird für
verschiedene Umstände
optimiert.
-
In einer bevorzugten Form der Erfindung
werden konventionelle, speicherintensive Texthandhabungstechniken
nur auf Objekte angewendet, die in die neue Deskriptor-Klasse fallen,
die Objekte definieren, die solche Techniken benötigen (d. h. Freispeicher-Deskriptoren). Zeiger-
und Puffer-Deskriptorklassen werden jedoch auf eine Weise konstruiert,
die Code und Prozessorzyklen im Vergleich zu konventionellen String-Klassen
reduziert.
-
Anhand der beiden in der Beschreibung
des Standes der Technik oben erwähnten
Beispiele (d. h. Beispiel 1: C++ Handhabung von Literaltext, und
Beispiel 2: C++ Handhabung von längenbegrenztem
Text) handhabt das Betriebssystem der vorliegenden Erfindung (i)
Literaltext auf eine Weise, die die Notwendigkeit für eine duplizierte
Kopie von Literaltext eliminiert, und (ii) handhabt Text, der zur
Laufzeit dynamisch bestimmt wird, auf eine Weise, die lediglich
eine Code-intensive Nutzung von Freispeicher unter den begrenzten
Umständen
erfordert, in denen dieses tatsächlich
notwendig ist: in anderen Umständen
(z. B. dort, wo der Programmierer die maximale Länge des Texts im Voraus kennt)
wird stattdessen statischer Speicher vewendet. Ausführlichere
Einzelheiten über
die spezifische Handhabung werden nachfolgend gegeben (siehe Abschnitt "Ausführliche
Beschreibung").
-
Das Betriebssystem wird vorzugsweise
so gestaltet, dass es nicht nur Text, sondern auch Rohdaten mit
derselben Dreifachstruktur handhabt.
-
Über
die oben definierte Kombination aus Computer und Betriebssystem
hinaus können
weitere erfinderische Aspekte identifiziert werden. So muss beispielsweise
jedes Gerät,
das eine Schnittstelle mit einem solchen Betriebssystem benötigt, dieselbe
Dreifachstruktur für Objekte
der String-Klasse verwenden. So muss beispielsweise Treibersoftware
für Peripheriegeräte wie Festkörper-Speichergeräte diese
Dreifachstruktur verwenden. Das Gleiche gilt für Schalttafelsoftware für Peripheriegeräte.
-
Weitere Einzelheiten der Erfindung
sind den Ansprüchen
zu entnehmen.
-
In einem zweiten Aspekt wird ein
Verfahren bereitgestellt, das es ermöglicht, dass Objekte der String-Klasse
von einem Programm unter Verwendung eines objektorientieren Betriebssystems
manipuliert werden oder dass darauf zugegriffen wird, das alle solchen
Objekte gemäß einer
oder mehreren der folgenden Anforderungen handhabt:
-
- (a) Objekte der String-Klasse für Literaltext
werden als zu einer Klasse gehörig
gehandhabt, in der ein Zeiger auf die Speicherstelle zeigt, an der
der Textstring gespeichert wird;
- (b) Objekte der String-Klasse für längenbegrenzten Text werden
als zu einer Klasse gehörig
gehandhabt, in der ein Puffer Text einer vorbestimmten Länge speichert;
- (c) Objekte der String-Klasse, die Freispeicher benutzen, werden
als zu einer Klasse gehörig
gehandhabt, die die volle Menge an verfügbaren Speichermanagementfunktionen
erfordert.
-
In einem dritten Aspekt wird Computersoftware
bereitgestellt, die es ermöglicht,
dass Objekte der String-Klasse manipuliert werden oder dass darauf
zugegriffen wird, dadurch gekennzeichnet, dass das Programm alle
solchen Objekte gemäß einer
oder mehreren der folgenden Anforderungen handhabt:
-
- (a) Objekte der String-Klasse für Literaltext
werden als zu einer Klasse gehörig
gehandhabt, in der ein Zeiger auf die Speicherstelle zeigt, an der
der Textstring gespeichert wird;
- (b) Objekte der String-Klasse für längenbegrenzten Text werden
als zu einer Klasse gehörig
gehandhabt, in der ein Puffer Text einer vorbestimmten Länge speichert;
- (c) Objekte der String-Klasse, die Freispeicher benutzen, werden
als zu einer Klasse gehörig
gehandhabt, die die volle Menge an verfügbaren Speichermanagementfunktionen
erfordert.
-
Die Computersoftware wird typischerweise
als rechnerlesbares Medium wie beispielsweise als maskierter ROM
geliefert oder verpackt. Für
Distributionszwecke können
die Medien auch ein konventionelles CD-ROM oder eine Diskette sein.
-
Kurze Beschreibung der
Zeichnungen
-
1 ist
eine schematische Darstellung eines konstanten Zeigerdeskriptors
TPtrC;
-
2A und 2B sind schematische Darstellungen
eines modifizierbaren Zeigerdeskriptors TPtr;
-
3 ist
eine schematische Darstellung eines konstanten Pufferdeskriptors
TBufC;
-
4 zeigt
einen modifizierbaren Zeiger-Deskriptor (einen TPtr), der den TBufC
referenziert;
-
5 ist
eine schematische Darstellung eines modifizierbaren Pufferdeskriptors
TBuf,
-
6 ist
eine weitere schematische Darstellung eines konstanten Pufferdeskriptors
TBufC;
-
7 ist
eine schematische Darstellung der Art und Weise, in der HBufC-Daten
durch den TPtr verändert
werden können;
-
8 illustriert
die Beziehung zwischen den Deskriptor-Klassen schematisch;
-
9 und 10 illustrieren Datenextraktion
von linken Daten mit einem TBufC-Deskriptor;
-
11 und 12 illustrieren Datenextraktion
der rechten Daten mit einem TBufC-Deskriptor;
-
13 und 14 illustrieren die Zuordnung
und Konstruktion eines neuen HBufC-Deskriptors auf dem Freispeicher;
-
15 – 18 illustrieren die Ausrichtung
von Text; und
-
19 illustriert
die Verwendung des '0'-Terminators.
-
Ausführliche
Beschreibung
-
Die vorliegende Erfindung wird mit
Bezug auf eine als EPOC32 bekannte Ausgestaltung beschrieben. EPOC32
ist ein 32-Bit-Betriebssystem, das von Psion Software plc aus England
für den
Einsatz (unter anderem) in mobilen und Smart-Phone-Umgebungen entwickelt
wurde. Weitere Einzelheiten über
die EPOC32 Ausgestaltung sind in SDK über EPOC32 (herausgegeben von
Psion Software Plc, England) offenbart, wovon ein Teil als Anhang
1 beiliegt.
-
EPOC32 wurde so portiert, dass es
auf einer Reihe verschiedener Mikroprozessorarchitekturen läuft. Die
Einzelheiten des Portierens eines Betriebssystems an sich liegen
außerhalb
des Umfangs der vorliegenden Spezifikation, liegen aber im Kenntnisbereich
der Fachperson. Insbesondere wurde EPOC32 so portiert, dass es auf
Mikroprozessoren auf ARM RISC-Basis von Advanced RISC Machines aus
England läuft.
Verschiedene Modelle von ARM-Mikroprozessoren werden weithin in
digitalen Zellulärtelefonen
eingesetzt und sind der Fachperson hinlänglich bekannt. Die Erfindung
kann jedoch auch auf vielen anderen Mikroprozessoren realisiert
werden. Daher sind die Ansprüche
der vorliegenden Spezifikation so zu lesen, dass sie sich auf jede
Hardware- und Software-Implementation beziehen, in der das Betriebssystem
die in den Ansprüchen
begrenzten Funktionen ausführt.
-
Zurückkehrend zu den oben in Verbindung
mit der Erörterung
des Standes der Technik gegebenen Beispielen von Literaltext und
längenbegrenztem
Text, EPOC32 wendet die obige Dreifachstruktur für Objekte der String-Klasse
wie folgt an:
-
Beispiel 1: Literaltext
in EPOC32
-
Wie oben erläutert, wird ein Textstring
in Bezug auf Literaltext in konventionellem C++ im Speicher dupliziert:
einmal im ursprünglichen
Puffer, der beim Kompilieren des Quellcodes entsteht, und dann wieder
in der Speicherstelle in Verbindung mit dem Objekt der String-Klasse, die die Manipulation
des Textes zulässt. Diese
Duplizierung ist verschwenderisch.
-
EPOC32 verwendet jedoch einen Zeigerdeskriptor,
der auf die ursprüngliche
Speicherstelle des Literaltextes zeigt (d. h. gemäß Spezifikation
durch den Kompilierer). Dieser Zeigerdeskriptor (in EPOC32 als TPtrC
Pointer Descriptor bezeichnet) ist das Objekt der String-Klasse
für Literaltext.
(In C++ werden Zeiger gewöhnlich
nicht an sich als Objekte angesehen). Somit führt der Hybrid Zeiger/Objekt
in EPOC32 zur vollständigen
Eliminierung der Notwendigkeit für
eine zusätzliche
Kopie von Literaltext.
-
Beispiel 2: Längenbegrenzter
Text in EPOC32
-
Wie oben erwähnt, gibt es in konventionellem
C++ keinen Mechanismus, um irgendetwas anderes als völlig flexible,
vollumfängliche
Objekte der String-Klasse zu verwenden, unabhängig von der Textlänge. Dies führt zu einem
hohen Overhead an Speichermanagementcode, da die Handhabung von
Freispeicher code- und zyklusintensiv ist.
-
In EPOC32 gibt es eine bestimmte
Klasse von String-Objekten, Pufferdeskriptoren genannt, die größenmäßig begrenzt
sind. Da ihre Größe begrenzt
ist, wird kein komplexer Speicherzuordnungscode für ihre Manipulation
benötigt.
Ferner können
Pufferdeskriptoren statischen Speicher (anstatt Freispeicher) verwenden.
Die Zuordnung von statischem Speicher kann nicht auf code-intensive
Weise geändert
werden, wie dies bei Freispeicher der Fall ist, sondern ist effizienter
im Gebrauch, da weniger Code-Zyklen benötigt werden, um die notwendigen
Manipulationen zu erzielen (dies ergibt Leistungsersparnis). Nur
im wirklich dynamischen Fall benötigt
EPOC32 die Verwendung des Freispeichers mit seinem zugehörigen hohen
Zyklus-Overhead: dann wird die Freispeicher-Deskriptorklasse verwendet.
-
EPOC32 führt die Parameter von längenbegrenzten
String-Klassen unter Verwendung einer Schablonenklasse an, der 'TBuf' Klasse. (Klassenschablonen
definieren die Eigenschaften zahlreicher Objekte der String-Klasse;
so ist beispielsweise TBuf die Schablone für alle Pufferdeskriptoren – d. h.
alle Objekte der String-Klasse der Puffer-Variante. TBuf definiert
bestimmte gemeinsame Eigenschaften für alle solche Objekte der String-Klasse.)
EPOC32 weist mehrere weitere signifikante Merkmale auf, die zu einer
Minimierung der Code-Größe und des
Zyklus-Overhead führen,
nämlich:
-
- – String-
und Rohdaten-Pufferklassenobjekte wirken als 'flache' Strukturen
- – Deskriptoren
ergeben polymorphe Charakteristiken
- – Deskriptoren
erlauben UNICODE- und ASCII-unabhängige Codierung
-
String- und Rohdaten-Pufferklassenobjekte
als flache Strukturen
-
Alle Deskriptoren sind 'flache' Strukturen (d. h.
wenn ein Deskriptor kopiert werden muss, dann wird nur der Deskriptor
selbst kopiert. In konventionellem C++ müssen zum Kopieren eines Objektes
nicht nur das Objekt selbst, sondern auch alle zugehörigen Zeiger
und die Daten kopiert werden, auf die gezeigt wird – d. h. die
komplexe, verwandte Struktur, die einem Objekt Bedeutung gibt. In
EPOC32 ist daher ein Kopieren eines Deskriptors weitaus wirtschaftlicher
im Sinne von Speicher-Overhead und Zyklen, als das Kopieren eines äquivalenten
Objektes in gewöhnlichem
C++.
-
Dies wird in EPOC32 für Puffer
und Zeiger wie folgt erzielt:
-
Pufferdeskriptoren (TBuf) enthalten
den vom Puffer referenzierten tatsächlichen Text: somit wird beim Kopieren
des Puffers inhärent
der verwandte Text kopiert. Es ist nicht notwendig, einen Zeiger
und zugehörige Daten
zu kopieren, wie das in C++ der Fall ist.
-
Zeigerdeskriptoren (TPtr) enthalten
einen C++ Zeiger, so dass lediglich ein Kopieren von TPtr beim Duplizieren
benötigt
wird: in konventionellem C++ müsste nicht
nur eine Entität
kopiert werden, sondern auch zugehörige und separate Zeiger und
Text.
-
Deskriptoren als polymorphe
Objekte
-
Es heißt, eine Gruppe von Objekten
sei dann polymorph, wenn alle Objekte in der Gruppe sich wie ein einzelnes
Objekt verhalten, wobei ein gemeinsames Verhalten durch verschiedene
Mechanismen erzielt wird. Polymorphismus wird in konventionellem
C++ durch virtuelle Funktionen bereitgestellt: alle Objekte, die
zueinander polymorph sind, beinhalten an einer gemeinsamen Stelle
einen Zeiger auf eine virtuelle Funktionstabelle (daher wird in
jedem Objekt ein Zeiger benötigt).
Diese Tabelle identifiziert den tatsächlichen Code für jede polymorphe
Funktion. Es wird für
jede Klasse, die gemeinschaftlich polymorph ist, eine separate Tabelle
benötigt. Aber
dieser Ansatz verlangt erhebliche Speichermengen, da jeder Zeiger
32 Bit (d. h. 4 Zeichen) hat und jedes Objekt einen Zeiger auf eine
virtuelle Funktionstabelle benötigt.
Darüber
hinaus wird in jedem Objekt auch ein 32-Bit-Längenfeld benutzt.
-
Dieser Overhead ist (unter anderem)
in mobilen Betriebssystemumgebungen problematisch. EPOC32 geht dies
für Objekte
der String-Klasse wie folgt an: ein 32-Bit-Längenfeld
wird so unterteilt, dass die ersten 4 Bit den Deskriptortyp codieren.
Dann betrachtet eine Funktion die 4 Bit und zeigt auf die korrekte
Textstelle (z. B. im Deskriptor selbst, wenn der Deskriptor ein
Puffer ist, usw.). Dann wird Polymorphismus dadurch erzielt, dass
jede der drei verschiedenen Deskriptorklassen für Objekte der String-Klasse
(d. h. Zeigerdeskriptoren, Pufferdeskriptoren und Freispeicherdeskriptoren)
lediglich mittels der ersten 4 Bits eines einzelnen 32-Bit-Feldes
codiert werden kann. So können
beträchtliche
Speicherplatzersparnisse erzielt werden. Allgemeiner ausgedrückt, das
Feld nutzt ein Maschinenwort mit einem anderen Datenelement gemeinsam.
-
UNICODE- und ASCII-unabhängiger Code
-
In C++ führt die Codierung für 16-Bit-Unicode
zu einer Verdopplung der Größe aller
Textdaten, die sonst in 8-Bit-Code vorliegen würden. Ebenso muss ein Programmierer
herkömmlicherweise
beim Schreiben von Quellcode entscheiden, ob er Text mit ASCII oder
Unicode codiert.
-
In EPOC32 wird derselbe Quellcode
unabhängig
von der endgültigen
Wahl von ASCII oder Unicode benutzt. Dies wird dadurch erzielt,
dass das System unter Verwendung von Aliasnamen für Klassennamen,
die ASCII- und Unicode-unabhängig
sind, und nicht für
Klassen an sich (z. B. Zeigerdeskriptoren, Pufferdeskriptoren und
Freispeicherdeskriptoren) aufgebaut wird. So wird anstatt mit Zeiger
TPtr16 für
Unicode oder TPtr8 für
ASCII zu codieren, mit dem Klassennamen TPtr gearbeitet. Beim Aufbau
können
die Klassennamen entweder als 16bit-Unicode oder als 8bit-ASCII
kompiliert werden. Dieser Ansatz kann so angewendet werden, dass
er alle Zeichensätze
umfasst, die in verschiedenen Bitlängen codiert werden können.
-
Zusätzliche Vorteile von EPOC32
-
In C++ werden Textstrings herkömmlicherweise
mit einer '0' terminiert, so dass
das System immer weiß,
wo ein Textstring endet. In EPOC32 ist dies nicht mehr notwendig;
Deskriptoren beinhalten eine Anweisung, die die Länge der
referenzierten Daten definiert. Somit ergeben sich weitere Codeeinsparungen,
da es nicht mehr nötig
ist, '0'-Terminatoren zum
Markieren des Endes jedes Textelementes zu benutzen.
-
Zusammenfassung
von Deskriptorenmerkmalen
-
- – Es
gibt 3 Klassen von Deskriptoren: Zeigerdeskriptoren, Pufferdeskriptoren
und Freispeicherdeskriptoren.
- – Zeigerdeskriptoren
können
in zwei Formen vorliegen: konstante Zeigerdeskriptoren: TPtrC, und
modifizierbare Zeigerdeskriptoren: TPtr
- – konstante
Zeigerdeskriptoren: TPtrC
- – Daten
können
hierdurch nicht modifiziert werden.
- – Alle
Memberfunktionen sind konstant
- – Dient
zum Referenzieren von konstanten Strings oder Daten (z. B. Daten,
die nicht verändert
werden dürfen)
- – Wird
von TDesC abgeleitet und hat somit eine große Zahl von Memberfunktionen
- – modifizierbare
Zeigerdeskriptoren: TPtr
- – Daten
können
durch diesen Deskriptor modifiziert werden, solange die Daten nicht
die Maximallänge überschreiten,
die vom Konstruktor festgelegt wurde.
- – Zeigt
direkt auf einen Speicherbereich, der den zu modifizierenden Bereich
enthält.
- – Zeigerlänge bestimmt
die Anzahl der enthaltenen Datenelemente.
- – Erbt
alle TDesC Memberfunktionen plus TDes-Memberfunktionen zum Manipulieren und Ändern von
Daten.
- – Zeigerdeskriptoren
sind von den dargestellten Daten separat; aber sie werden von einem
vorexistierenden Bereich im Speicher konstruiert.
- – Pufferdeskriptoren
liegen in zwei Formen vor:
- – konstanter
Pufferdeskriptor, TBufC<TInt
S>
- – Daten
können
zum Konstruktionszeitpunkt oder später vom Zuweisungsoperator
(Operator =) in den Deskriptor gesetzt werden
- – Länge wird
durch eine Ganzzahlschablone definiert: TBufC<40> enthält 40 Datenelemente
- – Erbt
alle TDesC-Memberfunktionen
- – ein
modifizierbarer Pufferdeskriptor: TBuf<TInt S>
- – enthält Daten,
die modifiziert werden können,
solange die Daten nicht so modifiziert werden, dass sie die Maximallänge überschreiten
- – Maximallänge definiert
die max. Anzahl von Datenelementen
- – Ist-Länge definiert
die tatsächliche
Anzahl von Datenelementen
- – Länge wird
durch eine Ganzzahlschablone definiert: TBuf<40> enthält 40 Datenelemente
und nicht mehr
- – Datenbereich
ist Teil des Deskriptorobjekts
- – nützlich zur
Aufnahme von Daten, die manipuliert und geändert werden müssen, deren
Länge aber
ein bekanntes Maximum nicht überschreiten
darf (z. B. WP-Text)
- – erbt
alle TDesC-Memberfunktionen plus TDes-Memberfunktionen zum Manipulieren und Ändern von
Daten
- – Freispeicherdeskriptoren
haben nur eine Form:
- – konstanter
Freispeicherdeskriptor HBufC
- – enthält eine
Länge,
gefolgt von Daten
- – der
Datenbereich ist Teil des Deskriptorobjekts; das gesamte Objekt
belegt eine from Freispeicher zugeordnete Zelle
- – Daten
können
zum Konstruktionszeitpunkt oder später vom Zuweisungsoperator
(Operator =) in den Deskriptor gesetzt werden
- – erbt
alle TDesC-Memberfunktionen
- – Zuordnung
kann geändert
werden: Datenbereich kann größer oder
kleiner werden
-
Ausführliche Beschreibung: Anhang
1
-
EPOC32 "Descriptors" SDK 1997 von Psion Software Plc. (Auszüge). Es
wird auf die volle SDK, herausgegeben im Juli 1997 (Rev. 1.0) von
Psion Software plc, verwiesen.
-
SDK: Überblick über Deskriptoren
-
Die Dreifachstruktur der Deskriptorklassen
(nämlich
Zeigerdeskriptorklasse, Pufferdeskriptorklasse und Freispeicherdeskriptorklasse)
bietet einen sicheren und einheitlichen Mechanismus zum Zugreifen
auf und Manipulieren von Strings und allgemeinen Binärdaten unabhängig vom
Speichertyp, in dem sie sich befinden. So kann beispielsweise ein
String innerhalb eines Code-Segments in ROM auf ähnliche Weise gehandhabt werden
wie ein Datensatz in RAM.
-
Die von Deskriptoren dargestellten
Daten befinden sich in einem Datenbereich, der eine definierte Stelle
im Speicher ist. Dieser Datenbereich ist nicht erweiterungsfähig. Operationen
an Deskriptordaten sind in dem Sinne sicher, dass versehentliche
oder absichtliche Versuche, auf Speicherstellen außerhalb
des definierten Datenbereiches zuzugreifen, nicht zugelassen werden.
(Im Allgemeinen verursacht Code, der einen ungültigen Zugriff tätigt, einen
Ausnahmezustand (gewöhnlich
Panik genannt)).
-
Deskriptoren unterscheiden nicht
zwischen den repräsentierten
Datentypen; Strings und binäre
Daten werden auf dieselbe Weise behandelt. Einige Memberfunktionen
eines Deskriptorobjektes werden zwar so ausgelegt, dass sie auf
Textdaten wirken, aber sie wirken auch auf binäre Daten. Dies vereinheitlicht
die Handhabung von Text und binären
Daten und erhöht
die Effizienz, indem Code gemeinsam genutzt werden kann. Deskriptorklassen
erfüllen
eine Reihe wichtiger Anforderungen:
-
- – Sie
unterstützen
UNICODE- und ASCII-Text. Das Makro _UNICODE dient zum Wählen der
ASCII- oder UNICODE-Aufbauvariante
- – sie
vereinheitlichen die Handhabung von Strings und binären Daten
- – sie
erlauben eine sichere und praktische Referenzierung von Text oder
Daten in ROM
- – sie
bieten reichhaltige Memberfunktionen zum Manipulieren von zugehörigem Text
oder Daten
- – sie
erlauben eine Modifizierung der Daten, verhindern jedoch jeden Versuch,
außerhalb
des definierten Datenbereiches zu schreiben
- – sie
vermeiden das mit virtuellen Funktionen assoziierte Speicheroverhead
- – sie
verhalten sich wie eingebaute Typen und können auf sichere Weise auf
dem Stapel erzeugt und auch auf sichere Weise verwaist werden.
- – (HBufC
wird auf dem Freispeicher zugeordnet und ist eine Ausnahme zu dieser
Regel)
-
ASCII- und UNICODE-Text
-
E32.descriptors.char-set
-
ASCII-Textzeichen können mit
8 Bits (ein Byte) repräsentiert
werden, während
UNICODE-Zeichen 16 Bits (zwei Byte) erfordern. Zum Unterstützen von
ASCII- und UNICODE-Text gibt es zwei Varianten von Deskriptorklassen:
8 Bit und 16 Bit. So gibt es beispielsweise die folgenden beiden
Zeigerdeskriptorklassen: TPtr8 und TPtr16.
-
Programme können so erstellt werden, dass
sie entweder UNICODE- oder ASCII-Text unterstützen, indem Klassennamen verwendet
werden, die von der Aufbauvariante unabhängig sind. So kann beispielsweise
mittels der Deskriptorklasse TPtr ein System aufgebaut werden, das
entweder die Klasse TPtr8 oder die Klasse TPtr16 verwendet. Die
Entscheidung wird zur Aufbauzeit getroffen und hängt davon ab, ob das Makro _UNICODE
definiert wurde.
-
Die folgenden aus der Anfangsdatei
E3232def.h extrahierten Code-Fragmente (SDK siehe Anhang 1) zeigen,
wie dies implementiert wird, indem die variantenunabhängigen Klassennamen
nach Bedarf definiert werden.
-
-
Anwendungscode sollte eine direkte
Verwendung von String-Literaltext im ,C'-Stil vermeiden. Stattdessen sollte
das Makro _S verwendet werden, um einen String im 'C'-Stil mit geeigneter Breite zu erzeugen, so
dass ein Zeiger des geeigneten Typs zurückgegeben wird. Ebenso sollte
das Makro _L (_L für "literal") verwendet werden,
um einen Deskriptor des geeigneten Typs zu erstellen. Zu Definitionen
dieser Makros siehe e32.macro. S und e32.macro. L.
-
Zum Beispiel erzeugt:
einen
String von Einzelbyte-Zeichen in einem ASCII-Aufbau, aber einen
String von Doppelbyte-Zeichen in einem UNICODE-Aufbau.
erzeugt
einen 8-Bit-Deskriptor in einem ASCII-Aufbau und einen 16-Bit-Deskriptor
in einem UNICODE-Aufbau. Immer beispielsweise _L("abcdef") anstatt einfach "abcdef" verwenden, da so
immer ein Deskriptor der richtigen Variante konstruiert wird.
-
Man beachte, dass ein 8-Bit-String
im 'C'-Stil und ein 8-Bit-Zeigerdeskriptor
explizit unabhängig
von der Aufbauvariante jeweils mit Hilfe der Makros _S8 und _L8
konstruiert werden kann. Die entsprechenden 16-Bit-Versionen, _S16
und _L16, stehen ebenfalls zur Verfügung.
-
Zu deren Definitionen siehe e32.macro._S8,
e32.macro_L8, e32.macro_S16 und e32.macro._L16.
-
Länge und Größe
-
E3232.descriptors.length-and-size
-
Ein Deskriptor charakterisiert die
Daten, die er repräsentiert,
nach der Länge
dieser Daten. Die length eines Deskriptors ist die Anzahl der Datenelemente.
Für die
8-Bit-Varianten ist die Länge
des Deskriptors die Anzahl der Einzelbytes von Daten, die er repräsentiert;
für die
16-Bit-Varianten ist die Länge
des Deskriptors die Anzahl der Doppelbytes von Daten, die er repräsentiert.
-
Die size eines Deskriptors ist die
Anzahl der Bytes, die von den Daten des Deskriptors belegt werden; sie
ist nicht unbedingt identisch mit der Länge des Deskriptors. Für die 8-Bit-Varianten ist
die Größe mit der Länge identisch,
aber für
die 16-Bit-Varianten beträgt
die Größe das Zweifache
der Länge.
Diejenigen Deskriptoren, deren Daten modifiziert werden können, werden
auch durch ihre Maximallänge
charakterisiert. Für
diese Deskriptoren kann die Länge
der repräsentierten
Daten von null bis zu einschließlich
diesem Höchstwert
variieren. Die Maximallänge
für jeden
Deskriptor ist 228.
-
Text und binäre Daten
-
E3232.descriptors.text-and-binary
-
In 'C' werden
Strings durch die Notwendigkeit für einen Null-Terminator charakterisiert,
um das Ende des Strings zu markieren. Sie sind mit einer Reihe von
Problemen behaftet. So können
sie insbesondere keine binären
Daten beinhalten (für
den Fall, dass Daten binäre
Nullen enthalten), und Operationen an ihnen sind im Allgemeinen
ineffizient. 'C'-Strings müssen auf
andere Weise gehandhabt werden als binäre Daten, wie in den Funktionsgruppen
memxxx() und strxxx() in der ANSI 'C'-Bibliothek
reflektiert ist. Deskriptoren erlauben die Darstellung von Strings
und binären
Daten in derselben Weise; so können
dieselben Funktionen in beiden Fällen
verwendet werden. Für
binäre
Daten sollten die 8-Bit-Deskriptoren explizit verwendet werden.
Die Unterscheidung zwischen UNICODE und ASCII hat für binäre Daten
keine Bedeutung. Man beachte, dass es für explizite 16-Bit-Binärdaten keine
praktische Verwendung gibt.
-
Speicherzuordnung
-
E3232.descriptors.alloc
-
Die Deskriptorklassen (mit Ausnahme
von HBufC) verhalten sich wie integrierte Typen. Sie ordnen keinen
Speicher zu und haben keine Destruktoren. Dies bedeutet, dass sie
auf dem Stapel in derselben Weise verwaist werden können wie
ein integrierter Typ. Dies ist besonders in Situationen wichtig,
in denen Code weggehen kann. (Implikationen von Verwaisung siehe
E3232.exception.trap.cleanup.reguirements).
-
Ein HBufC Deskriptorobjekt wird dem
Freispeicher zugeordnet und kann nicht auf dem Stapel erstellt werden.
-
Ausnahmen
-
E3232.descriptors.exceptions
-
Alle Parameter zu Deskriptor-Memberfunktionen
werden geprüft,
um zu gewährleisten,
dass die Operationen korrekt vorgegeben werden und dass keine Daten
außerhalb
des Deskriptor-Datenbereichs geschrieben werden. Eine besondere
Folge ist die, dass keine Memberfunktion einen modifizierbaren Deskriptor über seine
maximale zugeordnete Länge
hinaus erweitern kann. Es liegt in der Verantwortlichkeit des Programmierers
zu gewährleisten,
dass alle Deskriptoren groß genug
sind, um ihre Daten aufzunehmen. Dies geschieht entweder dadurch,
dass die ursprüngliche
Zuordnung groß genug
gemacht wird oder dass die Notwendigkeit für einen größeren Deskriptor vorhergesehen
und zur Laufzeit ein solcher dynamisch zugeordnet wird. Dieser statische
Ansatz lässt
sich leichter implementieren, aber wenn sich dies in einem besonderen
Fall als verschwenderisch erweisen würde, dann wäre vielleicht der dynamische
Ansatz günstiger.
Im Falle einer Ausnahme kann mit Sicherheit angenommen werden, dass
kein illegaler Speicherzugriff erfolgt ist und dass keine Daten
umgesetzt oder beschädigt
wurden.
-
Die Deskriptortypen
-
E3232.descriptors.types
-
Es gibt drei Arten von Deskriptorobjekten:
-
- – Zeiger-Deskriptoren
- Das Deskriptorobjekt ist von den Daten separat, die es repräsentiert,
wird aber für
einen vorexistierenden Bereich im Speicher konstruiert. Sie können zwei
Formen haben:
konstanter Zeigerdeskriptor, TPtrC
modifizierbarer
Zeigerdeskriptor, TPtr
- – Puffer-Deskriptoren
- Der Datenbereich ist Teil des Deskriptorobjekts. Er kann zwei
Formen haben:
konstanter Pufferdeskriptor, TBufC<TInt S>
modifizierbarer
Pufferdeskriptor, TBuf<TInt
S>
- – Freispeicher-Deskriptor
- Der Datenbereich ist Teil des Deskriptorobjektes, und das gesamte
Objekt belegt eine vom Freispeicher zugeordnete Zelle. Er kann nur
eine Form haben:
konstanter Freispeicherdeskriptor, HBufC
-
Zeigerdeskriptor – TPtrC
-
E3232.descriptors.buffer-descriptor.TPtrC
-
TPtrC ist ein konstanter Deskriptor,
durch den keine Daten modifiziert werden können. Alle seine Memberfunktionen
(mit Ausnahme der Konstruktoren) sind constant. TPtrC ist schematisch
in 1 dargestellt.
-
TPtrC ist zum Referenzieren konstanter
Strings oder Daten nützlich;
z. B. zum Zugreifen auf Text, der zu ROM-residentem Code aufgebaut
ist, oder durch Weiterleiten einer Referenz auf Daten im RAM, die
durch diese Referenz nicht modifiziert werden dürfen.
-
TPtrC wird von TdesC abgeleitet,
was eine große
Zahl von Memberfunktionen ergibt, die auf seinem Inhalt wirken können; z.
B. die Suche von Zeichen in Text oder das Extrahieren von Datenabschnitten.
-
Zeigerdeskriptor – TPtr
-
E3232.descriptors.buffer-descriptor.TPtr
-
TPtr ist ein modifizierbarer Zeigerdeskriptor,
durch den Daten modifiziert werden können, vorausgesetzt, dass die
Daten nicht die Maximallänge überschreiten.
Die Maximallänge
wird durch den Konstruktor festgelegt. TPtr zeigt direkt auf einen
Bereich im Speicher, der die zu modifizierenden Daten enthält. TPtr
ist in 2A und 2B schematisch dargestellt.
-
Die maximale Anzahl der Datenelemente,
die der Bereich enthalten kann, wird durch die Maximallänge definiert.
Die Länge
des TPtr zeigt an, wie viele Datenelemente derzeit in den Daten
enthalten sind. Wenn dieser Wert geringer ist als das Maximum, dann
ist ein Teil des Datenbereiches unbenutzt. TPt r ist zum Konstruieren
einer Referenz auf einen Bereich von RAM nützlich, der Daten beinhaltet,
die durch diese Referenz modifiziert werden sollen, oder selbst
auf einen Bereich von RAM, der noch keine Daten enthält, aber
in dem Daten mit den Deskriptorreferenz- und Memberfunktionen konstruiert
werden.
-
TPtr ist auch zum Konstruieren einer
Referenz auf einen TBufC oder einen HBufC Deskriptor nützlich, der
die zu modifizierenden Daten enthält. Ein auf diese Weise verwendeter
TPtr zeigt auf einen TBufC oder einen HBufC Deskriptor. Die im TBufC
oder HBufC Deskriptor enthaltenen Daten können durch den TPtr modifiziert
werden. TPtr wird von TDes abgeleitet, der wiederum von TdesC abgeleitet
wird. Er erbt somit alle const Memberfunktionen, die in TDesC definiert
sind, plus die Memberfunktionen von TDes, die die Daten manipulieren
und ändern
können;
z. B. Anhängen
eines Zeichens an das Ende von existierendem Text.
-
Pufferdeskriptor – TBufC<Tlnt S>
-
E3232.descriptors.buffer-descriptor.TBufC
-
TBufC ist ein Pufferdeskriptor, der
eine Länge
enthält,
gefolgt vom Datenbereich. Daten können bei der Konstruktion oder
zu einem beliebigen anderen Zeitpunkt durch den Zuweisungsoperator
(Operator =) gesetzt werden. Bereits im Deskriptor befindliche Daten
sind konstant. TBufC ist schematisch in 3 dargestellt. Die Länge eines TBufC wird durch
eine Ganzzahlschablone definiert; so definiert beispielsweise TBufC<40> einen TbufC, der bis
zu 40 Datenelemente enthalten kann.
-
TBufC wird von TDesC abgeleitet,
der eine große
Zahl von Memberfunktionen bereitstellt, die auf seinem Inhalt wirken
können;
z. B. Suchen von Zeichen im Text oder Extrahieren von Datenabschnitten.
TBufC stellt die Memberfunktion Des() bereit, die einen modifizierbaren
Zeiger-Deskriptor (einen TPtr) zum Referenzieren des TBufC erzeugt.
So können
die TBufC Daten durch den TPtr geändert werden, wie schematisch
in 4 dargestellt ist.
Die Maximallänge
des TPt r ist der Wert des Ganzzahlschablonenparameters.
-
Pufferdeskriptor – TBuf<Tlnt S>
-
E3232.descriptors.buffer-descriptor.TBuf
-
TBuf ist ein modifizierbarer Pufferdeskriptor,
der Daten enthält,
die modifiziert werden können,
vorausgesetzt, dass die Daten die Maximallänge nicht überschreiten. TBuf ist schematisch
in 5 dargestellt. Die Höchstzahl
an Datenelementen, die sich im Datenbereich in TBuf befinden können, wird
durch die Mäximallänge definiert.
Die Länge
des Deskriptors zeigt an, wie viele Datenelemente derzeit im Datenbereich
enthalten sind. Wenn dieser Wert geringer ist als das Maximum, dann
ist ein Abschnitt des Datenbereichs unbenutzt. Die Maximallänge eines
TBuf wird durch eine Ganzzahlschablone definiert; so definiert beispielsweise
TBuf<40> einen TBuf, der bis
zu 40 Datenelemente (und nicht mehr!) enthalten kann. Ein TBuf ist
zur Aufnahme von Daten nützlich,
die manipuliert und geändert
werden sollen, aber deren Länge
ein bestimmtes Maximum nicht überschreitet;
z. B. Wordprocessor-Text. TBuf wird von TDes abgeleitet, der wiederum
von TDesC abgeleitet wird. Er erbt somit alle const Memberfunktionen,
die in TDesC definiert sind, plus die Memberfunktionen von TDes,
die die Daten manipulieren und ändern
können;
z. B. Anhängen
eines Zeichens an das Ende von existierendem Text.
-
Freispeicherdeskriptor – HBufC
-
E3232.descriptors.buffer-descriptor.HBufC
-
HBufC ist ein Deskriptor, der eine
Länge enthält, auf
die Daten folgen. Er wird auf dem Freispeicher mit statischen Memberfunktionen
New(), NewL() oder NewLC() zugeordnet. Die Länge des Deskriptors wird als
Parameter zu diesen statischen Funktionen geleitet. HBufC ist in 6 schematisch dargestellt.
Daten können
in den Deskriptor zum Konstruktionszeitpunkt oder zu einem beliebigen
anderen Zeitpunkt durch den Zuweisungsoperator (operator=) gesetzt
werden. Bereits im Deskriptor enthaltene Daten sind konstant. HBufC wird
von TDesC abgeleitet, der eine große Zahl von Memberfunktionen
bereitstellt, die auf seinem Inhalt wirken; z. B. Suchen von Zeichen
in Text oder Extrahieren von Datenabschnitten.
-
HBufC stellt die Memberfunktion Des()
bereit, die einen modifizierbaren Zeiger-Deskriptor (einen TPtr) zum Referenzieren
des HBufC erzeugt. So können
die HBufC Daten durch den TPt r geändert werden. Die Maximallänge des
TPt r ist die Länge
des HBufC Datenbereiches. 7 illustriert
dies schematisch.
-
Die Zuordnung von Freispeicherdeskriptoren
können
geändert
werden. Die Funktionen ReAlloc() oder ReAlloCL() lassen ein Vergrößern oder
Verkleinern des Datenbereichs des Freispeicherdeskriptors zu. Die Länge des
Datenbereiches darf jedoch nicht kleiner sein als die Länge der
bereits enthaltenen Daten. Vor dem Verkleinern des Datenbereichs
muss die Länge
der vom Deskriptor gespeicherten Daten reduziert werden.
-
Die Länge von Daten, die der Zuweisungsoperator
in den Freispeicherdeskriptor setzen kann, ist auf den Raum begrenzt,
der dem Datenbereich des Deskriptors zugeordnet wird. Der von Freispeicherdeskriptoren
eingenommene Speicherplatz muss explizit befreit werden, entweder
durch Aufrufen von User::Free() oder mittels des Schlüsselwortes
delete.
-
Die Beziehungen von Deskriptorklassen
-
E32.descriptors.classes
-
Alle Deskriptorklassen TPtrC, TPtr,
TBufC, TBuf und HBufC werden von den abstrakten Basisklassen TDesC
und TDes abgeleitet. Die Klasse TBufCBase ist zwar als abstrakte
Klasse markiert, soll aber lediglich die Implementierung vereinfachen. 8 illustriert die Beziehung
zwischen den Klassen schematisch.
-
Das Verhalten der konkreten Deskriptorklassen
ist sehr ähnlich,
und daher wird der größte Teil
der Funktionalität
von Deskriptoren durch die abstrakten Basisklassen bereitgestellt.
Da Deskriptoren weithin verwendet werden (besonders auf dem Stapel),
muss die Größe von Deskriptorobjekten
minimal gehalten werden. Um dabei zu helfen, werden keine virtuellen
Funktionen definiert, um das Overhead eines virtuellen Funktionstabellenzeigers
in jedem Deskriptorobjekt zu vermeiden. Die Folge ist, dass die
Basisklassen implizite Kenntnis der davon abgeleiteten Klassen haben.
E32 liefert zwei Varianten der Deskriptorklassen, eine zum Handhaben
von 8-Bit-(ASCII)-Text und binären
Daten, die andere zum Handhaben von 16-Bit-(UNICODE)-Text. Die 8-Bit-Varianten
der konkreten Klassen lauten: TPtrC8, TPtr8, TBufC8<TInt S>, TBuf8<TInt S> und HBufC8, während die
8-Bit-Varianten der abstrakten Klassen TDesC8, TDes8 lauten. Ebenso
heißen die
16-Bit-Varianten wie folgt: TPtrC16, TPtr16, TBufC16<TInt S>, TBuf16<TInt S>, HBufC16, TDesC16
bzw. TDes16. Die Unterscheidung ist für Deskriptoren transparent,
die Text repräsentieren
sollen. Durch Schreiben von Programmen, die die Klassen TPtrC, TPtr,
TBufC<TInt S>, TBuf<TInt S> und HBufC konstruieren
und verwenden, wird Kompatibilität
zwischen UNICODE und ASCII bewahrt. Die geeignete Variante wird
zur Aufbauzeit je nach dem ausgewäht, ob das Makro _UNICODE definiert
wurde oder nicht. Wenn das Makro _UNICODE definiert wurde, dann
wird die 16-Bit-Variante verwendet, ansonsten wird die 8-Bit-Variante
verwendet, wie in e32.descriptors.char-set erläutert ist.
-
Deskriptoren für binäre Daten müssen explizit die 8-Bit-Varianten
verwenden; mit anderen Worten, Code muss explizit TPtrC8, TPtr8,
TBufC8<TInt S>, TBuf8<TInt S> und HBufC8 Klassen
konstruieren.
-
Die explizite Verwendung der 16-Bit-Varianten
für binäre Daten
ist zwar möglich,
wird aber nicht empfohlen. Im Allgemeinen sind 8-Bit- und 16-Bit-Varianten
im Hinblick auf Aufbau und Implementation identisch; die Beschreibung
der Klassen selbst verwendet überall
die aufbauunabhängigen
Namen.
-
PS: Viele Memberfunktionen nehmen
Argumente, die entweder vom Typ TUint8* oder vom Typ TUint16* sind,
je nach dem, ob der Deskriptor die 8-Bit- oder die 16-Bit-Variante ist. Um
die Erläuterung
zu vereinfachen, werden diese Argumente in Funktionsprototypen wie
TUint??* geschrieben.
-
Verwenden von Deskriptoren
für Funktionsschnittstellen
-
e32.descriptors.using-function-interfaces
-
Viele Schnittstellen, die Textstrings
oder allgemeine binäre
Daten verwenden, benutzen Deskriptoren zum Vorgeben der Schnittstelle.
In der konventionellen 'C'-Programmierung wurden
Schnittstellen mit einer Kombination von char*, void* und Längenwerten
vorgegeben. In E32 werden immer Deskriptoren verwendet.
-
Es gibt vier Hauptfälle:
-
- – Leiten
eines konstanten Strings
In 'C':
StringRead(const char* astring);
wird die Länge des Strings durch den Null-Terminator
impliziert; somit erfordert die Funktion keine explizite Vorgabe
der Länge.
In
E32: Stri ngRead(const TDesC& aStri
ng);
enthält
der Deskriptor sowohl den String als auch seine Länge.
- – Leiten
eines Strings, der geändert
wurde. In 'C':StringWrite(char*
aString, int aMaxiength);
wird die Länge des passierten Strings
durch den Null-Terminator impliziert. aMaxLength gibt die Maximallänge an,
auf die der String erweitert werden kann.
In E32: StringWrirte(TDes& aString);
enthält der Deskriptor
den String, seine Länge
und die Maximallänge,
auf die der String verlängert
werden kann.
- – Leiten
eines Puffers, der allgemeine binäre Daten enthält:
In 'C':BufferRead(const void* aBuffer, int
alength);
müssen
sowohl die Adresse als auch die Länge des Puffers vorgegeben
werden. In E32: BufferRead(const TDes8& aBuffer);
enthält der Deskriptor
sowohl die Adresse als auch die Länge der Daten. Die 8-Bit-Variante wird
explizit vorgegeben; der Puffer wird als Byte-Daten unabhängig von
der Aufbauvariante behandelt.
- – Leiten
eines Puffers, der allgemeine binäre Daten enthält, die
geändert
werden können.
In 'C':
BufferWrite(void* aBuffer, int& aLength, int
aMaxiength);
werden die Adresse des Puffers, die aktuelle Länge der
Daten und die Maximallänge
des Puffers vorgegeben. Der aLength Parameter wird als Referenz
vorgegeben, um es zuzulassen, dass die Funktion die Länge der Daten
bei der Rückgabe
angibt.
In E32: BufferRead(TDes8& aBuffer);
enthält der Deskriptor
die Adresse, die Länge
der Daten und die Maximallänge.
Die 8-Bit-Variante wird explizit vorgegeben; der Puffer wird als
Byte-Daten behandelt, unabhängig
von der Aufbauvariante.
-
Falten und Mischen
-
e32.descriptors.folding-collating
-
Es gibt zwei Techniken, mit denen
die Zeichen in einem Deskriptor vor der Durchführung von Operationen am Text
modifiziert werden können:
-
-
Varianten von Memberfunktionen, die
falten oder mischen, werden nach Bedarf bereitgestellt.
-
Falten
-
e32.descriptors.folding
-
Falten bedeutet die Beseitigung von
Unterschieden zwischen Zeichen, die für die Zwecke eines unexakten
oder groß-/klein-insensitiven
Vergleichs als unwichtig sind. Falten ignoriert nicht nur Schreibweisendifferenzen,
sondern ignoriert auch Akzente auf einem Zeichen. Gemäß Konvention
wandelt Falten kleingeschriebene Zeichen in großgeschriebene Zeichen um und
beseitigt Akzente.
-
Mischen
-
e32.descriptors.collating
-
Mischen bedeutet die Beseitigung
von Unterschieden zwischen Zeichen, die für die Zwecke des Ordnens von
Zeichen in ihre Mischsequenz als unwichtig angesehen werden. Man
mischt beispielsweise zwei Strings, wenn sie in ordnungsgemäß sortierter
Reihenfolge geordnet werden sollen; dies muss keine strenge alphabetische
Reihenfolge sein.
-
Verwenden von Deskriptoren
-
e32.descriptors.usinq
-
Die folgende Reihe von Beispielen
zeigt, wie Deskriptoren verwendet werden können. Die Beispiele illustrierten
insbesondere:
-
- – die
Grundkonzepte der Zeigerdeskriptoren TPtrC und TPtr (siehe e32.descriptors.using.pointer-descriptors
- – die
Grundkonzepte der Pufferdeskriptoren TBufC und TBuf (siehe e32.descriptors.using.bufFer-descriptors)
- – wie
Deskriptoren allgemeine binäre
Daten repräsentieren
können
(siehe e32.descriptors.using.general-binary-data)
- – einige
der Memberfunktionen, die den Inhalt eines Deskriptors nicht modifizieren
(siehe e32.descriptors.using.non-modifyring-functions)
- – einige
der Memberfunktionen, die den Inhalt eines Deskriptors modifizieren
(siehe e32.descriptors.using.modifying-functions)
- – wie
Deskriptoren in Schnittstellen verwendet werden können (siehe
e32.descriptors.using.interface-specifers)
- – die
Grundkonzepte des Freispeicherdeskriptors HBufC (siehe e32.descriptors.using.heap-descriptors)
-
Zeigerdeskriptoren
-
e32.descriptors.using.pointer-descriptors
-
Die Codefragmente, die hier zum Illustrieren
von Zeigerdeskriptoren gezeigt werden, werden vom Probenquellcode
im Projekt eudesptr extrahiert. Den Code in diesem Projekt abarbeiten,
um die Zeigerdeskriptoren in Aktion zu sehen.
-
TPtrC
-
Die 8-Bit-Variante
-
Ein TPtrC dient zum Referenzieren
von konstanten Strings oder Daten; z. B. Zugreifen auf Text, der
in ROM-residenten Code eingebaut wurde, oder Übergeben einer Referenz auf
Daten in RAM, die durch diese Referenz nicht modifiziert werden
dürfen.
-
Z. B. Definieren eines konstanten 'C'-artigen ASCII-Strings:
-
Ein TPtrC8 Deskriptor kann so konstruiert
werden, dass er diesen vordefinierten Bereich repräsentiert, der
den String "Hello
World!" beinhaltet:
-
Der Deskriptor ist von den Daten
separat, die er repräsentiert.
-
Während
die Länge
des 'C'-Strings 12 ist,
ist seine Größe 13, um
den Null-Terminator aufzunehmen. Vom Standpunkt des Deskriptors
aus gesehen, sind Länge
und Größe der Daten
12. Der Deskriptor verwendet die Länge, um die Menge an repräsentierten
Daten zu bestimmen. Die Adresse des Datenbereiches des Deskriptors
gemäß Rückgabe durch:
ist
dieselbe wie die Adresse des ursprünglichen 'C'-Strings,
cstr8. Die 16-Bit-Variante (UNICODE)
-
Ebenso, Definieren eines 'C'-artigen Strings von breiten (oder UNICODE-)
Zeichen:
-
Ein TPtrC16-Deskriptor kann so konstruiert
werden, dass er diesen Bereich repräsentiert, der den String der
Doppel-Byte-Zeichen "Hello
World!" beinhaltet:
-
Auch hier ist der Deskriptor wieder
von den Daten separat, die er repräsentiert. Die Länge des
Deskriptors gemäß Rückgabe nach
einem Aufruf an ptrc16. Length() ist 12, da er 12 Textzeichen repräsentiert, aber
die Größe, die
nach einem Aufruf an ptrc16. Size() zurückgegeben wird, ist jetzt 24,
da jedes Zeichen 2 Bytes belegt.
-
Auch hier ist die Adresse des Datenbereichs
des Deskriptors gemäß Rückgabe durch:
dieselbe
wie die Adresse des ursprünglichen 'C'-Strings, cstr16.
-
Das Makro_S und aufbauunabhängige Namen
-
Das Makro _S dient zum Definieren
eines konstanten 'C'-artigen Strings
der geeigneten Breite. Die Variante TText wird zur Aufbauzeit definiert
(entweder als TText8 oder TText16), je nach dem, ob das Makro _UNICODE
definiert wurde. Z. B.:
-
Der TPtrC Deskriptor:
repräsentiert
die Daten, die den Text "Hello
World!" enthalten;
die Variante TPtrC wird zur Ausbauzeit definiert (entweder als TPtrC8
oder TPtrC16), je nach dem, ob das Makro _UNICODE definiert wurde.
-
Die Länge des Deskriptors, gemäß Rückgabe durch
ptrc. Length( ), ist 12 für
alle Aufbauvarianten, aber die Größe des Deskriptors gemäß Rückgabe durch
ptrc. Size() ist 12 für
einen ASCII-Aufbau und 24 für einen
UNICODE-Ausbau.
-
Siehe e32.macro. S.
-
Das Makro_L
-
Das Makro _L konstruiert einen TPtrC
der richtigen Variante und wird häufig als Quelldeskriptor beim Konstruieren
eines Pufferdeskriptors oder eines Freispeicherdeskriptors verwendet.
-
Das Makro ist auch nützlich zum
Konstruieren eines TPtrC, der als Parameter zu einer Funktion übergeben
werden soll. So erfordert beispielsweise die Memberfunktion Printf()
der Klasse RTest, die in diesen Beispielen verwendet wird, einen
Deskriptor als ersten Parameter. Hier konstruiert das Makro_L einen
TPtrC, der den konstanten statischen Bereich repräsentiert,
der von dem Compiler erzeugt wird, der den Text "\nThe _L macro constructs a TPtrC" enthält.
-
-
Siehe e32.macro. L.
-
TPtr
-
Ein TPtr ist ein modifizierbarer
Zeigerdeskriptor, durch den Daten modifiziert werden können, vorausgesetzt,
dass die Daten die maximale Länge
nicht überschreiten.
Die Maximallänge
wird vom Konstruktor festgelegt.
-
Z. B. Definieren eines TText Bereichs,
der so initialisiert ist, dass er den String "Haue a nice day" enthält:
-
Ein TPtr-Deskriptor kann so konstruiert
werden, dass er die Daten in diesem Bereich repräsentiert; ferner können diese
Daten geändert,
verkleinert und erweitert werden, vorausgesetzt, dass die Länge der
Daten das Maximum nicht überschreitet.
-
-
Der Deskriptor ptr repräsentiert
die Daten in str und wird so konstruiert, dass er eine aktuelle
Länge von
15 (die Länge
des Textes, ausschließlich
des Null-Terminators) und eine Maximallänge von 16 (die tatsächliche
Länge von
str) hat. Nach dem Konstruieren des Deskriptors wird der Null-Terminator
nicht mehr benötigt.
-
Die Daten können mit dem Zuweisungsoperator
vollständig
ersetzt werden:
-
Man beachte die Verwendung des Makros_L
zum Konstruieren eines TPtrC der richtigen Aufbauvariante als Quelle
der Zuweisung.
-
Die Länge von ptr ist jetzt 8, aber
die Höchstlänge bleibt
16. Die Größe hängt von
der Aufbauvariante ab. In einem ASCII-Aufbau ist dies 8, aber in
einem UNICODE-Aufbau wird dies 16 (zwei Bytes für jedes Zeichen).
-
Die Länge der repräsentierten
Daten kann verändert
werden. Z. B., hinter ptr. SetLength(2) repräsentiert der Deskriptor den
Text "Hi". Die Länge kann
sogar auf null gesetzt werden, so dass der Deskriptor hinter ptr.
Zero() keine Daten repräsentiert.
Die maximale Länge
bleibt jedoch 16, so dass:
-
die 16 Zeichen "Haue a nice day" in den Datenbereich des Deksriptors
setzt. Siehe auch e32. macro. L.
-
Pufferdeskriptoren
-
e32.descriptors.using.buffer-descriptors
-
Die hier zum Illustrieren der Verwendung
von Pufferdeskriptoren gezeigten Code-Fragmente werden vom Probenquellcode
im Projekt eudesbuf extrahiert. Den Code in diesem Projekt abarbeiten,
um die Pufferdeskriptoren in Aktion zu sehen.
-
TBufC
-
Ein TBufC ist ein Pufferdeskriptor,
bei dem der Datenbereich Teil des Deskriptors selbst ist.
-
Daten können in den Deskriptor zum
Konstruktionszeitpunkt oder zu einem beliebigen anderen Zeitpunkt
vom Zuweisungsoperator festgelegt werden. Bereits im Deskriptor enthaltene
Daten können
nicht modifiziert werden, aber können
vollständig
ersetzt werden (wieder mit dem Zuweisungsoperator).
-
Z. B. konstruiert
einen
TBufC, der bis zu 16 Datenelemente enthält. Während der Konstruktion wird
der Datenbereich des Deskriptors so festgelegt, dass er den Text "Hello World!" enthält, und
die Länge
des Deskriptors wird auf 12 eingestellt.
-
Die Daten im bufC2 können nicht
modifiziert werden, aber können
mit dem Zuweisungsoperator ersetzt werden:
-
Um jede Möglichkeit des Ersetzens der
Daten zu verhüten,
wird bufc2 als const deklariert.
-
Die Daten in einem TBufC können durch
Konstruieren eines TPtr vom TBufC mit der Memberfunktion Des() geändert werden;
die Daten können
dann durch den TPtr geändert
werden. Die maximale Länge
des TPtr ist der Wert des Schablonenparameters TrBufC. z. B.:
-
Dadurch wird das letzte Zeichen in
TBufC gelöscht,
und es wird das Zeichen " & Hi" hinzugefügt, so dass
der TBufC jetzt den Text "Hello
World & Hi" enthält, und
seine Länge
16 ist. Man beachte, dass die Länge von
TBufC und TPtr die geänderten
Daten reflektiert.
-
TBuf
-
Ein TBuf ist ein modifizierbarer
Pufferdeskriptor, bei dem der Datenbereich Teil des Deskriptors
selbst ist. Die Daten können
modifiziert werden, vorausgesetzt, dass die Daten die Maximallänge nicht überschreiten. Die
Maximallänge
wird vom Konstruktor festgelegt. Zum Beispiel konstruiert
einen
TBuf, der bis zu 16 Datenelemente beinhalten kann. Bei der Konstruktion
wird der Datenbereich des Deskriptors so eingestellt, dass er den
Text "Hello World!" enthält, die
Länge des
Deskriptors wird auf 12, seine Maximallänge auf 16 gesetzt.
-
Die Daten können direkt modifiziert werden:
ändert die
Daten von buf auf "Hello
World!@", seine
Länge auf
13, während:
seine
Länge auf
3, seine Daten auf "Hel" ändert.
-
Die maximale Länge des Deskriptors bleibt
immer 16.
-
Wie bei einem TBufC Deskriptor, können die
in einem TBuf enthaltenen Daten vollständig mit dem Zuweisungsoperator
ersetzt werden:
ersetzt "Hello World" durch "Ersatztext" und ändert die
Länge des
Deskriptors auf 16.
-
Ein Versuch, die Länge der
Daten über
die Maximallänge
hinaus zu erhöhen,
erzeugt einen Ausnahmezustand (eine Panik). Z. B. erzeugt:
eine Panik zur Laufzeit,
weil die Länge
des Ersatztexts (30) größer ist
als das Maximum (16).
-
Allgemeine binäre Daten
-
e32.descriptors.using-general-binary-data
-
Die hier gezeigten Code-Fragmente,
die illustrieren, wie Deskriptoren allgemeine binäre Daten
handhaben können,
werden vom Probenquellcode im Projekt eudesbin extrahiert. Den Code
in diesem Projekt abarbeiten, um die Probe in Aktion zu sehen.
-
Die Art der durch Deskriptoren repräsentierten
oder enthaltenen Daten ist nicht auf Text beschränkt. Deskriptoren können auch
allgemeine binäre
Daten handhaben.
-
Zum Arbeiten mit allgemeinen binären Daten
muss immer ein 8-Bit-Variantendeskriptor explizit konstruiert werden.
Binäre
Daten müssen
immer, unabhängig
vom Aufbau, als 8-Bit-Daten
behandelt werden.
-
Zum Beispiel: Einrichten eines Bereichs
im Speicher, der mit binären
Daten initialisiert ist:
-
Konstruieren eines modifizierbaren
Pufferdeskriptors mit dem Vorgabekonstruktor:
-
Der folgende aus dem Projekt eudesbin
extrahierte Code setzt die binären
Daten in den Deskriptor, hängt
eine Reihe von einzelnen Bitwerten an und zeigt die Daten dann am
Prüfdisplay
an. Die Länge
des Puffers ist 9, die Maximallänge
32 und die Größe 9, unabhängig vom
Aufbau.
-
-
Text und allgemeine binäre Daten
können
frei gemischt werden, so dass:
akzeptabel ist.
-
Nichtmodifizierende Funktionen
-
e32.descriptors.using.non-modifying-functions
-
Die hier gezeigten Code-Fragmente,
die einen Teil der nichtmodifizierenden Deskriptor-Memberfunktionen
illustrieren, werden vom Probenquellcode im eudesc Projekt extrahiert.
Man betrachte den Code in diesem Projekt, um den vollen Beispielsatz
zu sehen. Alle diese Beispiele verwenden einen TBufC Deskriptor,
der so konstruiert wurde, dass er den Text "Hello World!" enthält. Man beachte auch, dass
der Deskriptor als const deklariert wird, so dass seine Daten nicht
mit dem Zuweisungsoperator ersetzt werden können:
-
Right() & Mid()
-
Diese Funktionen konstruieren einen
TPtrC so, dass er einen Abschnitt der Daten des bufc repräsentiert:
ptrc1
repräsentiert
die rechten 5 Datenelemente in bufc. Die Daten von ptrc1 sind "orld!", seine Länge ist
5 und die Adresse seines Datenbereiches ist die Adresse des Datenbereichs
bufc plus 7. Die Memberfunktion Left() funktioniert auf ähnliche
Weise.
ptrc2
repräsentiert
die 6 Datenelemente, um 3 vom Beginn des Datenbereichs bufc versetzt.
Die Daten von ptrc2 sind "lo
Wor", seine Länge ist
6, und die Adresse seines Datenbereiches ist die Adresse des Datenbereiches
bufc plus 3. In der Praxis ist es möglicherweise nicht notwendig,
den zurückgegebenen
TPtrC einem anderen TPt rC zuzuweisen. So setzt beispielsweise der
nachfolgende Code einen Wert von 3 in pos; dies ist der Versatz
von Zeichen 'W' innerhalb der Zeichen "lo Wor" (ein explizites
Beispiel für
Locate() folgt).
-
-
In diesen Funktionen kann Panik auftreten.
So verursacht beispielsweise die Anforderung von 13 rechten Datenelementen
in bufc einen Ausnahmezustand (es gibt nur 12):
-
Compare() & CompareF()
-
Die Vergleichsfunktionen können zum
Vergleichen des Inhalts von zwei Deskriptoren verwendet werden.
Jede Art von Daten kann verglichen werden. Für binäre Daten Compare() verwenden.
Für Text
Compare(), CompareF() oder CompareC() verwenden.
-
Das folgende Beispiel vergleicht
den Inhalt von bufc mit dem Inhalt einer Reihe von Deskriptoren
und zeigt die Ergebnisse am Prüfdisplay
an:
-
Groß-/Kleinschreibung von Text
ist mit Compare() wichtig; der vierte Vergleich ist gleich, aber
der fünfte
Vergleich nicht (die Zeichen 'w' haben eine andere
Schreibweise). Bei CompareF() ist Groß-/Kleinschreibung nicht wichtig;
sowohl der vierte als auch der fünfte
Vergleich bringen das gleiche Ergebnis.
-
Locate(), LocateF() & LocateReverse()
-
Mit Hilfe der Suchfunktionen kann
die Position (Versatz) eines Zeichens im Text oder ein spezifischer Wert
innerhalb allgemeiner binärer
Daten gefunden werden.
-
Das folgende Beispiel versucht, die
Positionen (d. h. die Versätze)
der Zeichen 'H', '!', 'o' und 'w' im Text "Hello World!" zu finden, und zeigt das Ergebnis am
Prüfdisplay
an:
-
Das Zeichen 'w' wird
mit Locate() nicht gefunden, aber kann mit LocateF() gefunden werden.
Der Grund ist, dass Locate() für
groß-/klein-sensitiv
ist, während
LocateF() [sic].
-
Dieses Beispiel verwendet LoCateReverse(),
um die Position eines Zeichens zu finden, das am Ende des Datenbereichs
des Deskriptors beginnt:
-
Man beachte, dass das 2. Zeichen 'o' im String "Hello World! " dieses Mal gefunden wurde.
-
Match() & MatchF()
-
Das folgende Beispiel zeigt die Verwendung
der Memberfunktionen Match() und MatchF(). Das Ergebnis von Vergleichen
zwischen dem Inhalt von buf und einer Reihe von Deskriptoren mit
variierenden Kombinationen von Vergleichsstrings wird am Prüfdisplay
angezeigt.
-
-
-
Man beachte, dass bei Verwendung
von MatchF() das Ergebnis anders ist als beim 6. String, wo die Schreibweise
ignoriert wird.
-
Modifizierfunktionen
-
e32.descriptors.using.modifying-functions
-
Die hier gezeigten Code-Fragmente,
die einige der Modifizierdeskriptor-Memberfunktionen illustrieren, werden
aus dem Probenquellcode im Projekt eudes. extrahiert. Wir betrachten
den Code in diesem Projekt, um den vollen Beispielsatz zu sehen.
-
Alle diese Beispiele verwenden einen
TBuf Deskriptor, der so konstruiert ist, dass er den Text "Hello World!". enthält:
-
Swap()
-
Inhalt, Länge und Größe von altbuf1 und buf wurden
vertauscht; die maximalen Längen
der Deskriptoren verändern
sich NICHT.
-
-
Repeat()
-
Die aktuelle Länge von buf ist auf 16 eingestellt.
Eine Wiederholung des Kopierens der Zeichen "Hello" erzeugt die Textfolge "HelloHelloHelloH" in buf.
-
-
Einstellen der Länge von buf auf [sic] und Wiederholen
der Wiederholung erzeugt die Textfolge "HelloHel".
-
Justify()
-
Das Beispiel verwendet src als Quelldeskriptor.
-
-
Der Deskriptor src hat eine Länge von
12.
-
Das Zielfeld in buf hat eine Breite
von 16 (dies ist größer als
die Länge
des Deskriptors src). src wird in das Zielfeld kopiert, links ausgerichtet
und mit '@' Zeichen aufgefüllt. Die
Länge von
buf wird gleich der vorgegebenen Breite, d. h. 16.
-
-
Das Zielfeld in buf hat eine Breite
von 16 (dies ist größer als
die Länge
des Deskriptors src). s rc wird in das Zielfeld kopiert, mittig
ausgerichtet und mit '@' Zeichen aufgefüllt. Die
Länge von
buf wird gleich der vorgegebenen Breite, d. h. 16.
-
-
Das Zielfeld in buf hat eine Breite
von 10 (dies ist kleiner als die Länge des Deskriptors src). src
wird in das Zielfeld kopiert, aber auf 10 Zeichen verkürzt, und
daher werden keine Ausricht- und Auffüllinformationen verwendet.
Die Länge
von buf wird gleich der Breite, d. h. 10.
-
-
Das Zielfeld in buf wird auf die
Länge des
Deskriptors src eingestellt (was immer das gerade ist). src wird
in das Zielfeld kopiert. Es wird weder Auffüllen noch Kürzen benötigt, daher werden die Ausricht-
und Auffüllinformationen
nicht verwendet. Die Länge
von buf wird wie die Länge
von src, d. h. 12.
-
Deskriptoren als Schnittstellenspezifizierer
-
e32.descriptors.using.interface-specifiers
-
Beispiele, die die Verwendung von
Deskriptoren in Funktionsschnittstellen illustrieren, befinden sich im
Projekt eudesint.
-
Freispeicherdeskriptoren
-
e32.descriptors.usinp.heap-descriptors
-
Die hier gezeigten Code-Fragmente,
die die Verwendung von Freispeicherdeskriptoren illustrieren, wurden
aus dem Probenquellcode im Projekt eudeshbc extrahiert. Wir betrachten
den Code in diesem Projekt, um die Probe in Aktion zu sehen.
-
Ein HBufC wird immer am Freispeicher
mit den statischen Memberfunktionen New(), NewL() oder NewLC() konstruiert.
Zum Beispiel:
-
Dadurch wird ein HBufC konstruiert,
der bis zu 15 Datenelemente beinhalten kann. Die Ist-Länge ist null.
-
Existierende Daten in einem HBufC
können
zwar nicht modifiziert werden, aber diese Daten können mit
dem Zuweisungsoperator ersetzt werden. Zum Beispiel:
-
Damit mehr als 15 Zeichen oder Datenelemente
in den HBufC zugewiesen werden können,
muss die Zuordnung zuerst geändert
werden. Zum Beispiel:
-
So kann die folgende Zuweisung erfolgen,
ohne eine Panik zu erzeugen:
buf
kann nach einer Neuzuordnung auf eine andere Stelle im Freispeicher
zeigen oder auch nicht. Die Stelle des neu zugeordneten Deskriptors
ist von der Freispeicherfragmentierung und von der Größe der neuen
Zelle abhängig.
-
Die Funktion Des() gibt einen TPtr
zum HBufC zurück.
Die Daten im HBufC können
durch den TPtr modifiziert werden. Die maximale Länge des
TPtr wird anhand der Größe der dem
Datenbereich des HbufC zugeordneten Zelle bestimmt. Zum Beispiel:
-
Dies ändert die Daten im HBufC und
die Länge
des HBufC.
-
Klasse TPtrC Konstanter
Zeigerdeskriptor
-
Übersicht
-
-
Einen TPtrC Deskriptor erstellen,
um auf eine vorexistierende Stelle in ROM oder RAM zuzugreifen, wo
auf die Daten an dieser Stelle zugegriffen werden muss, sie aber
nicht verändert
werden (oder wo die Daten nicht verändert werden können).
-
Eine übliche Verwendung für einen
TPtrC ist ein Zugriff auf einen String von Text in einem Code-Segment.
Dies wird gewöhnlich
mit dem Makro_L konstruiert, das einen TPt rC Deskriptor für entweder
einen ASCII- oder einen UNICODE-Aufbau konstruiert. Häufig erscheint
ein TPtrC als die rechte Seite eines Ausdrucks oder als Initialisierungswert
für einen
anderen Deskriptor, wie z. B.:
-
Das Makro_L expandiert auf einen
TPtrC, der entweder als TPtrC8 oder TPtrC16 definiert ist, je nach der
Aufbauvariante (TBuf wird auf ähnliche
Weise definiert).
-
Die 8-Bit-Variante TPtrC8 kann zum
Zugreifen auf binäre
Daten konstruiert werden. Die 8-Bit-Variante wird immer explizit
für binäre Daten
verwendet.
-
Es stehen fünf Konstruktoren zum Aufbauen
eines TPtrC zur Verfügung,
darunter ein Vorgabekonstruktor. Ein TPtrC kann nach der Konstruktion
mit Hilfe der set() Funktionen (re-)initialisiert werden.
-
Alle unter der TDesC Klasse beschriebenen
Memberfunktionen stehen für
die Verwendung durch einen TPtrC Deskriptor zur Verfügung. Zusammenfassend
sind dies:
-
Konstruktion
-
e32.descriptors.TPtrC.construction
-
-
Beschreibung
-
Der C++ Vorgabekonstruktor dient
zum Konstruieren eines konstanten Zeigerdeskriptors. Die Länge des
konstruierten Deskriptors wird auf null gesetzt, sein Zeiger wird
auf NULL gesetzt.
-
Hinweise
-
Mit Hilfe der Memberfunktion Set
() den Zeigerdeskriptor initialisieren.
-
-
Beschreibung
-
Der C++ Kopierkonstruktor konstruiert
ein neues TPtrC Objekt von dem existierenden. Die Länge des konstruierten
Deskriptors wird auf die Länge
von aDes gesetzt und so eingestellt, dass er auf die Daten von aDes
zeigt.
-
-
Beschreibung
-
Der C++ Konstruktor dient zum Konstruieren
des TPtrC mit einem beliebigen Deskriptortyp.
-
Die Länge des konstruierten Deskriptors
wird auf die Länge
von aDes gesetzt und so eingestellt, dass er auf die Daten von aDes
zeigt.
-
-
Beschreibung
-
Der C++ Konstruktor dient zum Konstruieren
des TPtrC Objektes mit einem null-terminierten String.
-
Die Länge des Deskriptors wird auf
die Länge
des null-terminierten Strings, ausschließlich Null-Terminator, gesetzt.
-
Der konstruierte Deskriptor wird
so eingestellt, dass er auf die Stelle des Strings zeigt, ob in
RAM oder in ROM.
-
-
Beschreibung
-
Der C++ Konstruktor dient zum Konstruieren
des TPtrC mit der Speicheradresse und – länge.
-
Die Länge des konstruierten Deskriptors
wird auf den Wert von aLength gesetzt.
-
Der konstruierte Deskriptor wird
so eingestellt, dass er auf die in aBuf gelieferte Speicheradresse
zeigt; die Adresse kann auf RAM oder ROM verweisen.
-
-
Späte Initialisierung
-
e32.descriptors.TPtrC.late-initialisation
-
-
Beschreibung
-
Diese Funktion dient zum Initialisieren
(oder Reinitialisieren) eines konstanten Zeigerdeskriptors mit dem
Inhalt eines beliebigen Deskriptortyps.
-
Die Länge dieses konstanten Zeigerdeskriptors
wird auf die Länge
von aDes gesetzt. Dieser Deskriptor wird so gesetzt (oder zurückgesetzt),
dass er auf die Daten von aDes zeigt.
-
-
Hinweise
-
Die Funktion Set() kann zum Initialisieren
eines konstanten Zeigerdeskriptors verwendet werden, der mit dem
Vorgabekonstruktor konstruiert wird.
-
Wenn aDes eine Referenz auf einen
Freispeicherdeskriptor (HBufC) ist, dann befinden sich die Daten auch
auf dem Freispeicher.
-
-
Diese Funktion dient zum Initialisieren
(oder Reinitialisieren) eines konstanten Zeigerdeskriptors mit der
gelieferten Speicheradresse und -länge.
-
Die Länge dieses konstanten Zeigerdeskriptors
wird auf die Länge
von aLength gesetzt. Der Deskriptor wird so eingestellt, dass er
auf die in aBuf gegebene Speicheradresse zeigt;
die Adresse
kann auf RAM oder ROM verweisen.
-
-
Hinweise
-
Die Funktion Set() kann zum Initialisieren
eines konstanten Zeigerdeskriptors verwendet werden, der mit dem
Vorgabekonstruktor konstruiert wird.
-
-
Beschreibung
-
Erzeugen eines TPt r Deskriptors
zum Zugreifen auf einen vorexistierenden Bereich oder Puffer in RAM,
wo auf den Inhalt dieses Puffers zugegriffen werden und dieser manipuliert
werden soll.
-
Eine übliche Verwendung für einen
TPtr ist der Zugriff auf den Puffer eines existierenden TBufC oder einen
HBufC Deskriptor mit den Des( ) Memberfunktionen (von TBufC und
HBufC). Zum Beispiel:
-
Ein TPtr wird entweder als TPtr8
oder TPtr16 definiert, je nach Aufbauvariante, und kann zum Zugreifen
auf Text verwendet werden.
-
Die 8-Bit-Variante, TPtr8, kann zum
Zugreifen auf binäre
Daten konstruiert werden. Die 8-Bit-Variante wird immer explizit
für binäre Daten
verwendet.
-
Zwei Konstruktoren stehen zum Ausbauen
eines TPtr zur Verfügung,
darunter ein Vorgabekonstruktor. Ein TPtr kann nach der Konstruktion
mit den set() Funktionen (re-)initialisiert werden.
-
Alle unter den Klassen TDesC und
TDes beschriebenen Memberfunktionen stehen für die Verwendung durch einen
TPtr Deskriptor zur Verfügung.
Zusammenfassend sind dies:
-
Konstruktion
-
e32.descriptors.TPtr.construction
-
-
Beschreibung
-
Der C++ Konstruktor dient zum Konstruieren
des TPtr mit Adresse und Maximallänge. Die Länge des konstruierten Deskriptors
wird auf null, seine Maximallänge
auf aMaxiength gesetzt.
-
Der konstruierte Deskriptor wird
so eingestellt, dass er auf die in aBuf gegebene Speicheradresse zeigt,
die entweder auf RAM oder ROM verweisen kann.
-
-
-
Beschreibung
-
Der C++ Konstruktor dient zum Konstruieren
des TPtr mit Adresse, Länge
und Maximallänge.
-
Dient zum Konstruieren eines modifizierbaren
Zeigerdeskriptors mit der gegebenen Speicheradresse, Länge und
Maximallänge
zum Initialisieren.
-
Die Länge des konstruierten Deskriptors
wird auf aLength, seine Maximallänge
auf aMaxLength gesetzt.
-
Der konstruierte Deskriptor wird
so eingestellt, dass er auf die in aBuf gegebene Speicheradresse zeigt,
die entweder auf RAM oder ROM verweisen kann.
-
-
Späte Initialisierung
-
e32.descriptors.TPtr.late-initialisation
-
-
Diese Funktion dient zum Initialisieren
(oder Reinitialisieren) eines modifizierbaren Zeigerdeskriptors mit
dem Inhalt eines anderen modifizierbaren Zeigerdeskriptors. Die
Funktion verhält
sich wie ein Kopierkonstruktor.
-
Die Länge des Deskriptors wird auf
die Länge
von aPtr, seine Maximallänge
auf die Maximallänge
von aPtr gesetzt.
-
Der Deskriptor wird so gesetzt (oder
zurückgesetzt),
dass er auf Daten von aPtr zeigt.
-
-
Diese Funktion dient zum Initialisieren
(oder Reinitialisieren) eines modifizierbaren Zeigerdeskriptors mit
der gegegenen Speicheradresse, Länge
und Maximallänge.
-
Die Länge des resultierenden Deskriptors
wird auf den Wert von aLength, seine Maximallänge auf den Wert von aMaxLength
gesetzt.
-
Der Deskriptor wird so gesetzt (oder
zurückgesetzt),
dass er auf die in aBUu gelieferte Speicheradresse zeigt; die Adresse
kann auf RAM oder ROM verweisen.
-
-
-
Zuweisungsoperatoren
-
-
Beschreibung
-
Dieser Zuweisungsoperator kopiert
einen modifizierbaren Zeigerdeskriptor auf diesen modifizierbaren Zeigerdeskriptor.
-
Die Daten von aDes werden in den
Datenbereich dieses Deskriptors kopiert und ersetzen den existierenden
Inhalt. Die Länge
dieses Deskriptors wird auf die Länge von aDes gesetzt.
-
-
Hinweise
-
Die Länge von aDes darf nicht größer sein
als die Maximallänge
dieses Deskriptors, da sonst in der Operation Panik mit ETDes8Overflow
für die
8-Bit-Variante oder mit ETDes16Overflow für die 16-Bit-Variante auftritt.
-
-
Beschreibung
-
Dieser Zuweisungsoperator kopiert
den Inhalt eines beliebigen Deskriptortyps, aDes, auf diesen modifizierbaren
Zeigerdeskriptor.
-
Die Daten von dDes werden in den
Datenbereich dieses Deskriptors kopiert und ersetzen den existierenden
Inhalt. Die Länge
dieses Deskriptors wird auf die Länge von aDes gesetzt.
-
-
Hinweise
-
Die Länge von aDes darf nicht größer sein
als die Maximallänge
dieses Deskriptors, sonst tritt in der Operation Panik mit ETDes8Overflow
für die
8-Bit-Variante oder ETDes160verflow für die 16-Bit-Variante auf.
-
-
Beschreibung
-
Dieser Zuweisungsoperator kopiert
einen null-terminierten String, ausschließlich des Null-Terminators, in diesen
modifizierbaren Zeigerdeskriptor.
-
Der kopierte String ersetzt den existierenden
Inhalt dieses Deskriptors.
-
Die Länge dieses Deskriptors wird
auf die Länge
des Strings gesetzt (ausschließlich
des Null-Terminators).
-
-
Hinweise
-
Die Länge des Strings, auschließlich des
Null-Terminators, darf nicht größer sein
als die Maximallänge dieses
Deskriptors, da sonst in der Operation Panik mit ETDes80verflow
für die
8-Bit-Variante oder ETDes160verflow für die 16-Bit-Variante auftritt.
-
Klasse TBufC<Tlnt S> Konstanter Pufferdeskriptor Übersicht
-
Beschreibung
-
Erzeugen eines TBufC Deskriptors,
um einen Puffer von fester Länge
zum Speichern der konstanten Daten und zum Zugreifen auf diese bereitzustellen.
-
Die in einem TBufC Deskriptor befindlichen
Daten können
nicht modifiziert werden, aber sie können ersetzt werden.
-
Es stehen vier Konstruktoren zur
Verfügung,
um einen TBufC Deskriptor aufzubauen, darunter ein Vorgabekonstruktor.
Der Inhalt des TBufC Deskriptors kann nach der Konstruktion mit
den Zuweisungsoperatoren ersetzt werden.
-
Zum Beispiel, zum Erzeugen eines
Puffers mit Länge
16, der die Zeichen "ABC" enthalten soll:
-
Der Inhalt kann nicht modifiziert,
aber ersetzt werden, z. B:
-
Zum Erzeugen eines Puffers, der allgemeine
binäre
Daten enthalten soll, die 8-Bit-Variante von TbufC explizit konstruieren;
z. B. zum Erzeugen eines 256-Byte-Puffers:
-
Alle unter der Klasse TDesC beschriebenen
Memberfunktionen stehen für
die Verwendung durch einen TBufC Deskriptor zur Verfügung. Zusammenfassend
sind dies:
-
Konstruktion
-
e32.descriptors.TBufC.construction
-
-
Beschreibung
-
Der C++ Vorgabekonstruktor dient
zum Konstruieren eines nichtmodifizierbaren Pufferdeskriptors.
-
Der Ganzzahlschablonenparameter <TInt S> wird vom Compiler
zum Berechnen der Größe des Datenbereichs
verwendet, der als Teil des Deskriptorobjekts erzeugt werden soll.
Die Länge
des konstruierten Deskriptors wird auf null gesetzt.
-
Hinweise
-
-
Beschreibung
-
Der C++ Kopierkonstruktor konstruiert
ein neues TBufC<S> Objekt von dem existierenden.
-
Der Ganzzahlschablonenparameter <TInt S> wird vom Compiler
zum Berechnen der Größe des Datenbereiches
verwendet, der als Teil des konstruierten Deskriptors erzeugt werden
soll.
-
Die Daten von aLcb werden in den
Datenbereich des konstruierten Deskriptors kopiert. Die Länge des konstruierten
Deskriptors wird auf die Länge
von aLcb gesetzt.
-
-
Beschreibung
-
Der C++ Konstruktor wird zum Konstruieren
des TBufC<S> mit einem beliebigen
Deskriptortyp verwendet.
-
Der Ganzzahlschablonenparameter <TInt S> wird vom Compiler
zum Berechnen der Größe des Datenbereichs
verwendet, der als Teil des konstruierten Deskriptors erzeugt werden
soll.
-
Die Daten des aDes werden in den
Datenbereich des konstruierten Deksriptors kopiert. Die Länge des konstruierten
Deskriptors wird auf die Länge
von aDes gesetzt.
-
-
Hinweise
-
Die Länge von aDes darf nicht größer sein
als der Wert des Ganzzahlschablonenparameters <TInt S>, da sonst im Konstruktor Panik mit ETDes8LengthOutOfRange
für die
8-Bit-Variante oder mit ETDes16LengthOutOfRange für die 16-Bit-Variante
auftritt.
-
-
Beschreibung
-
Der C++ Konstruktor dient zum Konstruieren
des TBufC<S> mit einem null-terminierten
String.
-
Der Ganzzahlschablonenparameter <TInt S> wird vom Compiler
zum Berechnen der Größe des Datenbereiches
verwendet, der als Teil des konstruierten Deskriptorobjektes erzeugt
werden soll.
-
Der String, ausschließlich des
Null-Terminators, wird in den Datenbereich des konstruierten Deskriptors
kopiert.
-
Die Länge des konstruierten Deskriptors
wird auf die Länge
des Strings eingesetzt, ausschließlich des Null-Terminators.
-
-
Hinweise
-
Die Länge des Strings, ausschließlich des
Null-Terminators, darf nicht größer sein
als der Wert des Ganzzahlschablonenparameters <TInt S>, da sonst im Konstruktor Panik mit ETDes8LengthOutOfRange
für die
8-Bit-Variante oder mit ETDes16LengthOutOfRange für die 16-Bit-Variante
auftritt.
-
Erzeugen eines modifizierbaren
Zeigerdeskriptors
-
e32.descriptors.TBufC.create-TPtr
-
-
Beschreibung
-
Diese Funktion dient zum Konstruieren
und Zurückgeben
eines modifizierbaren Zeigerdeskriptors zum Repräsentieren dieses Deskriptors.
-
Der Inhalt eines nichtmodifizierbaren
Pufferdeskriptors kann nicht geändert
werden, sondern eine Erzeugung eines modifizierbaren Zeigerdeskriptors
ergibt einen Mechanismus zum Modifizieren dieser Daten.
-
Die Länge des neuen TPtr wird auf
die Länge
dieses Deskriptors gesetzt.
-
Die Maximallänge des neuen TPtr wird auf
den Wert des Ganzzahlschablonenparameters <TInt S> gesetzt.
-
Der neue TPtr wird so eingestellt,
dass er auf diesen Deskriptor zeigt. Die Daten dieses Deskriptors werden
weder kopiert noch umgestellt.
-
Die Daten dieses Deskriptors können durch
den neu konstruierten TPt r modifiziert werden. Wenn die Länge der
Daten geändert
wurde, dann wird die Länge
dieses Deskriptors und des TPtr dementsprechend verändert.
-
Rückgabewert
-
TPtr Ein modifizierbarer Zeigerdeskriptor,
der diesen nichtmodifizierbaren Pufferdeskriptor repräsentiert.
-
Zuweisungsoperatoren
-
e32.descriptors.TBufC.assignment-operators
-
Siehe auch e32.descriptors.TDes.assignment-operators.
-
-
Beschreibung
-
Dieser Zuweisungsoperator kopiert
den Inhalt des nichtmodifizierbaren Pufferdeskriptors aLcb in diesen
nicht modifizierbaren Pufferdeskriptor.
-
Die Daten von aLcb werden in den
Datenbereich dieses Deskriptors kopiert und ersetzen den existierenden
Inhalt. Die Länge
dieses Deskriptors wird auf die Länge von aLcb gesetzt.
-
-
Dieser Zuweisungsoperator kopiert
den Inhalt eines beliebigen Deskriptortyps aDes in diesen nichtmodifizierbaren
Pufferdeskriptor.
-
Die Daten von aDes werden in den
Datenbereich dieses Deskriptors kopiert und ersetzen den existierenden
Inhalt. Die Länge
dieses Deskriptors wird auf die Länge von aDes gesetzt.
-
-
Hinweise
-
Die Länge von aDes darf nicht größer sein
als der Wert des Ganzzahlschablonenparameters <TInt S>, da sonst in der Operation Panik mit
ETDes80verflow für
die 8-Bit-Variante oder ETDes160verflow für die 16-Bit-Variante auftritt.
-
-
Beschreibung
-
Dieser Zuweisungsoperator kopiert
einen null-terminierten String, ausschließlich des Null-Terminators, in diesen
nichtmodifizierbaren Pufferdeskriptor.
-
Der kopierte String ersetzt den existierenden
Inhalt dieses Deskriptors. Die Länge
dieses Deskriptors wird auf die Länge des Strings gesetzt, ausschließlich des
Null-Terminators.
-
-
Hinweise
-
Die Länge des Strings, ausschließlich des
Null-Terminators, darf nicht größer sein
als der Wert des Schablonenparameters <TInt S>, da sonst in der Operation Panik mit
ETDes80verflow für
die 8-Bit-Variante oder ETDes160verflow für die 16-Bit-Variante auftritt.
-
Klasse TBuf<Tlnt S> Modifizierbarer Pufferdeskriptor
-
Übersicht
-
-
Ein modifizierbarer Pufferdeskriptor.
-
-
Beschreibung
-
Erzeugen eines TBuf Deskriptors zum
Bereitstellen eines Puffers fester Länge zum Aufnehmen von, Zugreifen
auf und Manipulieren von Daten.
-
Es stehen fünf Konstruktoren zum Aufbauen
eines TBuf Deskriptors zur Verfügung,
darunter ein Vorgabekonstruktor. Der Inhalt eines TBuf Deskriptors
kann nach der Konstruktion mit den Zuweisungsoperatoren ersetzt
werden.
-
Zum Beispiel, zum Erzeugen eines
Puffers mit Länge
8, der ursprünglich
zum Aufnehmen der Zeichen "ABC" eingestellt wurde:
-
Der Inhalt des Pufferdeskriptors
kann ersetzt werden, vorausgesetzt, die Länge der neuen Daten überschreitet
den Wert des Ganzzahlschablonenparameters nicht, z. B.:
-
Zum Erzeugen eines Puffers, der allgemeine
binäre
Daten aufnehmen soll, die 8-Bit-Variante
TBuf8 explizit konstruieren; Beispiel: zum Erzeugen eines 256-Byte-Puffers:
-
Alle unter den Klassen TDesC und
TDes beschriebenen Memberfunktionen stehen für die Verwendung durch einen
TBuf Deskriptor zur Verfügung.
Zusammenfassend sind dies:
-
Konstruktion
-
e32.descriptors.TBuf.construction
-
-
Beschreibung
-
Der C++ Vorgabekonstruktor dient
zum Konstruieren eines modifizierbaren Pufferdeskriptors.
-
Der Ganzzahlschablonenparameter <TInt S> wird vom Compiler
zum Berechnen der Größe des Datenbereichs
verwendet, der als Teil des konstruierten Deskriptors erzeugt werden
soll.
-
Die Länge des konstruierten Deskriptors
wird auf null gesetzt, die Maximallänge wird auf den Wert des Ganzzahlschablonenparameters <TInt S> gesetzt.
-
-
Beschreibung
-
Der C++ Konstruktor dient zum Konstruieren
des TBuf<S> mit der Länge.
-
Der Ganzzahlschablonenparameter <TInt S> wird vom Compiler
zum Berechnen der Größe des Datenbereichs
benutzt, der als Teil des konstruierten Deskriptors erzeugt werden
soll.
-
Die Länge des konstruierten Deskriptors
wird auf aLength, die Maximallänge
auf den Wert des Ganzzahlschablonenparameters <TInt S> gesetzt.
-
-
-
Beschreibung
-
Der C++ Kopierkonstruktor konstruiert
ein neues TBuf<S> Objekt von dem existierenden.
Der Ganzzahlschablonenparameter <TInt
S> wird vom Compiler
zum Berechnen der Größe des Datenbereiches
verwendet, der als Teil des konstruierten Deskriptorobjektes erzeugt
werden soll.
-
Die Daten von aBuf werden in den
Datenbereich des konstruierten Deskriptors kopiert. Die Länge des konstruierten
Deskriptors wird auf die Länge
von aBuf, die Maximallänge
auf den Wert des Ganzzahlschablonenparameters <TInt S> gesetzt.
-
-
Beschreibung
-
Der C++ Konstruktor dient zum Konstruieren
des TBuf<S> mit einem beliebigen
Deskriptortyp.
-
Der Ganzzahlschablonenparameter <TInt S> wird vom Compiler
zum Berechnen der Größe des Datenbereichs
verwendet, der als Teil des konstruierten Deskriptors erzeugt werden
soll.
-
Die Daten von aDes werden in den
Datenbereich des konstruierten Deskriptors kopiert.
-
Die Länge des konstruierten Deskriptors
wird auf die Länge
von aDes, die Maximallänge
auf den Wert des Ganzzahlschablonenparameters <TInt S> gesetzt.
-
-
Beschreibung
-
Der C++ Konstruktor dient zum Konstruieren
des TBuf<S> mit einem null-terminierten
String.
-
Der Ganzzahlschablonenparameter <TInt S> wird vom Compiler
zum Berechnen der Größe des Datenbereiches
verwendet, der als Teil des konstruierten Deskriptors verwendet
werden soll.
-
Der String, ausschließlich des
Null-Terminators, wird in den Datenbereich des konstruierten Deskriptors
kopiert.
-
Die Länge des konstruierten Deskriptors
wird auf die Länge
des Strings gesetzt, ausschließlich
des Null-Terminators, und die Maximallänge wird auf den Wert des Ganzzahlschablonenparameters <TInt S> gesetzt.
-
-
Hinweise
-
Die Länge des Strings, ausschließlich des
Null-Terminators, darf nicht größer sein
als der Wert des Ganzzahlschablonenparameters <TInt S>, da sonst im Konstruktor Panik mit ETDes8Overflow
für die
8-Bit-Variante oder ETDes160verflow für die 16-Bit-Variante auftritt.
-
Zuweisungsoperatoren
-
e32.descriptors.TBuf.assignment-operators
-
Siehe auch e32.descriptors.TDes.assignment-operators.
-
-
Beschreibung
-
Dieser Zuweisungsoperator kopiert
den Inhalt des modifizierbaren Pufferdeskriptors aBuf in diesen modifizierbaren
Pufferdeskriptor.
-
Die Daten von aBuf werden in den
Datenbereich dieses Deskriptors kopiert und ersetzen den existierenden
Inhalt. Die Länge
dieses Deskriptors wird auf die Länge von aBuf gesetzt.
-
-
Beschreibung
-
Dieser Zuweisungsoperator kopiert
den Inhalt eines beliebigen Deskriptortyps aDes in diesen modifizierbaren
Pufferdeskriptor.
-
Die Daten von aDes werden in den
Datenbereich dieses Deskriptors kopiert und ersetzen den existierenden
Inhalt. Die Länge
dieses Deskriptors wird auf die Länge von aDes eingestellt.
-
-
-
Beschreibung
-
Dieser Zuweisungsoperator kopiert
einen null-terminierten String, einschließlich des Null-Terminators, in diesen
modifizierbaren Pufferdeskriptor.
-
Der kopierte String ersetzt den existierenden
Inhalt dieses Deskriptors.
-
Die Länge dieses Deskriptors wird
auf die Länge
des Strings gesetzt, ausschließlich
des Null-Terminators.
-
-
Hinweise
-
Die Länge des Strings, ausschließlich des
Null-Terminators, darf nicht größer sein
als der Wert des Schablonenparameters <TInt S>, da sont in der Operation Panik mit ETDes8Overflow
für die
8-Bit-Variante oder ETDes16Overflow für die 16-Bit-Variante auftritt.
-
HBufC Klasse Freispeicherdeskriptor
-
Übersicht
-
-
Beschreibung
-
Erzeugen eines HBufC Deskriptors
zum Bereitstellen eines Puffers fester Länge zum Aufnehmen von und Zugreifen
auf Daten.
-
Die in einem HBufC Deskriptor befindlichen
Daten können
nicht modifiziert werden, aber sie können mit den Zuweisungsoperatoren
ersetzt werden.
-
Der Deskriptor existiert nur auf
dem Freispeicher, hat aber die wichtige Eigenschaf, dass er umdimensioniert,
d. h. größer oder
kleiner gemacht werden kann, um die Größe seines Datenbereichs zu ändern. Dies erfolgt
durch Neuzuordnen des Deskriptors. Im Gegensatz zum Verhalten von
dynamischen Puffern (siehe e32.dynamic-buffers), erfolgt die Neuzuordnung
nicht automatisch.
-
Ein HBufC Deskriptor ist in Situationen
nützlich,
in denen zunächst
ein großer
Puffer fester Länge
benötigt
wird, aber danach ein kleiner Puffer fester Länge ausreicht.
-
Ein HBufC Deskriptor muss mit den
statischen Memberfunktionen New(), NewL() oder NewLC() konstruiert
und dann mit den Memberfunktionen ReAlloc() oder ReAllocL() umdimensioniert
werden. Ein Code-Fragment illustriert, wie dies verwendet werden
könnte:
-
In der Praxis ist die Verwendung
von ReAlloC() etwas ineffizient, da die Daten im HBufC Deskriptor über die
Neuzuordnung gespeichert, aber dann verworfen werden, wenn ihm der
Inhalt von aSrcBuf zugewiesen wird.
-
Alle unter der TDesC Klasse beschriebenen
Memberfunktionen stehen für
die Verwendung durch einen TBufC Deskriptor zur Verfügung. Zusammenfassend
sind dies:
-
Zuordnung und Konstruktion
-
e32.descriptors.HBufC.allocation-and-construction
-
-
-
Beschreibung
-
Diese Funktionen dienen zum Konstruieren
eines neuen HBufC Deskriptors auf dem Freispeicher.
-
Diese Funktionen versuchen, eine
einzelne Zelle zu erfassen, die groß genug ist, um ein HBufC Objekt aufzunehmen,
das einen Datenbereich mit einer Länge enthält, die wenigstens aMdxLength
beträgt.
Die resultierende Länge
des Datenbereiches kann größer sein
als aMaxLength, je nach Implementierung der Speicherzuordnung, ist
aber garantiert nicht kleiner als aMaxLenlgth.
-
Wenn nicht genügend Speicherplatz vorhanden
ist, um den Deskriptor zu erzeugen, dann gibt New() NULL zurück, aber
NewL() und NewLC() gehen weg. Weitere Informationen über diese
Verarbeitung siehe e32.exception.intro.
-
Wenn der neue Deskriptor erfolgreich
konstruiert wird, dann setzt NewLC() den Deskriptor auf den Bereinigungsstapel
und gibt dann die Adresse dieses Deskriptors zurück. Weitere Informationen über den
Bereinigungsstapel siehe e32.exception.transient.
-
Die Länge des neuen Deskriptors wird
auf null gesetzt.
-
Zum Zuweisen von Daten in den Deskriptor
operator= verwenden.
-
Siehe Beispiel eudeshbc.
-
-
-
Beispiel
-
Diese Code-Fragmente illustrieren,
wie ein HBufC Deskriptor konstruiert werden kann. Verwenden von New():
-
NewL(), NewLC() Erzeugen
eines neuen HBufC von einem Strom
-
e32.descriptors.newfromstream
-
-
Beschreibung
-
Diese Funktionen dienen zum Konstruieren
eines neuen HBufC Deskriptors auf dem Freispeicher und zum Zuweisen
von im Strom aStream befindlichen Daten zu diesem neuen Deskriptor.
-
Diese Funktionen versuchen, eine
einzelne Zelle zu erfassen, die groß genug ist, um ein HBufC Objekt aufzunehmen,
das einen Datenbereich enthält,
dessen Länge
ausreicht, um die im Strom befindlichen Daten aufzunehmen. Der Strom
enthält
sowohl die Länge
der Daten als auch die Daten selbst.
-
Wenn nicht genügend Speicherplatz vorhanden
ist, um den Deskriptor zu erzeugen, oder der im Strom enthaltene
Längenwert
größer ist
als aMaxLength, dann gehen NewL() und NewLC() weg. Weitere Informationen über diese
Verarbeitung siehe e32.exception.intro.
-
Nach dem erfolgreichen Konstruieren
des neuen Deskriptors setzt NewLC() den Deskriptor auf den Bereinigungsstapel
und kehrt dann mit der Adresse dieses Deskriptors zurück. Weitere
Informationen über
den Bereinigungsstapel siehe e32.exception.transient.
-
Bei diesen Funktionen wird davon
ausgegangen, dass sich der Strom gerade an einer richtigen Stelle befindet,
d. h. an einer Stelle, an der ein Deskriptor zuvor ausgeströmt ist (mit
dem operator «).
-
Siehe externalisierende store.streams.externalizing.descriptors
und internalisierende store.streams.internalizirig.descriptors.
-
Zu allgemeinen Informationen über Ströme siehe
store.streams-basic und store.streams.
-
Zu allgemeinen Informationen über Speicher
siehe store.stores.
-
-
-
Beschreibung
-
Diese Funktionen dienen zum Konstruieren
eines neuen HBufC Deskriptors auf dem Freispeicher.
-
Die Funktionen versuchen, eine einzelne
Zelle zu erfassen, die groß genug
ist, um ein HBufC Objekt aufzunehmen, das einen Datenbereich mit
einer Länge
enthält,
die wenigstens aMaxLength ist. Die resultierende Länge des
Datenbereichs kann größer sein
als aMaxLength, je nach Implementation der Speicherzuordnung, ist
aber garantiert nicht kleiner als aMaxLength.
-
Wenn nicht genügend Speicherplatz vorhanden
ist, um den Deskriptor zu erzeugen, dann gibt NewMax() NULL zurück, aber
NewMaxL() und NewMaxLC() gehen weg. Weitere Informationen über diese
Verarbeitung siehe e32.exception.intro.
-
Nach dem erfolgreichen Konstruieren
des neuen Deskriptors setzt NewMaxLC() den Deskriptor auf den Bereinigungsstapel
und kehrt dann mit der Adresse dieses Deskriptors zurück. Weitere
Informationen über den
Bereinigungsstapel siehe e32.exception.transient.
-
Die Länge des neuen Deskriptors wird
auf den Wert von aMaxLength gesetzt. Zum Zuweisen von Daten in den
Deskriptor operator= verwenden.
-
-
-
Beispiel
-
Beispiel siehe e32.descriptors.new
-
Neuzuordnung
-
e32.descrigtors.HBufC.reallocation
-
-
Beschreibung
-
Diese Funktion dient zum Erweitern
oder Verengen des Datenbereichs eines existierenden HBufC Deskriptors.
Dies erfolgt durch:
-
- – Konstruieren
eines neuen HBufC Deskriptors auf dem Freispeicher, der einen Datenbereich
mit der Länge aMaxLength
enthält
- – Kopieren
des Inhalts des ursprünglichen
Deskriptors in den neuen Deskriptor
- – Löschen des
ursprünglichen
Deskriptors
-
Die Funktionen versuchen, eine einzelne
Zelle zu erfassen, die groß genug
ist, um ein HBufC Objekt aufzunehmen, das einen Datenbereich mit
Länge aMaxLength
enthält.
-
Wenn nicht genügend Speicherplatz vorhanden
ist, um den neuen Deskriptor zu konstruieren, dann gibt ReAlloC()
NULL zurück,
aber ReAlloCL() geht weg. In beiden Fällen bleibt der ursprüngliche
Deskriptor unverändert;
weitere Informationen über
diese Verarbeitung siehe e32.exception.intro.
-
Nach dem erfolgreichen Konstruieren
des neuen Deskriptors wird der Inhalt des ursprünglichen Deskriptors in den
neuen Deskriptor kopiert, der ursprüngliche Deskriptor wird gelöscht und
die Adresse des neuen Deskriptors wird dem Anrufer zurückgegeben.
Die Länge
des neu zugeordneten Deskriptors bleibt unverändert.
-
-
Hinweise
-
Wenn die Neuzuordnung erfolgreich
ist, darauf achten, dass eventuelle, die Adresse des ursprünglichen
HBufC Deskriptors enthaltende Zeiger nicht mehr gültig sind.
Dies gilt auch für
den Bereinigungsstapel; Sorgfalt ist bei Design und Implementation
von Code geboten, wenn ein Zeiger auf einen HBufC Deskriptor auf den
Bereinigungsstapel gesetzt und der Deskriptor nachfolgend neu zugeordnet
wird.
-
Besondere Aufmerksamkeit ist geboten,
wenn die Des() Memberfunktion zum Erzeugen eines TPtr Deskriptors
verwendet wird. Es ist nicht garantiert, dass der vor der Neuzuordnung
des HBufC Deskriptors erzeugte TPt r Deskriptor nach der Zuordnung
einen gültigen
Zeiger hat. Jeder Versuch, Daten mit dem TPtr nach der Neuzuordnung
zu modifizieren, kann unvorhersehbare Folgen haben.
-
Beispiel
-
Diese Code-Fragmente illustrieren,
wie ReAlloc() funktionieren kann.
-
-
Nach der ersten Neuzuordnung zeigt
newgood auf den neu zugeordneten Deskriptor, old enthält eine ungültige Adresse.
Bei der zweiten Neuzuordnung entsteht Panik, weil ein Versuch gemacht
wird, den Datenbereich auf eine Länge von 8 zu verengen, die
kleiner ist als die ursprüngliche
Länge des
Deskriptors.
-
Erzeugen eines modifizierbaren
Zeigerdeskriptors
-
e32.descriptors.HBufC.create-TPtr
-
-
Beschreibung
-
Diese Funktion dient zum Konstruieren
und Zurückgeben
eines modifizierbaren Zeigerdeskriptors, um diesen Deskriptor zu
repräsentieren.
-
Der Inhalt eines HBufC Deskriptors
kann nicht geändert
werden, aber durch Erzeugen eines modifizierbaren Zeigerdeskriptors
entsteht ein Mechanismus zum Modifizieren dieser Daten.
-
Die Länge des neuen TPtr wird auf
die Länge
dieses Deskriptors gesetzt.
-
Die Maximallänge des neuen TPtr wird auf
die Länge
des Datenbereichs dieses Deskriptors gesetzt.
-
Der neue TPtr wird so eingestellt,
dass er auf diesen Deskriptor zeigt. Die Daten dieses Deskriptors werden
weder kopiert noch umgestellt.
-
Die Daten dieses Deskriptors können durch
den neu konstruierten TPtrmodifiziert werden. Wenn sich die Länge der
Daten ändert,
dann wird die Länge
dieses Deskriptors und des TPt r dementsprechend geändert.
-
Rückgabewert
-
TPtr Ein modifizierbarer Zeigerdeskriptor,
der diesen HBufC Deskriptor repräsentiert.
-
Hinweise
-
Besondere Aufmerksamkeit ist bei
Verwendung von ReAlloc() oder ReallocL() geboten. Es ist nicht garantiert,
dass ein vor der Neuzuordnung des HBufC Deskriptors erzeugter TPtr
Deskriptor nach der Neuzuordnung einen gültigen Zeiger hat. Jeder Versuch,
Daten mit dem TPtr nach der Neuzuordnung zu modifizieren, kann unvorhersehbare
Folgen haben.
-
Zuweisungsoperatoren
-
e32.descriptors.HBufC.assignment-operators
-
Siehe auch e32.descriptors.TDes.assignment-operators.
-
-
Beschreibung
-
Dieser Zuweisungsoperator kopiert
den Inhalt des Freispeicherdeskriptors aLcb in diesen Freispeicherdeskriptor.
-
Die Daten von aLcb werden in den
Datenbereich dieses Deskriptors kopiert und ersetzen den existierenden
Inhalt. Die Länge
dieses Deskriptors wird auf die Länge von aLcb gesetzt.
-
-
Hinweise
-
Die Länge des Deskriptors aLcb darf
nicht größer sein
als die Länge
des Datenbereichs dieses Deskriptors, da sonst in der Funktion Panik
mit ETDes8Overflow für
die 8-Bit-Variante
oder ETDes16Overflow für die
16-Bit-Variante auftritt.
-
-
Beschreibung
-
Dieser Zuweisungsoperator kopiert
den Inhalt eines beliebigen Deskriptortyps aDes in diesen Freispeicherdeskriptor.
-
Die Daten von aDes werden in den
Datenbereich dieses Deskriptors kopiert und ersetzen den existierenden
Inhalt. Die Länge
dieses Deskriptors wird auf die Länge von aDes gesetzt.
-
-
Hinweise
-
Die Länge des Deskriptors aDes darf
nicht größer sein
als die Länge
des Datenbereichs dieses Deskriptors, da sonst in der Funktion Panik
mit ETDes8Overflow für
die 8-Bit-Variante
oder mit ETDes16Overflow für
die 16-Bit-Variante auftritt.
-
-
Beschreibung
-
Dieser Zuweisungsoperator kopiert
einen null-terminierten String, ausschließlich des Null-Terminators, in diesen
Freispeicherdeskriptor.
-
Der String, ausschließlich des
Null-Terminators, wird in den Datenbereich dieses Deskriptors kopiert und
ersetzt den existierenden Inhalt. Die Länge dieses Deskriptors wird
auf die Länge
des Strings gesetzt, ausschließlich
des Null-Terminators.
-
-
Hinweise
-
Die Länge des Strings, ausschließlich des
Null-Terminators, darf nicht größer sein
als die Länge
des Datenbereichs dieses Deskriptors, da sonst in der Funktion Panik
mit ETDes80verflow für
die 8-Bit-Variante oder mit ETDes160verflow für die 16-Bit-Variante auftritt.
-
Klasse TDesC
-
Uberblick
-
-
Beschreibung
-
Die Klasse ist abstrakt und kann
nicht konstruiert werden. Sie implementiert den Aspekt des Deskriptorverhaltens,
der die Deskriptordaten nicht modifiziert.
-
Alle hier beschriebenen Memberfunktionen
stehen allen abgeleiteten Deskriptorklassen zur Verfügung.
-
Grundinformationen
-
e32.descriptors.TDesC.basic-functions
-
-
Beschreibung
-
Diese Memberfunktion dient zum Zurückgeben
der Zahl von Datenelementen im Datenbereich des Deskriptors.
-
Für
8-Bit-Deskriptoren haben Daten einen Einzelbyte-Wert und die Länge hat
denselben Wert wie die Anzahl der von diesen Daten belegten Bytes.
Für 16-Bit-Deskriptoren
haben die Daten einen Doppelbyte-Wert und der Längenwert beträgt die Hälfte der
Anzahl der von diesen Daten belegten Bytes.
-
Wenn z. B. ein Deskriptor oder Datenbereich
ein ASCII-Textzeichen enthält,
dann ist die zurückgegebene
Länge eins
und belegt ein Byte (und die Funktion Size() gibt eins zurück); wenn
ein Datenbereich ein UNICODE-Textzeichen enthält, dann ist die zurückgegebene
Länge ebenfalls
eins, belegt aber zwei Byte (und die Funktion Size() gibt zwei zurück).
-
Rückgabewert
-
Tint Die Länge der Daten innerhalb des
Datenbereiches.
-
-
Diese Memberfunktion dient zum Zurückgeben
der Zahl von Bytes, die von Daten im Datenbereich des Deskriptors
belegt werden. Für
8-Bit-Deskriptoren ist dieser Wert derselbe wie die Länge der
Daten. Für 16-Bit-Deskriptoren
ist dieser Wert das Zweifache der Längen der Daten.
-
Rückgabewert
-
Tint Die Anzahl der von Daten im
Datenbereich des Deskriptors belegten Bytes.
-
-
Beschreibung
-
Diese Memberfunktion dient zum Zurückgeben
der Adresse des Datenbereichs des Deskriptors. Die Adresse kann
nicht zum Ändern
der Daten des Deskriptors verwendet werden.
-
-
Hinweise
-
Wenn der Deskriptor für Strings
verwendet wird, dann kann der Zeiger als TText Typ angesehen werden,
und es braucht nicht zwischen der 8-Bit- und der 16-Bit-Variante
unterschieden zu werden. Wenn der Deskriptor für binäre Daten verwendet wird, dann
sollte der Zeiger als TUint8 Typ angesehen werden.
-
Vergleich
-
e32.descriptors.TDesC.comparison
-
-
Beschreibung
-
Diese Funktionen dienen zum Vergleichen
des Inhalts dieses Deskriptors mit dem Inhalt des Deskriptors aDes.
-
Der Vergleich erfolgt byteweise in
der 8-Bit-Variante und doppelbyteweise in der 16-Bit-Variante.
-
Das Ergebnis des Vergleichs basiert
auf der Diskrepanz zwischen den ersten Bytes (oder Doppelbytes).
Zwei Deskriptoren sind dann gleich, wenn sie dieselbe Länge und
denselben Inhalt haben. Wenn zwei Deskriptoren unterschiedliche
Längen
haben und der kürzere
mit dem ersten Teil des längeren übereinstimmt, dann
wird der kürzere
als kleiner angesehen als der längere.
-
CompareF() nimmt den gefalteten Inhalt
beider Deskriptoren für
den Vergleich, während
CompareC() den gemischten Inhalt beider Deskriptoren für den Vergleich
nimmt. Compare() nimmt einfach den Inhalt beider Deskriptoren, wie
sie sind.
-
Weitere Informationen über Falten
siehe e32.descriptors.folding, weitere Informationen über Mischen siehe
e32.descriptors.collating.
-
Compare() ist zum Vergleichen von
Text und binären
Daten nützlich.
CompareF() ist für
groß-/klein-insensitive
Textvergleiche nützlich.
-
-
Beispiel
-
Dieses Code-Fragment illustriert
die Verwendung von Compare() .
-
-
-
Mustervergleich
-
e32.descriptors.TDesC.pattern-matching
-
-
Mustervergleichsdaten
-
Beschreibung
-
Diese Funktionen dienen zum Vergleichen
des Vergleichsmusters im Datenbereich von aDes mit dem Inhalt dieses
Deskriptors.
-
Das Vergleichsmuster kann die Wildcard-Zeichen'*' und '?' enthalten, wobei'*' null oder mehr aufeinander folgenden
Auftretensfällen
eines beliebigen Zeichens und '?' einem einzelnen
Auftretensfall eines beliebigen Zeichens entspricht.
-
MatChF() nimmt den gefalteten Inhalt
beider Deskriptoren für
den Vergleich, während
MatchC() den gemischten Inhalt beider Deskriptoren für den Vergleich
benutzt. Match() nimmt einfach den Inhalt beider Deskriptoren, wie
sie sind.
-
Weitere Informationen über Falten
siehe e32.descriptors.folding, weitere Informationen über Mischen siehe
e32.descriptors.collating.
-
-
-
Hinweise
-
Zum Prüfen auf Vorhandensein eines
Musters innerhalb eines Textstrings muss das Muster mit einem '*' beginnen und enden.
-
Wenn das Muster mit einem '*' Wildcard-Zeichen endet und der gegebene
String mit dem Muster übereinstimmt,
dann ist der zurückgegebene
Wert die Länge
des Strings, die mit dem Muster bis zu, aber nicht einschließlich des
letzten Sternchens übereinstimmt.
Dies wird in den nachfolgenden Beispielen illustriert.
-
Beispiel
-
Dieses Code-Fragment illustriert
die Verwendung von Match()
-
Lokalisieren eines Zeichens
-
e32.descriptors.TDesC.locate-character
-
-
Beschreibung
-
Diese Funktionen dienen zum Suchen
des ersten Auftretens eines Zeichens innerhalb dieses Deskriptors.
Die Suche beginnt am Anfang (d. h. der linken Seite) des Datenbereiches.
LocateF() nimmt den gefalteten Inhalt des Deskriptors und faltet
das gegebene Zeichen vor der Suche. Dies ist beim Suchen nach einem
Zeichen auf groß-/klein-insensitive
Weise nützlich.
-
Weitere Informationen über Falten
siehe e32.descriptors.folding.
-
-
Beispiel
-
Dieses Code-Fragment illustriert
die Verwendung von Locate().
-
-
-
Beschreibung
-
Diese Funktionen dienen zum Suchen
des ersten Auftretensfalls eines Zeichens innerhalb dieses Deskriptors,
wobei vom Ende (d. h. der rechten Seite) des Datenbereichs aus gesucht
wird.
-
LocateReverSeF() nimmt den gefalteten
Inhalt des Deskriptors und faltet das gegebene Zeichen vor der Suche.
Dies ist beim Suchen nach einem Zeichen auf groß/klein-insensitive Weise nützlich.
-
Weitere Informationen über Falten
siehe e32.descriptors.folding.
-
-
Suchen von Daten
-
e32.descriptors.TDesC.find-data
-
-
Beschreibung
-
Diese Funktionen dienen zum Suchen
der Stelle, innerhalb dieses Deskriptors, der in aDes gelieferten Daten.
Die Suche beginnt am Anfang (d. h. auf der linken Seite) des Datenbereiches
dieses Deskriptors.
-
FindF() faltet den Inhalt beider
Deskriptoren für
die Suche, während
FindC() den Inhalt mischt.. Weitere Informationen über Falten
siehe e32.descriptors.folding, weitere Informationen über Mischen
siehe e32.descriptors.coliating.
-
Diese Funktionen sind zwar beim Suchen
nach Vorhandensein und Ort eines Substrings innerhalb eines Strings
am nützlichsten,
sie können
aber auch bei allgemeinen binären
Daten angewendet werden.
-
FindF() ist beim Durchführen einer
groß-/klein-unabhängigen Suche
eines Substrings in einem String nützlich; FindC() ist beim Suchen
eines Substrings in einem String auf der Basis seiner Mischsequenz
nützlich.
-
-
Hinweise
-
Wenn der Deskriptor aDes Null-Länge hat,
dann ist der zurückgegebene
Wert null.
-
Beispiel
-
Dieses Code-Fragment illustriert
die Verwendung von Find() .
-
-
-
Beschreibung
-
Diese Funktionen dienen zum Suchen
des Ortes, innerhalb dieses Deskriptors, der Daten mit Länge aLen
an der Adresse aBuf. Die Suche beginnt am Anfang (d. h. auf der
linken Seite) des Datenbereichs dieses Deskriptors.
-
FindF() faltet den Inhalt dieses
Deskriptors und der Daten bei aBuf für die Suche, während FindC()
den Inhalt mischt. Weitere Informationen über Falten siehe e32.descriptors.folding,
weitere Informationen über
Mischen siehe e32.descriptors.collating.
-
Diese Funktionen sind zwar bei der
Suche nach Anwesenheit und Ort eines Substrings in einem String am
nützlichsten,
aber sie können
auch auf allgemeine binäre
Daten angewendet werden.
-
FindF() ist bei einer groß-/klein-unabhängigen Suche
eines Substrings in einem String nützlich; FindC() ist bei der
Suche eines Substrings in einem String auf der Basis seiner Mischsequenz
nützlich.
-
-
Hinweise
-
Wenn aLen null ist, dann ist der
zurückgegebene
Wert null.
-
Extraktion
-
e32.descriptors.TDesC.extraction
-
-
Beschreibung
-
Diese Funktion dient zum Konstruieren
und Zurückgeben
eines konstanten Zeigerdeskriptors, um den linken Teil der Daten
dieses Deskriptors zu repräsentieren.
-
-
Hinweise
-
Es erfolgt keine Bewegung und kein
Kopieren von Daten; die durch den zurückgegebenen Deskriptor repräsentierten
Daten belegen denselben Speicherplatz wie das Original.
-
Das Vorgeben eines Null-Wertes für aLength
führt zu
einem Deskriptor, der keine Daten repräsentiert.
-
Beispiel
-
Die Code-Fragmente illustrierten
die Verwendung von Left() .
-
-
Das Ergebnis dieses spezifischen
Beispiels kann in einer Vorher- (in 9 gezeigt)
und Nachher- (in 10 gezeigt)
Weise sichtbar gemacht werden. Der unterstrichene Text im "Nachher"-Diagramm (10) gibt die Daten an,
die von dem zurückgegebenen
Deskriptor repräsentiert
werden.
-
Man beachte, dass das Ergebnis der
nachfolgenden Aufrufe an Left() zu Panik führt.
-
-
Beschreibung
-
Diese Funktion dient zum Erzeugen
und Zurückgeben
eines konstanten Zeigerdeskriptors, so dass er den rechten Teil
der Daten dieses Deskriptors repräsentiert.
-
Argumente Tint aLength Die Länge von
Daten innerhalb dieses Deskriptors, die der neue Deskriptor repräsentieren
soll.
-
Dieser Wert darf nicht negativ und
nicht größer sein
als die aktuelle Länge
dieses Deskriptors, sonst tritt in dieser Funktion Panik mit ETDes8PosOutOfRange
für die
8-Bit-Variante oder ETDesl6PosOutOfRange für die 16-Bit-Variante auf.
-
Rückgabewert
-
TPtrC Der konstante Zeigerdeskriptor,
der den rechten Teil des Datenbereichs dieses Deskriptors repräsentiert.
-
Hinweise
-
Es erfolgt kein Bewegen und kein
Kopieren von Daten; die von dem zurückgegebenen Deskriptor repräsentierten
Daten belegen denselben Speicherplatz wie das Original.
-
Die Vorgabe eines Nullwertes für aLength
ergibt einen Deskriptor, der keine Daten repräsentiert.
-
Beispiel
-
Die Code-Fragmente illustrieren die
Verwendung von Right().
-
-
Das Ergebnis dieses spezifischen
Beispiels kann in einer Vorher- (11)
und Nachher(12) Weise
sichtbar gemacht werden. Der unterstrichene Text im "Nachher"-Diagramm (12) gibt die Daten an, die von dem zurückgegebenen
Deskriptor repräsentiert
werden.
-
Man beachte, dass das Ergebnis der
folgenden Aufrufe an Right() zu Panik führt.
-
-
Beschreibung
-
Diese Funktionen dienen zum Erzeugen
und Zurückgeben
eines konstanten Zeigerdeskriptors, um einen Abschnitt der in diesem
Deskriptor befindlichen Daten zu repräsentieren.
-
Der Abschnitt kann entweder anhand
der Position alleine oder anhand von Position und Länge identifiziert
werden. Wenn er anhand der Position alleine identifiziert wird,
dann ist die implizierte Länge
die Länge von
Daten von der vorgegebenen Position zum Ende der Daten in diesem
Deskriptor.
-
-
Wenn aPos alleine vorgegeben wird,
dann ist 0 <= aPos <= Länge dieses
Deskriptors. Wenn aPos und aLength vorgegeben werden, dann ist 0 <= (aPos + aLength) <= Länge dieses
Deskriptors.
-
Wenn diese Grenzwerte überschritten
werden, dann tritt in den Funktionen Panik mit ETDes8PosOutOfRange
für die
8-Bit-Variante oder ETDes16PosOutOfRange für die 16-Bit-Variante auf.
-
-
Hinweise
-
Es erfolgt keine Bewegung und kein
Kopieren von Daten; die durch den zurückgegebenen Deskriptor repräsentierten
Daten belegen denselben Speicherplatz wie das Original.
-
Das Vorgeben eines Wertes von aPos,
der denselben Wert hat wie die Länge
der Daten, führt
zu einem konstanten Zeigerdeskriptor, der keine Daten repräsentiert.
-
Beispiel
-
Die Code-Fragmente illustrieren die
Verwendung von Mid() .
-
-
Erzeugen eines Freispeicherdeskriptors
(HBufC)
-
e32.descriptors.TDesC.create-HBufC
-
-
Beschreibung
-
Diese Funktionen dienen zum Zuordnen
und Konstruieren eines neuen HBufC Deskriptors auf dem Freispeicher
und zum Initialisieren desselben anhand des Inhalts dieses Deskriptors.
-
Die Funktionen versuchen, eine einzelne
Zelle zu erfassen, die groß genug
ist, um ein HBufC Objekt aufzunehmen, das einen neuen Datenbereich
enthält,
dessen Länge
dieselbe ist wie die aktuelle Länge
dieses Deskriptors. Der Inhalt dieses Deskriptors wird in den neuen
HBufC Deskriptor kopiert.
-
Wenn nicht genügend Speicherplatz vorhanden
ist, um den neuen HBufC Deskriptor zu erzeugen, dann gibt Alloc()
NULL zurück,
aber AllocL() und AllocLC() gehen weg. Weitere Informationen über diese
Verarbeitung siehe e32.exception.intro.
-
Nach der erfolgreichen Erzeugung
des neuen Deskriptors setzt AllocLC() den neuen Deskriptor auf den
Bereinigungsstapel und kehrt dann mit der Adresse dieses Deskriptors
zurück.
Weitere Informationen über den
Bereinigungsstapel siehe e32.exception.transient.
-
-
Beispiel
-
Die Code-Fragmente illustrieren die
Verwendung von AllocL() .
-
-
Das Ergebnis dieses spezifischen
Beispiels kann in einer Vorher- (13)
und Nachher(14) Weise
sichtbar gemacht werden.
-
Huffman-Codierung/Decodierung
-
e32.descriptors.TDesC.huffman-encoding-decoding
-
-
Beschreibung
-
Diese Funktion dient für eine Huffman-Codierung
der Daten in diesem Deskriptor und zum Setzen des Ergebnisses in
den Deskriptor aDest. Der Zieldeskriptor muss ein modifizierbarer
Typ sein, d. h. entweder ein TPt r oder ein TBuf.
-
Der Anrufer kann einen Huffman-Baum
liefern oder den integrierten Baum verwenden.
-
-
Beschreibung
-
Diese Funktion dient zur Huffman-Decodierung
der Daten in diesem Deskriptor und zum Setzen des Ergebnisses in
den Deskriptor aDest. Der Zieldeskriptor muss ein modifizierbarer
Typ sein, d. h. entweder ein TPtr oder ein TBuf.
-
Der Anrufer kann einen Huffman-Baum
tiefem oder den integrierten Baum verwenden.
-
-
Vergleichsoperatoren
-
e32.descriptors.TDesC.comparison-operators
-
-
Beschreibung
-
Diese Operatoren dienen zum Ermitteln,
ob der Inhalt dieses Deskriptors:
-
- – kleiner
als
- – größer als
oder gleich
- – größer als
- – größer als
oder gleich
- – gleich
- – nicht
gleich
-
dem Inhalt von aDes ist.
-
Der Vergleich wird mit der Memberfunktion
TDesC::Compare() implementiert. Zu weiteren Einzelheiten über den
Vergleichsvorgang siehe diese Memberfunktion.
-
-
Beispiel
-
Dieses Code-Fragment illustriert
die Verwendung von Compare().
-
Indexieroperator
-
-
e32.descriptors.TDesC.indexing-operator
-
-
Beschreibung
-
Dieser Operator dient zum Zurückgeben
einer Referenz auf ein einzelnes Datenelement in diesem Deskriptor
(d. h. ein Textzeichen). Die Daten können als eine Array von ASCII oder
UNICODE-Zeichen oder als eine Array von Bytes (oder Doppelbytes)
von binären
Daten angesehen werden.
-
Dieser Operator lässt es zu, dass auf individuelle
Elemente der Array zugegriffen wird, aber sie können nicht geändert werden.
-
-
Beispiel
-
Die Code-Fragmente illustrieren die
Verwendung von operator[] .
-
-
TDes Klasse
-
Übersicht
-
-
Definiert in
-
e32des8.h für die 8-Bit-Variante (TDes8)
-
e32des16.h für die 16-Bit-Variante (TDes16)
-
Beschreibung
-
Die Klasse ist abstrakt und kann
nicht konstruiert werden. Sie implementiert den Aspekt des Deskriptorverhaltens,
der die Daten des Deskriptors modifiziert.
-
Alle hier beschriebenen Memberfuriktionen
stehen allen abgeleiteten Deskriptorklassen zur Verfügung.
-
Grundfunktionen
-
e32.descriptors.TDes.basic-functions
-
-
Beschreibung
-
Diese Funktion dient zum Zurückgeben
der maximalen Länge
von Daten, die der Datenbereich des Deskriptors aufnehmen kann.
-
Für
modifizierbare Deskriptoren ist die Datenmenge, die der Datenbereich
eines Deskriptors aufnehmen kann, variabel; es gibt jedoch eine
Obergrenze, und diese Grenze ist der von der Funktion zurückgegebene
Wert.
-
Für
8-Bit-Deskriptoren haben die Daten einen Einzelbyte-Wert, und die
Maximallänge
hat denselben Wert wie die Maximalgröße. Für 16-Bit-Deskriptoren haben
die Daten einen Doppelbyte-Wert, und der Wert der Maximallänge ist
die Hälfte
des Wertes der Maximalgröße.
-
-
-
Beschreibung
-
Diese Funktion dient zum Abrufen
der Maximalgröße des Datenbereiches
des Deskriptors in Byte.
-
Für
8-Bit-Deskriptoren sind die Daten Einzelbyte-Daten, und die Maximalgröße ist derselbe
Wert wie der für
die Maximallänge.
-
Für
16-Bit-Deskriptoren sind die Daten Doppelbyte-Daten, und die Maximalgröße ist das
Zweifache des Wertes der Maximallänge.
-
Ändern der Länge
-
-
e32.descriptors.TDes.change-length
-
-
Bescheibung
-
Diese Funktion dient zum Setzen der
Länge des
Deskriptors auf den Wert von aLength.
-
Argumente
-
-
-
Beschreibung
-
Diese Funktion dient zum Setzen der
Länge des
Deskriptors auf null.
-
-
Beschreibung
-
Diese Funktion dient zum Setzen der
Länge des
Deskriptors auf ihren Höchstwert.
-
Swap
-
e32.descriptors.TDes.swap
-
-
Beschreibung
-
Den Inhalt dieses Deskriptors mit
dem Inhalt von aDes vertauschen. Die Längen beider Deskriptoren werden
ebenfalls so vertauscht, dass die Datenänderung reflektiert wird.
-
Argumente
-
-
Hinweise
-
Jeder Deskriptor muss den Inhalt
des anderen Deskriptors aufnehmen können. Wenn die Maximallänge eines
Deskriptors geringer ist als die Länge des anderen Deskriptors,
dann tritt in der Funktion Panik mit ETDes8Overflow für die 8-Bit-Variante
oder ETDes16Overflow für
die 16-Bit-Variante auf.
-
Beispiel
-
Das folgende Code-Fragment illustriert
die Verwendung von Swap()
-
Kopieren
-
e32.descriptors.TDes.copy
-
-
Beschreibung
-
Diese Funktionen dienen zum Kopieren
des Inhalts eines beliebigen Deskriptors aDes in diesen Deskriptor.
Die kopierten Daten ersetzen den existierenden Inhalt dieses Deskriptors.
-
Die Länge dieses Deskriptors wird
auf die Länge
von aDes gesetzt.
-
Wenn dieser Deskriptor die 8-Bit-Variante
ist, dann ist Copy() überladen,
so dass ein anderer 8-Bit-Deskriptor oder ein 16-Bit-Deskriptor
als Quelle verwendet werden kann. Wenn dieser Deskriptor die 16-Bit-Variante
ist, dann ist Copy() überladen,
so dass ein 8-Bit-Deskriptor
oder ein anderer 16-Bit-Deskriptor als Quelle verwendet werden kann.
Somit gilt:
-
- – ein
8-Bit-Deskriptor kann auf einen 8-Bit-Deskriptor kopiert werden
- – ein
8-Bit-Deskriptor kann auf einen 16-Bit-Deskriptor kopiert werden
- – ein
16-Bit-Deskriptor kann auf einen 8-Bit-Deskriptor kopiert werden
- – ein
16-Bit-Deskriptor kann auf einen 16-Bit-Deskriptor kopiert werden
-
In dem Fall, in dem ein 16-Bit-Deskriptor
auf einen 8-Bit-Deskriptor kopiert wird, wird jedes Doppelbyte in
das entsprechende Einzelbyte kopiert, wo der Wert des Doppelbytes
geringer ist als dezimal 256. Ein Doppelbytewert von 256 oder höher kann
nicht kopiert werden, und das entsprechende Einzelbyte wird auf
einen Wert von dezimal 1 gesetzt.
-
In der Praxis ist die üblichste
Situation die, dass entweder 8 Bit auf 8 Bit oder 16 Bit auf 16
Bit kopiert werden.
-
-
Hinweise
-
Die Länge der Daten in aDes darf
nicht größer sein
als die Maximallänge
dieses Deskriptors, sonst tritt in der Funktion Panik mit ETDes80verflow
für die
8-Bit-Variante oder
ETDes160verflow für
die 16-Bit-Variante auf.
-
Beispiel
-
Das Code-Fragment illustriert die
Verwendung von Copy().
-
-
-
Beschreibung
-
Diese Funktion dient zum Kopieren
eines null-terminierten Strings, ausschließlich des Null-Terminators,
in diesen Deskriptor, wobei der existierende Inhalt ersetzt wird.
-
Die Länge dieses Deskriptors wird
auf die Länge
des Strings gesetzt, ausschließlich
des Null-Terminators.
-
Argumente
-
-
Hinweise
-
Die Länge des Strings, ausschließlich des
Null-Terminators, darf nicht größer sein
als die Maximallänge
dieses Deskriptors, sonst tritt in der Funktion Panik mit ETDes8Overflow
für die
8-Bit-Variante oder ETDes16Overflow für die 16-Bit-Variante auf.
-
-
Beschreibung
-
Diese Funktion dient zum Kopieren
von Daten von Länge
aLength von der Speicherstelle aBuf.
-
Die Länge dieses Deskriptors wird
auf den Wert von aLength gesetzt.
-
Argumente
-
-
-
-
Beschreibung
-
Diese Funktionen dienen zum Kopieren
des Inhalts von aDesC in diesen Deskriptor, wobei der existierende
Inhalt ersetzt wird.
-
Die Länge dieses Deskriptors wird
auf die Länge
von aDes gesetzt.
-
CopyF() faltet die Daten vor dem
Einfügen
in diesen Deskriptor, und CopyC() mischt die Daten vor dem Einfügen. Weitere
Informationen über
Falten siehe e32.descriptors.folding, weitere Informationen über Mischen
siehe e32.descriptors.collating.
-
Diese Funktionen sind nur für Textdaten
von praktischem Nutzen.
-
-
Hinweise
-
Die Länge der Daten in aDes darf
nicht größer sein
als die Maximallänge
dieses Deskriptors, sonst tritt in der Funktion Panik mit ETDes8Overflow
für die
8-Bit-Variante oder
ETDes16Overflow für
die 16-Bit-Variante auf.
-
-
Beschreibung
-
Diese Funktionen dienen zum Kopieren
des Inhalts eines aDesC in diesen Deskriptor, wobei der existierende
Inhalt ersetzt wird.
-
Die Länge dieses Deskriptors wird
auf die Länge
von aDes gesetzt.
-
Vor dem Kopieren von Daten wandelt
CopyLC() die Zeichen in Kleinbuchstaben um, CopyUC() wandelt die
Zeichen in Großbuchstaben
um, und CopyCP() kapitalisiert Text.
-
Kapitalisieren bedeutet das Umwandeln
des ersten Zeichens in einem String in Großbuchstaben und die Umwandlung
aller übrigen
Zeichen in Kleinbuchstaben. Akzentuierte Zeichen behalten ihre Akzente
bei.
-
Diese Funktionen sind nur für String-Daten
von praktischem Nutzen.
-
-
Hinweise
-
Die Länge der Daten in aDes darf
nicht größer sein
als die Maximallänge
dieses Deskriptors, sonst tritt in der Funktion Panik mit ETDes8Overflow
für die
8-Bit-Variante oder
ETDes16Overflow für
die 16-Bit-Variante auf.
-
Kopierwiederholung
-
e32.descriptors.TDes.copy-repeat
-
-
Beschreibung
-
Diese Funktion dient zum wiederholten
Kopieren des Inhalts des Deskriptors aDes in diesen Deskriptor.
Die Kopien werden miteinander in diesem Deskriptor verkettet und
ersetzen eventuelle vorhandene Daten.
-
Das Kopieren schreitet so lange fort,
bis dieser Deskriptor auf seine aktuelle Länge gefüllt ist. Wenn er keine ganze
Zahl von Kopien von aDes aufnehmen kann, dann wird die letzte Kopie
in diesem Deskriptor gekürzt.
-
-
Beispiel
-
Das folgende Code-Fragment illustriert
die Verwendung von Repeat().
-
-
-
Beschreibung
-
Diese Funktion dient zum wiederholten
Kopieren von Daten mit Länge
aLength von der Speicherstelle aBuf in diesen Deskriptor. Die Kopien
werden miteinander in diesem Deskriptor verkettet, und eventuelle
vorhandene Daten werden ersetzt.
-
Das Kopieren wird so lange fortgesetzt,
bis dieser Deskriptor bis zu seiner aktuellen Länge gefüllt ist. Wenn er keine ganze
Zahl von Kopien aufnehmen kann, dann wird die letzte Kopie in diesem
Deskriptor verkürzt.
-
-
Kopieren und Ausrichten
-
e32.descriptors.TDes.copy-justify
-
-
Beschreibung
-
Diese Funktion dient zum Kopieren
des Inhalts von aDes in diesen Deskriptor, wobei der existierende Inhalt
ersetzt wird. Der Zielbereich wird als Feld mit einer Breite aWidth
angesehen, das sich am Anfang (d. h. auf der linken Seite) des Datenbereichs
dieses Deskriptors befindet. Der Inhalt von aDes wird in den Zielbereich
kopiert und darin gemäß dem Wert
von anAlignment ausgerichtet.
-
Wenn aWi dth den Wert KDefaultJustifyWidth
hat, dann wird die Breite des Zielbereichs (d. h. der Wert von aWi
dth) auf die Länge
von aDes zurückgesetzt.
-
Wenn die Länge von aDes kleiner ist als
die Breite des Zielbereichs, dann wird eventueller unbelegter Raum
im Zielbereich mit dem Füllzeichen
aFill aufgefüllt.
-
Wenn die Länge von aDes größer ist
als die Breite des Zielbereichs, dann wird die Menge der von aDes
kopierten Daten auf den Wert von aWi dth begrenzt.
-
-
Hinweise
-
Wenn die Breite des Zielbereiches
größer ist
als die maximale Länge
dieses Deskriptors, dann tritt in der Funktion Panik mit ETDes8Overflow
für die
8-Bit-Variante oder mit ETDes16Overflow für die 16-Bit-Variante auf.
-
aWidth nicht auf einen negativen
Wert (außer
KDefaultJustifyWidth) setzen, da dies unvorhersehbare Folge haben
kann.
-
Beispiel
-
Die folgenden Code-Fragmente illustrieren
die Verwendung von Justify().
-
-
Der Deskriptor tgt hat eine Maximallänge von
16 und enthält
zunächst
den String "abc". Nach dem Aufruf
an Justify() wechselt der Inhalt von tgt auf "@@xyz@@@" wie in 15 illustriert.
-
In diesem Beispiel wird der Inhalt
des Quelldeskriptors zur Bildung eines 8-Zeichen-Feldes genommen,
das den ursprünglichen
Inhalt des Deskriptors tgt ersetzt. Die Zeichen "xyz" werden
im neuen Feld zentriert und auf beiden Seiten mit dem Füllzeichen '@' aufgefüllt. Die Einstellung der Ausrichtung
auf ELeft würde den
Inhalt von tgt auf "xyz@@@@@" ändern, während die Ausrichtung von ERight
den Inhalt von tgt auf "@@@@@xyz" ändern würde.
-
In allen drei Fällen ändert sich die Länge von
Deskriptor tgt von 3 auf B.
-
-
Dieser Aufruf an Justify() erzeugt
Panik, weil die resultierende Länge
von Daten in tgt die maximale Länge
von tgt überschreiten
würde.
-
-
In diesem Aufruf an Justify() wird
der Inhalt von tgt auf "rstuvwxy" wie in 16 illustriert geändert. Nur acht
der neun Zeichen im Datenbereich des Quelldeskriptors werden kopiert.
-
Einfügen/Löschen
-
e32.descriptors.TDes.insertion-deletion
-
-
Beschreibung
-
Diese Funktion dient zum Einfügen des
Inhalts von aDes in den Datenbereich dieses Deskriptors an der vorgegebenen
Position. Die existierenden Daten an der vorgegebenen Position innerhalb
dieses Deskriptors werden nach rechts bewegt, um für die eingefügten Daten
Platz zu machen.
-
Die Länge dieses Deskriptors wird
so erhöht,
dass sie die Inhaltszunahme reflektiert.
-
-
-
Beispiel
-
Das folgende Code-Fragment illustriert
die Verwendung von Insert().
-
-
-
Löschen
-
Delete()
-
void Delete(TInt aPos, TInt aLength);
-
Beschreibung
-
Diese Funktion dient zum Löschen eines
Abschnitts von Daten mit Länge
aLength aus dem Datenbereich dieses Deskriptors, beginnend an Position
aPos.
-
Die Länge dieses Deskriptors verringert
sich so, dass die Inhaltsabnahme reflektiert wird.
-
-
Beispiel
-
Das folgende Code-Fragment illustriert
die Verwendung von Delete().
-
-
-
-
Beschreibung
-
Diese Funktion dient zum Ersetzen
eines Abschnitts von Daten mit Länge
aLength im Datenbereich dieses Deskriptors, beginnend mit Position
aPos, mit dem Inhalt des Deskriptors aDes.
-
Die Länge von aDes kann geringer
sein als aLength, und in diesem Fall nimmt die resultierende Länge dieses
Deskriptors ab.
-
Die Länge von aDes kann größer sein
als die von aLength, und in diesem Fall erhöht sich die resultierende Länge dieses
Deskriptors.
-
Die Länge dieses Deskriptors ändert sich
so, dass der geänderte
Inhalt reflektiert wird.
-
-
Beispiel
-
Das folgende Code-Fragment illustriert
die Verwendung von ReplaCe().
-
-
Löschen von voranstehenden und
nachstehenden Leerstellen
-
e32.descriptors.TDes.delete-spaces
-
-
Beschreibung
-
Diese Funktion dient zum Löschen von
Leerzeichen von der linken Seite des Datenbereiches des Deskriptors.
Die Funktion löscht
jedes Leerzeichen, beginnend am Anfang, bis es auf das erste Nicht-Leerzeichen trifft.
-
Die Länge des Deskriptors wird so
reduziert, dass der Verlust der Leerzeichen reflektiert wird.
-
Beispiel
-
Das folgende Code-Fragment illustriert
die Verwendung von TrimLeft().
-
-
Beschreibung
-
Diese Funktion dient zum Löschen von
Leerzeichen von der rechten Seite des Datenbereichs des Deskriptors.
Die Funktion löscht
jedes Leerzeichen, beginnend am Ende in Richtung auf den Anfang,
bis sie auf das erste Nicht-Leerzeichen trifft.
-
Die Länge des Deskriptors wird so
reduziert, dass der Verlust der Leerzeichen reflektiert wird.
-
Beispiel
-
Das folgende Code-Fragment illustriert
die Verwendung von TrimRight().
-
-
Diese Funktion dient zum Löschen von
Leerzeichen von der linken und der rechten Seite des Datenbereichs
des Deskriptors.
-
Die Funktion löscht jedes Leerzeichen vom
Anfang her, bis sie auf das erste Nicht-Leerzeichen trifft, und löscht dann
jedes Leerzeichen beginnend am Ende in Richtung auf den Anfang,
bis es auf das erste Nicht-Leerzeichen trifft.
-
Die Länge des Deskriptors wird so
reduziert, dass der Verlust der Leerzeichen reflektiert wird.
-
Beispiel
-
Das folgende Code-Fragment illustriert
die Verwendung von Trim().
-
-
Falten/Mischen
-
e32.descriptors.TDes.fold-collate
-
-
Beschreibung
-
Diese Funktion dient zum Falten des
Inhalts dieses Deskriptors (weitere Informationen über Falten
siehe e32.descriptors.folding).
-
-
Beschreibung
-
Diese Funktion dient zum Mischen
des Inhalts dieses Deskriptors (weitere Informationen über Mischen siehe
e32.descriptors.collating).
-
Ändern der Schreibweise
-
e32.descriptors.TDes.change-case
-
Beschreibung
-
Diese Funktion dient zum
Umwandeln der Zeichen in diesem Deskriptor in Kleinbuchstaben.
-
-
Beschreibung
-
Diese Funktion dient zum Umwandeln
der Zeichen dieses Deskriptors in Großbuchstaben.
-
-
Beschreibung
-
Diese Funktion dient zum Kapitalisieren
des Inhalts dieses Deskriptors.
-
Kapitalisierung bedeutet hier die
Umwandlung des ersten Zeichens in Großbuchstaben und die Umwandlung
aller übrigen
Zeichen in Kleinbuchstaben.
-
Beispiel
-
Das folgende Code-Fragment illustriert
die Verwendung von Capitalise()
-
-
Auffüllen
-
e32.descriptors.TDes.filling
-
-
Beschreibung
-
Diese Funktion dient zum Füllen des
Datenbereichs dieses Deskriptors mit dem Zeichen aChar, wobei eventuell
existierender Inhalt ersetzt wird.
-
Der Datenbereich wird vom Anfang
bis zu seiner aktuellen Länge
gefüllt.
Er wird nicht bis auf seine Maximallänge gefüllt.
-
Die Länge des Deskriptors bleibt
unverändert.
-
-
-
Beschreibung
-
Diese Funktion dient zum Füllen des
Datenbereichs dieses Deskriptors mit aLength Zeichen aChar, wobei
eventuell existierender Inhalt ersetzt wird.
-
Die Länge des Deskriptors wird auf
aLength gesetzt.
-
-
Beschreibung
-
Diese Funktion dient zum Füllen des
Datenbereichs dieses Deskriptors mit Nullen (d. h. 0×00 oder 0×0000),
wobei eventuell vorhandener Inhalt ersetzt wird.
-
Der Datenbereich des Deskriptors
wird vom Anfang bis zu seiner aktuellen Länge gefüllt. Er wird nicht bis zu seiner
Maximallänge
gefüllt.
-
Die Länge des Deskriptors bleibt
unverändert.
-
-
Beschreibung
-
Diese Funktion dient zum Füllen des
Datenbereichs dieses Deskriptors mit aLength Nullen (d. h. 0×00 oder
0×0000),
wobei eventuell vorhandener Inhalt ersetzt wird.
-
Die Länge des Deskriptors wird auf
aLength gesetzt.
-
-
Ganzzahlkonversion
-
e32.descriptors.TDes.integer-conversion
-
-
Beschreibung
-
Diese Funktion dient zum Umwandeln
des Ganzzahlwertes aVal mit Vorzeichen in eine Dezimalzeichendarstellung
und zum Setzen der resultierenden Zeichen in den Datenbereich dieses
Deskriptors, wobei eventuell vorhandener Inhalt ersetzt wird. Wenn
die ganze Zahl negativ ist, dann wird vor die Zeichendarstellung
ein Minuszeichen gesetzt.
-
-
Beispiel
-
Das folgende Code-Fragment illustriert
die Verwendung von Num().
-
-
-
Beispiel
-
Das folgende Code-Fragment illustriert
die Verwendung von Num() und NumUC().
-
-
Konversion einer realen
Zahl
-
e32.descriptors.TDes.real-number-conversion
-
-
Beschreibung
-
Diese Funktion dient zum Umwandeln
der Gleitkommazahl aVal in eine Zeichendarstellung und zum Setzen
der resultierenden Zeichen in den Datenbereich dieses Deskriptors,
wobei eventuell vorhandener Inhalt ersetzt wird.
-
Das Format der Zeichendarstellung
wird durch aFormat diktiert, ein Objekt des Typs TRealFormat. Weitere
Informationen über
die TReal Format Klasse siehe e32.class.TRealFormat).
-
-
Formatieren
-
e32.descriptors.TDes.formatting
-
-
Beschreibung
-
Diese Funktion dient zum Einfügen von
formatiertem Text in diesen Deskriptor gemäß Steuerung durch den Formatstring,
der im Deskriptor aFmt gegeben wird, und der darauf folgenden Argumentliste.
Eventueller existierender Inhalt in diesem Deskriptor wird verworfen.
-
Der in aFmt enthaltene Formatstring
enthält
Literaltext, der mit Befehlen zum Umwandeln der hinteren Liste von
Argumenten in Text eingebettet ist.
-
Die eingebetteten Befehle sind Zeichenfolgen,
vor denen das Zeichen '%' steht. Der Literaltext
wird einfach unverändert
in diesen Deskriptor kopiert, während
die '%' Befehle zum Umwandeln
nachfolgender Argumente verwendet werden (die auf aFmt in der Argumentliste
folgen).
-
Der resultierende Strom von Literaltext
und konvertierten Argumenten wird in diesen Deskriptor eingefügt.
-
Die Syntax der eingebetteten Befehle
folgt einem der vier nachfolgend gezeigten allgemeinen Muster. Jedes
in Klammern stehende Element gibt ein Zeichen oder eine Folge von
Zeichen mit einer spezifischen Bedeutung an.
-
Ein in eckigen Klammern stehendes
Element ist fakultativ.
-
- – %<type> Dabei ist <type> ein Zeichencode, der
angibt, wie Daten konvertiert werden sollen. Die Daten werden ohne
Auffüllen
konvertiert und belegen lediglich den benötigten Raum.
- – %<width>[<prec>]<type> Dabei ist <type> ein Zeichencode, der
angibt, wie Daten konvertiert werden sollen, und <width> enthält entweder
numerische Zeichen, die die Größe des von
den konvertierten Daten zu belegenden Feldes direkt definieren,
oder ein'*' Zeichen. Ein'*' gibt an, dass
die Größe des Feldes
vom nächsten TUint
Wert in der Argumentliste genommen wurde.
<prec> ist
fakultativ und nur dann relevant, wenn eine reale Zahl konvertiert
werden soll. Falls vorgegeben, muss <prec> ein '.' Zeichen sein, gefolgt von einer ganzen
Zahl, die die Präzision
der realen Zahl repräsentiert (d.
h. die Zahl von Dezimalstellen). Wenn <prec> weggelassen
wird, dann ist die Präzision
für die
Umwandlung einer realen Zahl vorgabemäßig KDefaultPreCision. Die
konvertierten Daten werden in dem Feld rechts ausgerichtet; wenn
weniger Zeichenpositionen eingenommen werden als in <width> vorgegeben, dann wird
nach links mit Leerzeichen aufgefüllt.
Wenn mehr als <width> Zeichen durch die
Umwandlung entstehen, dann ist das Ergebnis vom Wert von <type> abhängig. Wenn <type> entweder e, E, f,
oder F ist (die Quelldaten sind eine reale Zahl), dann wird der Wert
von <width> ignoriert und alle
erzeugten Zeichen werden akzeptiert; die Höchstzahl der erzeugten Zeichen
kann jedoch niemals KMaXRealWidth überschreiten.
Wenn <type> entweder g oder G
ist (die Quelldaten sind eine reale Zahl), dann wird der Wert von <width> ignoriert und alle
erzeugten Zeichen werden akzeptiert; die Höchstzahl der erzeugten Zeichen
kann jedoch niemals KDefaultRelWidth überschreiten.
Wenn die
Quelldaten von einem anderen Typ sind, dann werden die konvertierten
Daten verkürzt,
so dass nur <width> Zeichen genommen werden.
- – %0<width>[<prec>]<type> Dabei ist <type> ein Zeichencode, der
angibt, wie Daten konvertiert werden sollen, und <width> enthält numerische
Zeichen, die die Größe des Feldes
direkt definieren, das von den konvertierten Daten eingenommen werden
soll. Die konvertierten Daten werden in diesem Feld rechts ausgerichtet; wenn
sie weniger Zeichenpositionen einnehmen als in <width> vorgegeben
ist, dann wird nach links mit '0' Zeichen aufgefüllt.
Wenn
mehr als <width> Zeichen durch die
Umwandlung erzeugt werden sollen, dann ist das Ergebnis vom Wert
von <type> abhängig. Wenn <type> entweder e, E, f oder
F ist (die Quelldaten sind eine reale Zahl), dann wird der Wert
von <width> ignoriert und alle
erzeugten Zeichen werden akzeptiert; die Höchstzahl der erzeugten Zeichen
kann jedoch niemals KMaxRealWidth überschreiten.
Wenn <type> entweder g oder G
ist (die Quelldaten sind eine reale Zahl), dann wird der Wert von <width> ignoriert und alle
erzeugten Zeichen werden akzeptiert; die Höchstzahl der erzeugten Zeichen
kann jedoch niemals KDefaultRealWidth überschreiten.
Wenn die
Quelldaten von einem anderen Typ sind, dann werden die konvertierten
Daten verkürzt,
so dass nur <Width> Zeichen genommen werden. <prec> ist fakultativ und
nur dann relevant, wenn eine reale Zahl konvertiert werden soll.
Falls vorgegeben, muss <prec> ein '.' Zeichen sein, gefolgt von einer ganzen
Zahl, die die Präzision
der realen Zahl darstellt (d. h. die Anzahl der Dezimalstellen).
Wenn <prec> weggelassen wird,
dann geht die Präzision
für die
Konversion einer realen Zahl vorgabemäßig auf kDefaultPrecision.
(Hinweis:
in diesem spezifischen Fall kann <width> kein einzelnes '*' Zeichen sein.
Wenn es notwendig ist, den Breitenwert aus der Argumentliste zu
nehmen, dass muss das allgemeinere Muster %<a><p><width><type> genommen werden).
- – %<a><p><width>[<prec>]<type> Dabei ist <type> ein Zeichencode, der
angibt, wie Daten konvertiert werden sollen, und <width> enthält entweder
numerische Zeichen, die direkt die Größe des Feldes definieren, das
von den konvertierten Daten eingenommen werden soll, oder ein '*' Zeichen. Ein '*' bedeutet,
dass die Größe des Feldes
vom nächsten
TUi nt Wert in der Argumentliste genommen wird.
<prec> ist fakultativ und
nur dann relevant, wenn eine reale Zahl konvertiert werden soll.
Falls vorgegeben, muss <prec> ein '.' Zeichen sein, gefolgt von einer ganzen
Zahl, die die Präzision
der realen Zahl repräsentiert (d.
h. die Anzahl der Dezimalstellen). Wenn <prec> weggelassen
wird, dann geht die Präzision
für die
Umwandlung einer realen Zahl vorgabemäßig auf kDefaultPrecision. Die
konvertierten Daten werden in diesem Feld gemäß Definition durch den Wert
von <a> wie folgt ausgerichtet:
+
rechts ausgerichtet
– links
ausgerichtet
= mittig ausgerichtet
Wenn die konvertierten
Daten weniger Zeichenpositionen einnehmen als in <width> vorgegeben, dann wird mit
dem durch <p>. definierten Auffüllzeichen
aufgefüllt.
Man
beachte, dass ein Auffüllzeichen
von '*' ein Sonderfall ist.
Er gibt an, dass der Code-Wert des Auffüllzeichens vom nächsten TUint
Wert in der Argumentenliste genommen wird. Die Daten für die Umwandlung
werden vom folgenden Argument genommen. So muss zum Auffüllen mit
Sternchen der Code-Wert für
das Sternchenzeichen durch die Argumentliste geliefert werden. Wenn
mehr als <width> Zeichen durch die
Umwandlung erzeugt werden, dann hängt das Ergebnis vom Wert von <type> ab.
Wenn <type> entweder e, E, f oder
F ist (die Quelldaten sind eine reale Zahl), dann wird der Wert.
von <width> ignoriert und alle
erzeugten Zeichen werden akzeptiert; die Höchstzahl der erzeugten Zeichen
kann jedoch niemals KMaxRedlWdth überschreiten.
Wenn <type> entweder g or G ist
(die Quelldaten sind eine reale Zahl), dann wird der Wert von <width> ignoriert und alle
erzeugten Zeichen werden akzeptiert; die Höchstzahl der erzeugten Zeichen
kann jedoch niemals KDefaultRedlWidth überschreiten. Wenn die Quelldaten
von einem beliebigen anderen Typ sind, dann werden die konvertierten
Daten verkürzt,
so dass nur <width> Zeichen genommen werden.
-
Die Umwandlung von Argumentendaten
wird durch den Wert von <type> diktiert, der aus
einem einzelnen Zeichen besteht. Bitte auf die Schreibweise des
Zeichens achten, da sie signifikant ist.
-
Die möglichen Werte für <type> lauten wie folgt:
-
- b Interpretieren des Arguments als TUi nt und
Umwandeln in seine binäre
Zeichendarstellung. Dies kann in Großbuchstaben oder Kleinbuchstaben
sein.
- o Interpretieren des Arguments als TUi nt und Umwandeln in seine
oktale Zeichendarstellung. Dies kann entweder in Großbuchstaben
oder Kleinbuchstaben sein.
- d Interpretieren des Arguments als TInt und Umwandeln in seine
Dezimaldarstellung mit Vorzeichen. Dies kann in Großbuchstaben
oder Kleinbuchstaben sein. Wenn der Wert negativ ist, dann steht
vor der Darstellung ein Minuszeichen.
- e Interpretieren des Arguments als TReal und Umwandeln in die
Exponentenformatdarstellung (siehe e32.class.TReaIFormat und e32.enum.TreaiFormatType).
(Auf Kleinbuchstaben achten)
- E Interpretieren des Arguments als TReal96 und Umwandeln in
die Exponentenformatdarstellung (siehe e32.class.TrealFormat und
e32.enum.TReaIFormatType). (Großbuchstaben
beachten)
- f Interpretieren des Arguments als TReal und Umwandeln in eine
Festformatdarstellung (siehe e32.class.TRealFormat und e32.enum.TRealFormatType).
(Kleinbuchstaben beachten)
- F Interpretieren des Arguments als TReal96 und Umwandeln in
eine Festformatdarstellung (siehe e32.ciass.TRealFormat und e32.enum.TRealFormatType).
(Großbuchstaben
beachten)
- g Interpretieren des Arguments als TReal und Umwandeln in eine
Fest- oder Exponentenformatdarstellung, je nach dem Format, das
die größere Zahl
von signifikanten Stellen darstellen kann (siehe e32.ciass.TRealFormat
und e32.enum.TRealFormatType). (Kleinbuchstaben beachten)
- G Interpretieren des Arguments als TReal96 und Umwandeln in
eine Fest- oder Exponentenformatdarstellung, je nachdem, welches
Format die größere Zahl
von signifikanten Stellen darstellen kann (siehe e32.class.TRealFormat
und e32.enum.TRealFormatType). (Großbuchstaben beachten)
- u Interpretieren des Arguments als TUint und Umwandeln in seine
Dezimaldarstellung ohne Vorzeichen. Dies kann in Großbuchstaben
oder in Kleinbuchstaben sein.
- x Interpretieren des Arguments als TUint und Umwandeln in seine
Hexadezimaldarstellung. Dies kann entweder in Groß- oder
in Kleinbuchstaben sein.
- p Erzeugen der benötigten
Anzahl von Auffüllzeichen.
Es wird auf keine Argumente zugegriffen. Dies kann entweder in Groß- oder
in Kleinbuchstaben sein.
- c Interpretieren des Arguments als TUi nt Wert und Umwandeln
in einen einzelnen ASCII-Zeichenwert. Dies kann entweder in Groß- oder
in Kleinbuchstaben sein.
- s Interpretieren des Arguments als null-terminierter String.
Kopieren der Zeichen von dem String, aber ohne Null-Terminator.
(Kleinbuchstaben beachten)
- S Interpretieren des Arguments als Adresse eines Deskriptors
und Kopieren der Zeichen davon. (Großbuchstaben beachten)
- w Interpretieren des Arguments als TUi nt und Umwandeln des
Wertes in eine binäre
numerische Zweibyte-Darstellung mit dem kleinstwertigen Byte zuerst.
Der erzeugte Ausgang ist zwei Byte, unabhängig davon, ob dieser Deskriptor
eine 8-Bit- oder eine 16-Bit-Variante ist. (Kleinbuchstaben breachten)
- W Interpretieren des Arguments als TUi nt und Umwandeln des
Wertes in eine binäre
numerische Vierbyte-Darstellung mit dem kleinstwertigen Byte zuerst.
Der erzeugte Ausgang ist vier Byte, unabhängig davon, ob dieser Deskriptor
eine 8-Bit- oder eine 16-Bit-Variante ist. (Großbuchstaben beachten)
- m Interpretieren des Arguments als TUint und Umwandeln des Wertes
in eine binäre
numerische Zweibyte-Darstellung mit dem höchstwertigen Byte zuerst. Der
erzeugte Ausgang ist zwei Bytes, unabhängig davon, ob dieser Deskriptor
eine 8-Bit- oder eine 16-Bit-Variante ist. (Kleinbuchstaben beachten)
- M Interpretieren des Arguments als TUi nt und Umwandeln des
Wertes in eine binäre
numerische Vierbyte-Darstellung mit dem höchstwertigen Byte zuerst. Der
erzeugte Ausgang ist vier Bytes, unabhängig davon, ob dieser Deskriptor
eine 8-Bit- oder eine 16-Bit-Variante ist. (Großbuchstaben beachten)
-
-
Hinweise
-
Zwei aufeinander folgende '%' Zeichen werden als Literaltext interpretiert
und haben zur Folge, dass ein '%' Zeichen erzeugt
wird.
-
Leerzeichen werden als Literaltext
interpretiert.
-
Die Vorgabe eines Auffüllzeichens
von '*' ist ein Sonderfall.
Er bedeutet, dass der Code-Wert
des Auffüllzeichens
als der nächste
TUi nt Wert aus der Argumentliste genommen wird. Eventuelle für die Umwandlung
benötigte
Daten werden aus dem folgenden Argument genommen.
-
Somit muss zum Verwenden von Sternchen
als Auffüllzeichen
der Code-Wert des Sternchenzeichens in der Argumentliste gegeben
werden.
-
Die Verwendung eines '*' Zeichens für <width> und <p> bedeutet, dass der
Breitenwert und das Auffüllzeichen
aus der Argumentliste genommen werden. Man beachte, dass das erste '*' Zeichen so interpretiert wird, dass
es die Breite nur dann repräsentiert,
wenn davor eines der Ausrichtungszeichen '+' '-' oder '=' steht (d.
h. wenn der Befehl dem vierten oben dargestellten allgemeinen Muster
folgt).
-
Die Vorgabe des Befehls %p führt dazu,
dass keine Zeichen erzeugt werden. Um nützlich zu sein, muss eine Breite
vorgegeben werden; z. B. '%1
p' oder '%6p'.
-
Wenn <prec> vorgegeben
wird, wenn die zu konvertierenden Daten keine reale Zahl sind, dann
wird es ignoriert.
-
Wenn ein Befehl eine falsche Syntax
hat, dann tritt in der Funktion Panik mit ETDes8BadFoTmatDescriptor
für die
8-Bit-Variante oder ETDes16BadFormdtDescriptor für die 16-Bit-Variante auf.
-
Wenn die resultierende Textlänge in diesem
Deskriptor die Maximallänge überschreitet,
dann tritt in der Funktion Panik mit ETDes8Overflow für die 8-Bit-Variante
oder ETDes16Overflow für
die 16-Bit-Variante auf.
-
Beispiel
-
Die folgenden Code-Fragmente illustrieren
die verschiedenen Möglichkeiten
von Format().
-
-
-
-
-
-
-
Anhängen
-
-
Hinweise
-
Die Länge dieses Deskriptors muss
geringer sein als seine Maximallänge.
Wenn der Deskriptor bereits an seiner Maximallänge ist, dann verursacht jeder
Versuch, ein weiteres Zeichen anzuhängen, in der Funktion Panik
mit ETDes8Overflow für
die 8-Bit-Variante oder ETDes16Overflow für die 16-Bit-Variante.
-
Append() Anhängen eines beliebigen Deskriptors
void Append(const TDesC& aDes);
-
Beschreibung
-
Diese Funktion dient zum Anhängen des
Inhalts von aDes an das Ende des Inhalts dieses Deskriptors.
-
Die Länge dieses Deskriptors wird
um die Länge
von aDes inkrementiert.
-
Es gibt eine zusätzliche überladene Variation von Append(),
so dass, wenn dieser Deskriptor die 8-Bit-Variante ist, Append()
die 16-Bit-Variante von aDes sowie die erwartete 8-Bit-Variante
nehmen kann.
-
Somit gilt:
-
- – ein
8-Bit-Deskriptor kann an einen 8-Bit-Deskriptor angehängt werden
- – ein
16-Bit-Deskriptor kann an einen 16-Bit-Deskriptor angehängt werden
- – ein
16-Bit-Deskriptor kann an einen 8-Bit-Deskriptor angehängt werden
-
In dem Fall, in dem ein 16-Bit-Deskriptor
an einen 8-Bit-Deskriptor angehängt
wird, wird jedes Doppelbyte als Einzelbyte angehängt, wo der Wert des Doppelbytes
kleiner ist als dezimal 256. Ein Doppelbyte-Wert von dezimal 256
oder größer kann
nicht als einzelner Bytewert angehängt werden, und in diesem Fall
wird das einzelne Byte auf einen Wert von dezimal 1 gesetzt.
-
-
Hinweise
-
Die resultierende Länge dieses
Deskriptors darf nicht größer sein
als seine Maximallänge,
sonst tritt in der Funktion Panik mit ETDes8Overflow für die 8-Bit-Variante
oder ETDes16Overflow für
die 16-Bit-Variante auf.
-
-
Beschreibung
-
Diese Funktion dient zum Anhängen von
Daten mit Länge
aLength an der Adresse aBuf an das Ende des Inhalts dieses Deskriptors.
-
Die Länge dieses Deskriptors wird
um den Wert von aLength inkrementiert.
-
-
Hinweise
-
Die resultierende Länge dieses
Deskriptors darf nicht größer sein
als seine Maximallänge,
sonst tritt in der Funktion Panik mit ETDes8Overflow für die 8-Bit-Variante
oder ETDes16Overflow für
die 16-Bit-Variante auf.
-
Der Wert von aLength muss nicht-negativ
sein, da sonst die Ergebnisse unvorhersehbar sein können.
-
-
Beschreibung
-
Diese Funktion dient zum Hinzufügen von
aLength Zeichen aChatr an das Ende von existierenden Daten in diesem
Deskriptor.
-
-
Hinweise
-
Die resultierende Länge dieses
Deskriptors darf nicht größer sein
als sine Maximallänge,
da sonst in der Funktion Panik mit ETDes8Overflow für die 8-Bit-Variante
oder ETDes16Overflow für
die 16-Bit-Variante auftritt.
-
-
Beschreibung
-
Diese Funktion dient zum Kopieren
des Inhalts von aDes an das Ende des Inhalts dieses Deskriptors.
-
Der Zielbereich in diesem Deskriptor
wird als ein Bereich mit Breite aWi dth angesehen, der unmittelbar
auf die existierenden Daten folgt. Die Quelldaten werden in diesen
Zielbereich kopiert und darin gemäß dem Wert von anAlignment
ausgerichtet.
-
Wenn aWi dth den Wert KDefaultJustifyWidth
hat, dann wird die Breite des Zielbereiches (d. h. der Wert von
aWi dth) auf den Wert von aLength zurückgesetzt.
-
Wenn aLength kleiner ist als die
Breite des Zielbereichs, dann wird eventueller unbelegter Raum im Zielbereich
mit dem Füllzeichen
aFill aufgefüllt.
-
Wenn aLength größer ist als die Breite des
Zielbereichs, dann wird die Menge der von der Stelle astring kopierten
Daten auf den Wert von aWidth begrenzt.
-
-
Hinweise
-
Wenn die Breite des Zielbereichs
größer ist
als die Maximallänge
dieses Deskriptors, dann tritt in der Funktion Panik mit ETDes80verflow
für die
8-Bit-Variante oder ETDes16Overflow für die 16-Bit-Variante auf.
-
aWidth nicht auf einen negativen
Wert setzen (außer
KDefaultJustifyWidth), da dies unvorhersehbare Folgen haben kann.
-
Beispiel
-
Die folgenden Code-Fragmente illustrieren
die Verwendung von AppendJustify().
-
-
Der Deskriptor tgt hat eine Maximallänge von
16 und enthält
zunächst
den String "abc".
-
Nach dem Aufruf an AppendJustify() ändert sich
der Inhalt von tgt auf "abc@@xyz@@@", wie in 17 illustriert.
-
In diesem Beispiel wird der Inhalt
des Quelldeskriptors genommen, um ein 8-Zeichen-Feld zu bilden, das
an den Inhalt des Deskriptors tgt angehängt wird. Die Zeichen "xyz" werden in dem neuen
Feld zentriert und auf beiden Seiten mit dem Füllzeichen '@' aufgefüllt.
-
Durch Einstellen der Ausrichtung
auf ELeft würde
der Inhalt von tmp auf "abcxyz@@@@@" geändert, während eine
Einstellung der Ausrichtung auf ERi ght den Inhalt von tmp auf "abc@@@@@xyz" ändern würde.
-
In allen drei Fällen ändert sich die Länge des
Deskriptors tgt von 3 auf 11.
-
-
Dieser Aufruf an AppendJustity()
erzeugt Panik, weil die resultierende Länge von tgt die Maximallänge überschreiten
würde.
-
AppendJustify()Anhängen von
Teil eines beliebigen Deskriptors und Ausrichten
-
e32.descriptors.TDes.appending.appendjustify-partdesc
-
-
Beschreibung
-
Diese Funktion dient zum Anhängen von
Daten von Länge
aLength vom Deskriptor aDes an das Ende des Inhalts dieses Deskriptors.
-
Der Zielbereich im Datenbereich dieses
Deskriptors wird als ein Bereich mit Breite aWi dth angesehen, der
unmittelbar auf die existierenden Daten folgt. Die Quelldaten werden
in diesen Bereich kopiert und darin gemäß dem Wert von anAlignment
ausgerichtet.
-
Wenn aWidth den Wert KDefaultJustifyWidth
hat, dann wird die Breite des Zielbereichs (d. h. der Wert von aWidth)
auf den Wert von aLength zurückgesetzt.
Wenn aLength kleiner ist als die Breite des Zielbereichs, dann wird
eventueller unbelegter Raum im Zielbereich mit dem Füllzeichen
aFill aufgefüllt.
-
Wenn aLength größer als als die Breite des
Zielbereichs, dann wird die Menge an von aDes kopierten Daten auf
den Wert von aWidth begrenzt.
-
-
Hinweise
-
Wenn die Breite des Zielbereichs
größer ist
als die maximale Länge
dieses Deskriptors, dann tritt in der Funktion Panik mit ETDes8Overflow
für die
8-Bit-Variante oder ETDes16Overflow für die 16-Bit-Variante auf.
-
aWidth nicht auf einen negativen
Wert setzen (außer
KDefaultJustifyWidth), da dies unvorhersehbare Folgen haben kann.
-
aLength nicht auf einen negativen
Wert setzen, da dies unvorhersehbare Folgen haben kann.
-
Darauf achten, dass der Wert von
aLength nicht größer ist
als die Länge
von aDes, da sonst unerwartete Daten kopiert werden können.
-
Beispiel
-
Die folgenden Code-Fragmente illustrieren
die Verwendung von AppendJustify().
-
-
Der Deskriptor tgt hat eine Maximallänge von
16 und enthält
zunächst
den String "abc". Nach dem Aufruf
an AppendJustify() ändert
sich der Inhalt von tgt auf "abc@@xyz@@@", wie in 18 illustriert.
-
In diesem Beispiel werden die ersten
drei Zeichen von _L"xyz0123456789" genommen, um ein
8-Zeichen-Feld zu bilden, das an den existierenden Inhalt des Deskriptors
tgt angehängt
wird. Die Zeichen "xyz" werden im neuen
Feld zentriert und auf beiden Seiten mit dem Füllzeichen '@' aufgefüllt.
-
Eine Einstellung der Ausrichtung
auf ELeft würde
den Inhalt von tgt auf "abcxyz@@@@@" ändern, während eine Einstellung der
Ausrichtung auf ERi ght den Inhalt von tgt auf "abc@@@@@xyz" ändern
würde.
-
In allen drei Fällen ändert sich die Länge des
Deskriptors tgt von 3 auf 11.
-
-
In diesem Beispiel ändert der
Aufruf an AppendJustify() den Inhalt von tgt auf "abc01234567". Da die vorgegebene
Länge größer ist
als die vorgegebene Breite, wird die Länge verkürzt, so dass nur acht Zeichen vom
Quelldeskriptor kopiert werden.
-
-
Dieser Aufruf an AppendJustify()
erzeugt Panik, weil die resultierende Länge von tgt die maximale Länge überschreiten
würde.
-
-
Beschreibung
-
Diese Funktion dient zum Anhängen von
Daten mit Länge
aLength von der Adresse aString an das Ende des Inhalts dieses Deskriptors.
-
Der Zielbereich im Datenbereich dieses
Deskriptors wird als ein Bereich mit Breite aWi dth angesehen, der
unmittelbar auf die existierenden Daten folgt. Die Quelldaten werden
in diesen Zielbereich kopiert und gemäß dem Wert von anAlignment
ausgerichtet.
-
Wenn aWi dth den Wert KDefaultJustifyWidth
hat, dann wird die Breite des Zielbereiches (d. h. der Wert von
aWidth) auf den Wert von aLength zurückgesetzt. Wenn aLength kleiner
ist als die Breite des Zielbereichs, dann wird eventueller unbelegter
Raum im Zielbereich mit dem Füllzeichen
aFill aufgefüllt.
-
Wenn aLength größer ist als die Breite des
Zielbereichs, dann wird die Menge an von der Stelle aString kopierten
Daten auf den Wert von aWi dth begrenzt.
-
-
Hinweise
-
Wenn die Breite des Zielbereiches
größer ist
als die Maximallänge
dieses Deskriptors, dann tritt in der Funktion Panik mit ETDes8Overflow
für die
8-Bit-Variante oder ETDes16Overflow für die 16-Bit-Variante auf.
-
aWidth nicht auf einen negativen
Wert setzen (außer
KDefaultJustifyWidth), da dies unvorhersehbare Folgen haben kann.
-
aLength nicht auf einen negativen
Wert setzen, da dies unvorhersehbare Folgen haben kann.
-
-
Beschreibung
-
Diese Funktion dient zum Anhängen des
null-terminierten Strings, der sich bei aStri ng befindet, an das
Ende des Inhalts dieses Deskriptors. Der Null-Terminator wird nicht
kopiert.
-
Der Zielbereich im Datenbereich dieses
Deskriptors wird als ein Bereich mit Breite aWi dth angesehen, der
unmittelbar auf die existierenden Daten folgt. Der null-terminierte
String wird in diesen Zielbereich kopiert und gemäß dem Wert
von anAlignment ausgerichtet.
-
Wenn aWi dth den Wert KDefaultJustifyWidth
hat, dann wird die Breite des Zielbereichs (d. h. der Wert von aWi
dth) auf die Länge
des null-terminierten Strings zurückgesetzt, ausschließlich des
Null-Terminators.
-
Wenn die Länge des null-terminierten Strings
(ausschließlich
Null-Terminator) kleiner ist als die Breite des Zielbereichs, dann
wird eventueller unbelegter Raum im Zielbereich mit dem Füllzeichen
aFi 11 aufgefüllt.
-
Wenn die Länge des null-terminierten Strings
(ausschließlich
Null-Terminator) größer ist
als die Breite des Zielbereichs, dann wird die Zahl der von aStri
ng kopierten Zeichen auf den Wert von aWi dth begrenzt.
-
Argumente
-
-
-
Hinweise
-
Wenn die Breite des Zielbereiches
größer ist
als die Maximallänge
dieses Deskriptors, dann tritt in der Funktion Panik mit ETDes8Overflow
für die
8-Bit-Variante oder ETDes16Overflow für die 16-Bit-Variante auf.
-
aWidth nicht auf einen negativen
Wert setzen (außer
KDefaultJustifyWidth), da dies unvorhersehbare Folgen haben kann.
-
-
Beschreibung
-
Diese Funktion dient zum Umwandeln
der ganzen Zahl. aVal mit Vorzeichen in eine Dezimalzeichendarstellung
und zum Anhängen
der resultierenden Zeichen an das Ende des Inhalts dieses Deskriptors.
Wenn die ganze Zahl negativ ist, dann steht vor der Zeichendarstellung
ein Minuszeichen.
-
Argumente
-
-
Beispiel
-
Das folgende Code-Fragment illustriert
die Verwendung von AppendNum().
-
-
-
e32.descriptors.TDes.appending.Appendnumusi
-
-
Beschreibung
-
Diese Funktionen dienen zum Umwandeln
der ganzen Zahl aVal ohne Vorzeichen in ihre entsprechende Zeichendarstellung
und zum Anhängen
der resultierenden Zeichen an das Ende des Inhalts dieses Deskriptors.
-
AppendNum() konvertiert die hexadezimalen
Zeichen 'a' 'b' 'c' 'd' 'e' und 'f' in Kleinbuchstaben.
-
AppendNumUC() konvertiert die hexadezimalen
Zeichen 'A' 'B' 'C' 'D' 'E' und 'F' in Großbuchstaben.
-
Argumente
-
-
-
Beispiel
-
Das folgende Code-Fragment illustriert
die Verwendung von AppendNum() und AppendNumUC():
-
Beschreibung
-
Diese Funktion dient zum Anhängen von
formatiertem Text in diesen Deskriptor gemäß Steuerung durch den Formatstring
im Deskriptor aFmt und der darauf folgenden Argumentliste. Der erzeugte
Text wird an eventuell existierende Daten in diesem Deskriptor angehängt.
-
Der in aFmt enthaltene Formatstring
enthält
Literaltext, der mit Befehlen zum Umwandeln der hinteren Liste von
Argumenten in Text eingebettet ist.
-
Zur Syntax der eingebetteten Befehle
wird auf die Memberfunktion e32.descriptors.format verwiesen.
-
Die resultierende Länge dieses
Deskriptors darf die Maximallänge
nicht überschreiten.
Wenn der Deskriptor seine Maximallänge erreicht, dann führt jeder
Versuch, mehr Text anzuhängen,
zu einem der Folgenden:
-
- – wenn
aOverflowHandler nicht geliefert wird, dann tritt in der Funktion
Panik mit ETDes8Overflow für
die 8-Bit-Variante oder ETDes16Overflow für die 16-Bit-Variante auf;
- – wenn
aOverflowHandler geliefert wird, dann wird die Memberfunktion Overflow()
von entweder TDes8Overflow für
die 8-Bit-Variante oder TDes16Overflow für die 16-Bit-Variante zur Handhabung
des Zustands aufgerufen; bei der Rückkehr von Overflow() wird
AppendFormat() ohne Panik beendet.
-
-
-
Beschreibung
-
Diese Funktion ist äquivalent
mit AppendFoTmat().
-
-
-
Beschreibung
-
Diese Funktion dient zum Konvertieren
der Gleitkommazahl aVal in eine Zeichendarstellung und zum Anhängen der
resultierenden Zeichen an das Ende des Inhalts dieses Deskriptors.
-
Das Format der Zeichendarstellung
wird durch aFormat diktiert, ein Objekt des Typs TReal Format (weitere
Informationen über
die TReal Format Klasse siehe e32.class.TRealFormat).
-
-
-
Null-Terminator hinzufügen
-
e32.descriptors.TDes.zero-terminator
-
-
Beschreibung
-
Diese Funktion dient zum Anhängen eines
Null-Terminators (d. h. eine NULL) an das Ende des Inhalts dieses
Deskriptors.
-
Die Länge des Deskriptors wird nicht
geändert.
-
Hinweise
-
Die Länge des Deskriptors muss strikt
geringer sein als die Maximallänge,
da sonst in der Funktion Panik mit ETDes8Overflow für die 8-Bit-Variante
oder ETDes16Overflow für
die 16-Bit-Variante auftritt. Dieser Zustand garantiert, dass genügend Raum
im Datenbereich des Deskriptors für den Null-Terminator vorhanden ist.
-
Beispiel
-
Das folgende in
19 dargestellte Code-Fragment illustriert
die Verwendung von ZeroTerminate():
-
Die Länge des Deskriptors tgt ist
5 vor und hinter dem Aufruf an ZeroTeiminate()
-
Beschreibung
-
Diese Funktion dient zum Anhängen eines
Null-Terminators (d. h. eine NULL) an das Ende des Inhalts dieses
Deskriptors und zum Zurückgeben
eines Zeigers zum Datenbereich des Deskriptors.
-
Die Länge des Deskriptors wird nicht
verändert.
-
Wenn der Datenbereich nur Textzeichen
enthält,
dann entsteht durch Hinzufügen
eines Null-Terminators ein 'C'-artiger null-terminierter
String.
-
-
Hinweise
-
Die Länge des Deskriptors muss strikt
geringer sein als seine Maximallänge,
sonst tritt in der Funktion Panik mit ETDes8Overflow für die 8-Bit-Variante
oder ETDes16Overflow für
die 16-Bit-Variante auf. Dieser Zustand garantiert, dass genügend Raum
im Datenbereich des Deskriptors für den Null-Terminator vorhanden ist.
Auf den null-terminierten String kann durch den zurückgegebenen
Zeiger zugegriffen werden, aber er kann nicht verändert werden.
-
Indexieroperatoren
-
e32.descriptors.TDes.indexing-operators
-
-
Beschreibung
-
Diese Operatoren dienen zum Zurückgeben
einer Referenz auf ein einzelnes Datenelement in diesem Deskriptor
(z. B. ein Textzeichen). Die Daten können als eine Array von ASCIIoder
UNICODE-Zeichen oder als eine Array von Bytes (oder Doppelbytes,
wird aber nicht empfohlen) von binären Daten angesehen werden.
-
Diese Operatoren erlauben den Zugriff
auf und die Veränderung
von individuelle(n) Elemente(n) der Array.
-
Es werden zwei Varianten des Operators
geliefert, so dass er bei Anwendung auf ein nonconst-Argument einen
lvalue oder bei Anwendung auf ein const-Argument einen rvalue zurückgeben
kann. Die Entscheidung darüber,
welche Variante verwendet wird, wird vom Compiler getroffen.
-
-
-
Beispiel
-
Die Code-Fragmente illustrieren die
Verwendung von operator[]
-
Anhängen von Operatoren
-
e32.descriptors.TDes.appending-operators
-
-
Beschreibung
-
Dieser Operator dient zum Anhängen des
Inhalts von aDes an das Ende des Inhalts dieses Deskriptors.
-
Die Länge dieses Deskriptors wird
durch die Länge
von aDes inkrementiert.
-
-
Hinweise
-
Der Operator kann nur von Klassen
verwendet werden, die von TDes abgeleitet sind, insbesondere TPtr
und TBuf.
-
Die resultierende Länge dieses
Deskriptors darf nicht größer sein
als seine Maximallänge,
da sonst in der Operation Panik mit ETDes8Overflow für die 8-Bit-Variante
oder ETDes16Overflow für
die 16-Bit-Variante auftritt.
-
Beispiel
-
Das folgende Code-Fragment illustriert
die Verwendung dieses Operators.
-
-
Nicht klassenspezifische
Zuweisungsoperatoren
-
e32.descriptors.TDes.assignment-operators
-
Das Verhalten dieser Operatoren ist
genau wie das der klassenspezifischen Operatoren. Im Gegensatz zu
den klassenspezifischen Operatoren sind diese nicht klassenspezifischen
Operators jedoch nicht inline.
-
Der Compiler ruft diese nicht klassenspezifischen
Zuweisungsoperatoren immer dann auf, wenn die linke Variable einer
Zuweisungsoperation nicht von einem konkreten Typ ist, d. h. TPtr,
TBufC<class S>, TBuf<class S> oder HBufC.
-
-
Wenn die Memberfunktion MyCopy geändert wird,
so dass sie wie folgt prototypisiert wird:
oder sogar:
dann würde der
Klassenzuweisungsoperator TBuf<class
S> vom Compiler verwendet.
Eine solche Änderung würde jedoch
das Design der Klasse TMyclass. kompromittieren.
-
-
Beschreibung
-
Dieser Zuweisungsoperator kopiert
den Inhalt eines beliebigen Deskriptortyps aDes in diesen Deskriptor.
-
Der Inhalt von aDeS wird in diesen
Deskriptor kopiert, wobei der existierende Inhalt ersetzt wird.
Die Länge
dieses Deskriptors wird auf die Länge von aDes gesetzt.
-
-
Hinweise
-
Dieser Zuweisungsoperator gibt eine
Referenz auf Typ TDes zurück,
d. h. die Grundabstraktklasse für modifizierbare
Deskriptoren.
-
Die Länge von aDes darf nicht größer sein
als die Maximallänge
dieses Deskriptors, sonst tritt in der Operation Panik mit ETDes8Overflow
für die
8-Bit-Variante oder ETDes16Overflow für die 16-Bit-Variante auf.
-
-
Beschreibung
-
Dieser Zuweisungsoperator kopiert
den Inhalt eines modifizierbaren Deskriptors aDes in diesen Deskriptor.
-
Der Inhalt von aDes wird in diesen
Deskriptor kopiert, wobei der existierende Inhalt ersetzt wird.
Die Länge
dieses Deskriptors wird auf die Länge von aDes gesetzt.
-
-
Rückgabewert
-
TDes& Eine Referenz auf diesen Deskriptor.
-
Hinweise
-
Dieser Zuweisungsoperator gibt eine
Referenz auf Typ TDes zurück,
d. h. die Grundabstraktklasse für modifizierbare
Deskriptoren.
-
Die Länge von aDes darf nicht größer sein
als die Maximallänge
dieses Deskriptors, sonst tritt in der Operation Panik mit ETDes8Overflow
für die
8-Bit-Variante oder ETDes16Overflow für die 16-Bit-Variante auf.
-
-
Beschreibung
-
Dieser Zuweisungsoperator kopiert
einen null-terminierten String, ausschließlich des Null-Terminators, in diesen
Deskriptor.
-
Der kopierte String ersetzt den existierenden
Inhalt dieses Deskriptors.
-
Die Länge dieses Deskriptors wird
auf die Länge
des Strings gesetzt (ausschließlich
des Null-Terminators).
-
-
Hinweise
-
Dieser Zuweisungsoperator gibt eine
Referenz auf Typ TDes zurück,
d. h. die Grundabstraktklasse für modifizierbare
Deskriptoren.
-
Die Länge von aDes darf nicht größer sein
als die Maximallänge
dieses Deskriptors, sonst tritt in der Operation Panik mit ETDes8OVerflow
für die
8-Bit-Variante oder ETDes16Overflow für die 16-Bit-Variante auf.
-
TDes8Overflow Klasse Overflow-Handlex
(8 Bit)
-
Überblick
-
-
Beschreibung
-
Ein von TDes8Overflow abgeleitetes
Objekt wird von den Memberfunktionen AppendFormat() und AppendFormatList()
von 8-Bit-Varianten-Deskriptoren zum Handhaben von Deskriptor-Overflow
verwendet.
-
Zu Overflow kommt es dann, wenn versucht
wird, Text an den Deskriptor anzuhängen, wenn der Deskriptor bereits
auf seiner Maximallänge
ist.
-
Die Klasse ist abstrakt und definiert
die reine virtuelle Memberfunktion Overflow(). Siehe e32.descriptors.TDes.appending.AppendFormat und e32.descriptors.TDes.appending.AppendFormatList.
-
Schreiben von abgeleiteten
Klassen
-
Eine abgeleitete Klasse muss eine
Implementation für
die Memberfunktion Ovetrflow() bereitstellen.
-
Overflow-Handling
-
-
Beschreibung
-
Eine reine virtuelle Funktion.
-
Die Funktion wird von den Memberfunktionen
AppendFormat() und AppendFormatList() eines 8-Bit-Varianten-Deskriptors
aufgerufen, wenn versucht wird, Text an diesen Deskriptor anzuhängen, wenn
der Deskriptor bereits auf seiner Maximallänge ist.
-
Eine abgeleitete Klasse muss eine
Implementation für
diese Funktion bereitstellen.
-
-
TDes16Overflow Klasse Overflow-Handler
(16 Bit)
-
Überblick
-
Ableitung
-
TDes16Overflo Abstrakt: Overflow-Handler
der 16-Bit-Variante. w
-
Definiert in:
-
e32des16.h
-
Beschreibung
-
Ein von TDes16Overflow abgeleitetes
Objekt wird von den Memberfunktionen AppendFormat() und AppendFOrmatList()
von 16-Bit-Varianten-Deskriptoren zum Handhaben von Deskriptor-Overflow
verwendet.
-
Zu Overflow kommt es dann, wenn versucht
wird, Text an den Deskriptor anzuhängen, wenn der Deskriptor bereits
auf seiner Maximallänge
ist.
-
Die Klasse ist abstrakt und definiert
die reine virtuelle Memberfunktion Overflow(). Siehe e32.descriptors.TDes.appending.AppendFormat
und e32.descriptors.TDes.appending.AppendFormatList.
-
Schreiben von abgeleiteten
Klassen
-
Eine abgeleitete Klasse muss eine
Implementation für
die Memberfunktion Overflow() bereitstellen.
-
Overflow-Handling
-
-
Beschreibung
-
Eine reine virtuelle Funktion.
-
Die Funktion wird von den Memberfunktionen
AppendFormat() und AppendFormatList() eines 16-Bit-Varianten-Deskriptors
aufgerufen, wenn versucht wird, Text an diesen Deskriptor anzuhängen, wenn der
Deskriptor bereits auf seiner Maximallänge ist.
-
Eine abgeleitete Klasse muss eine
Implementation für
diese Funktion bereitstellen.
-
Argumente
-
-
-
Beschreibung
-
Eine Aufzählung, deren Enumeratoren die
Zahlensystemdarstellung von ganzen Zahlen mit und ohne Vorzeichen
beim Umwandeln in ein Zeichenformat diktieren.
-
Die Aufzählung wird von den Deskriptor-Memberfunktionen
verwendet.
-
-
Beschreibung
-
Eine Aufzählung, deren Enumeratoren die
Ausrichtung von Daten in einem Bereich bestimmen. Die Aufzählung wird
von den Deskriptor-Memberfunktionen
-
Beschreibung
-
-
Beschreibung
-
-
Hinweise
-
-
Beschreibung
-
-
Beschreibung
-
-
Beschreibung
-
-
Beschreibung
-
-
-
In ERA, ist 2-Byte-UNICODE-Unterstützung tief
in das System integriert.