DE69812285T2 - Objektorientiertes betriebssystem - Google Patents

Objektorientiertes betriebssystem Download PDF

Info

Publication number
DE69812285T2
DE69812285T2 DE69812285T DE69812285T DE69812285T2 DE 69812285 T2 DE69812285 T2 DE 69812285T2 DE 69812285 T DE69812285 T DE 69812285T DE 69812285 T DE69812285 T DE 69812285T DE 69812285 T2 DE69812285 T2 DE 69812285T2
Authority
DE
Germany
Prior art keywords
descriptor
length
data
class
string
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Lifetime
Application number
DE69812285T
Other languages
English (en)
Other versions
DE69812285D1 (de
Inventor
Simon Nicholas MYERS
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Nokia Oyj
Original Assignee
Symbian Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Symbian Ltd filed Critical Symbian Ltd
Application granted granted Critical
Publication of DE69812285D1 publication Critical patent/DE69812285D1/de
Publication of DE69812285T2 publication Critical patent/DE69812285T2/de
Anticipated expiration legal-status Critical
Expired - Lifetime legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4488Object-oriented

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
  • Vehicle Body Suspensions (AREA)
  • Mobile Radio Communication Systems (AREA)
  • Devices For Executing Special Programs (AREA)
  • Stored Programmes (AREA)
  • Eye Examination Apparatus (AREA)
  • Forklifts And Lifting Vehicles (AREA)
  • Executing Machine-Instructions (AREA)
  • Selective Calling Equipment (AREA)
  • Hardware Redundancy (AREA)
  • Advance Control (AREA)
  • Multi Processors (AREA)

Description

  • 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;
  • 1518 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.
  • Figure 00200001
  • 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:
    Figure 00200002

    einen String von Einzelbyte-Zeichen in einem ASCII-Aufbau, aber einen String von Doppelbyte-Zeichen in einem UNICODE-Aufbau.
    Figure 00200003

    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:
    • – Falten
    • – Mischen
  • 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:
    Figure 00310001
  • Ein TPtrC8 Deskriptor kann so konstruiert werden, dass er diesen vordefinierten Bereich repräsentiert, der den String "Hello World!" beinhaltet:
    Figure 00310002
  • 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:
    Figure 00320001

    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:
    Figure 00320002
  • Ein TPtrC16-Deskriptor kann so konstruiert werden, dass er diesen Bereich repräsentiert, der den String der Doppel-Byte-Zeichen "Hello World!" beinhaltet:
    Figure 00320003
  • 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:
    Figure 00320004

    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.:
    Figure 00320005
  • Der TPtrC Deskriptor:
    Figure 00320006

    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.
  • Figure 00330001
  • 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:
    Figure 00330002
  • 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.
  • Figure 00330003
  • 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:
    Figure 00340001
  • 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:
    Figure 00340002
  • 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
    Figure 00350001

    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:
    Figure 00350002
  • 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.:
    Figure 00350003
  • 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
    Figure 00350004

    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:
    Figure 00360001

    ändert die Daten von buf auf "Hello World!@", seine Länge auf 13, während:
    Figure 00360002

    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:
    Figure 00360003

    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:
    Figure 00360004

    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:
    Figure 00360005
  • Konstruieren eines modifizierbaren Pufferdeskriptors mit dem Vorgabekonstruktor:
    Figure 00370001
  • 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.
  • Figure 00370002
  • Text und allgemeine binäre Daten können frei gemischt werden, so dass:
    Figure 00370003

    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:
    Figure 00380001
  • Right() & Mid()
  • Diese Funktionen konstruieren einen TPtrC so, dass er einen Abschnitt der Daten des bufc repräsentiert:
    Figure 00380002

    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.
    Figure 00380003

    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).
  • Figure 00380004
  • In diesen Funktionen kann Panik auftreten. So verursacht beispielsweise die Anforderung von 13 rechten Datenelementen in bufc einen Ausnahmezustand (es gibt nur 12):
    Figure 00380005
  • 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:
    Figure 00390001
    Figure 00400001
  • 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:
    Figure 00400002
    Figure 00410001
  • 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:
    Figure 00410002
    Figure 00420001
  • 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.
  • Figure 00420002
  • Figure 00430001
  • 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:
    Figure 00430002
  • Swap()
  • Inhalt, Länge und Größe von altbuf1 und buf wurden vertauscht; die maximalen Längen der Deskriptoren verändern sich NICHT.
  • Figure 00440001
  • Repeat()
  • Die aktuelle Länge von buf ist auf 16 eingestellt. Eine Wiederholung des Kopierens der Zeichen "Hello" erzeugt die Textfolge "HelloHelloHelloH" in buf.
  • Figure 00440002
  • Einstellen der Länge von buf auf [sic] und Wiederholen der Wiederholung erzeugt die Textfolge "HelloHel".
  • Justify()
  • Das Beispiel verwendet src als Quelldeskriptor.
  • Figure 00440003
  • 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.
  • Figure 00440004
  • 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.
  • Figure 00440005
  • 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.
  • Figure 00450001
  • 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:
    Figure 00450002
  • 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:
    Figure 00450003
  • Damit mehr als 15 Zeichen oder Datenelemente in den HBufC zugewiesen werden können, muss die Zuordnung zuerst geändert werden. Zum Beispiel:
    Figure 00460001
  • So kann die folgende Zuweisung erfolgen, ohne eine Panik zu erzeugen:
    Figure 00460002

    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:
    Figure 00460003
  • Dies ändert die Daten im HBufC und die Länge des HBufC.
  • Klasse TPtrC Konstanter Zeigerdeskriptor
  • Übersicht
  • Figure 00460004
  • 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.:
    Figure 00470001
  • 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:
    Figure 00470002
    Figure 00480001
  • Konstruktion
  • e32.descriptors.TPtrC.construction
  • Figure 00480002
  • 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.
  • Figure 00480003
  • 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.
  • Figure 00490001
  • 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.
  • Figure 00490002
  • 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.
  • Figure 00490003
  • 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.
  • Figure 00500001
  • Späte Initialisierung
  • e32.descriptors.TPtrC.late-initialisation
  • Figure 00500002
  • 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.
  • Figure 00500003
  • 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.
  • Figure 00510001
  • 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.
  • Figure 00510002
  • Hinweise
  • Die Funktion Set() kann zum Initialisieren eines konstanten Zeigerdeskriptors verwendet werden, der mit dem Vorgabekonstruktor konstruiert wird.
  • Figure 00520001
  • 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:
    Figure 00520002
  • 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:
    Figure 00520003
    Figure 00530001
    Figure 00540001
    Figure 00550001
  • Konstruktion
  • e32.descriptors.TPtr.construction
  • Figure 00550002
  • 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.
  • Figure 00550003
  • Figure 00560001
  • 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.
  • Figure 00560002
  • Späte Initialisierung
  • e32.descriptors.TPtr.late-initialisation
  • Figure 00570001
  • 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.
  • Figure 00570002
  • 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.
  • Figure 00570003
  • Figure 00580001
  • Zuweisungsoperatoren
  • Figure 00580002
  • 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.
  • Figure 00580003
  • 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.
  • Figure 00590001
  • 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.
  • Figure 00590002
  • 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.
  • Figure 00590003
  • 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).
  • Figure 00590004
  • 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
    Figure 00600001
  • 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:
    Figure 00600002
  • Der Inhalt kann nicht modifiziert, aber ersetzt werden, z. B:
    Figure 00600003
  • 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:
    Figure 00610001
  • Alle unter der Klasse TDesC beschriebenen Memberfunktionen stehen für die Verwendung durch einen TBufC Deskriptor zur Verfügung. Zusammenfassend sind dies:
    Figure 00610002
  • Konstruktion
  • e32.descriptors.TBufC.construction
  • Figure 00620001
  • 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
  • Figure 00620002
  • 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.
  • Figure 00620003
  • 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.
  • Figure 00630001
  • 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.
  • Figure 00630002
  • 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.
  • Figure 00630003
  • 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
  • Figure 00640001
  • 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.
  • Figure 00650001
  • 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.
  • Figure 00650002
  • 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.
  • Figure 00650003
  • 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.
  • Figure 00660001
  • 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.
  • Figure 00660002
  • 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
  • Figure 00660003
  • Ein modifizierbarer Pufferdeskriptor.
  • Figure 00670001
  • 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:
    Figure 00670002
  • Der Inhalt des Pufferdeskriptors kann ersetzt werden, vorausgesetzt, die Länge der neuen Daten überschreitet den Wert des Ganzzahlschablonenparameters nicht, z. B.:
    Figure 00670003
  • 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:
    Figure 00670004
  • Alle unter den Klassen TDesC und TDes beschriebenen Memberfunktionen stehen für die Verwendung durch einen TBuf Deskriptor zur Verfügung. Zusammenfassend sind dies:
    Figure 00670005
    Figure 00680001
    Figure 00690001
    Figure 00700001
  • Konstruktion
  • e32.descriptors.TBuf.construction
  • Figure 00700002
  • 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.
  • Figure 00700003
  • 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.
  • Figure 00710001
  • Figure 00710002
  • 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.
  • Figure 00710003
  • 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.
  • Figure 00720001
  • 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.
  • Figure 00720002
  • 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.
  • Figure 00730001
  • 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.
  • Figure 00730002
  • 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.
  • Figure 00730003
  • Figure 00740001
  • 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.
  • Figure 00740002
  • 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
  • Figure 00750001
  • 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:
    Figure 00760001
  • 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:
    Figure 00770001
  • Zuordnung und Konstruktion
  • e32.descriptors.HBufC.allocation-and-construction
  • Figure 00770002
  • Figure 00780001
  • 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.
  • Figure 00780002
  • Figure 00790001
  • Beispiel
  • Diese Code-Fragmente illustrieren, wie ein HBufC Deskriptor konstruiert werden kann. Verwenden von New():
    Figure 00790002
  • NewL(), NewLC() Erzeugen eines neuen HBufC von einem Strom
  • e32.descriptors.newfromstream
  • Figure 00790003
  • 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.
  • Figure 00800001
  • Figure 00810001
  • 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.
  • Figure 00820001
  • Figure 00820002
  • Beispiel
  • Beispiel siehe e32.descriptors.new
  • Neuzuordnung
  • e32.descrigtors.HBufC.reallocation
  • Figure 00820003
  • 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.
  • Figure 00830001
  • 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.
  • Figure 00840001
  • 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
  • Figure 00840002
  • 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.
  • Figure 00850001
  • 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.
  • Figure 00860001
  • 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.
  • Figure 00860002
  • 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.
  • Figure 00860003
  • 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.
  • Figure 00870001
  • 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.
  • Figure 00870002
  • 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
  • Figure 00870003
  • 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
  • Figure 00880001
  • 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.
  • Figure 00880002
  • 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.
  • Figure 00890001
  • 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.
  • Figure 00890002
  • 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
  • Figure 00890003
  • 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.
  • Figure 00900001
  • Beispiel
  • Dieses Code-Fragment illustriert die Verwendung von Compare() .
  • Figure 00900002
  • Somit gilt:
    Figure 00900003
    Figure 00910001
  • Mustervergleich
  • e32.descriptors.TDesC.pattern-matching
  • Figure 00910002
  • 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.
  • Figure 00910003
  • Figure 00920001
  • 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()
    Figure 00920002
  • Lokalisieren eines Zeichens
  • e32.descriptors.TDesC.locate-character
  • Figure 00930001
  • 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.
  • Figure 00930002
  • Beispiel
  • Dieses Code-Fragment illustriert die Verwendung von Locate().
  • Figure 00930003
  • Figure 00940001
  • 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.
  • Figure 00940002
  • Suchen von Daten
  • e32.descriptors.TDesC.find-data
  • Figure 00940003
  • 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.
  • Figure 00950001
  • 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() .
  • Figure 00960001
  • Figure 00960002
  • 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.
  • Figure 00970001
  • Hinweise
  • Wenn aLen null ist, dann ist der zurückgegebene Wert null.
  • Extraktion
  • e32.descriptors.TDesC.extraction
  • Figure 00970002
  • Beschreibung
  • Diese Funktion dient zum Konstruieren und Zurückgeben eines konstanten Zeigerdeskriptors, um den linken Teil der Daten dieses Deskriptors zu repräsentieren.
  • Figure 00980001
  • 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() .
  • Figure 00980002
  • 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.
  • Figure 00990001
  • 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().
  • Figure 01000001
  • 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.
  • Figure 01000002
  • 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.
  • Figure 01010001
  • 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.
  • Figure 01010002
  • 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() .
  • Figure 01020001
  • Erzeugen eines Freispeicherdeskriptors (HBufC)
  • e32.descriptors.TDesC.create-HBufC
  • Figure 01020002
  • 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.
  • Figure 01030001
  • Beispiel
  • Die Code-Fragmente illustrieren die Verwendung von AllocL() .
  • Figure 01030002
  • 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
  • Figure 01040001
  • 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.
  • Figure 01040002
  • 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.
  • Figure 01050001
  • Vergleichsoperatoren
  • e32.descriptors.TDesC.comparison-operators
  • Figure 01050002
  • 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.
  • Figure 01060001
  • Beispiel
  • Dieses Code-Fragment illustriert die Verwendung von Compare().
  • Indexieroperator
  • Figure 01060002
  • e32.descriptors.TDesC.indexing-operator
  • Figure 01060003
  • 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.
  • Figure 01070001
  • Beispiel
  • Die Code-Fragmente illustrieren die Verwendung von operator[] .
  • Figure 01070002
  • TDes Klasse
  • Übersicht
  • Figure 01080001
  • 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
  • Figure 01080002
  • 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.
  • Figure 01090001
  • Figure 01090002
  • 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
  • Figure 01090003
  • e32.descriptors.TDes.change-length
  • Figure 01090004
  • Bescheibung
  • Diese Funktion dient zum Setzen der Länge des Deskriptors auf den Wert von aLength.
  • Argumente
  • Figure 01090005
  • Figure 01090006
  • Beschreibung
  • Diese Funktion dient zum Setzen der Länge des Deskriptors auf null.
  • Figure 01100001
  • Beschreibung
  • Diese Funktion dient zum Setzen der Länge des Deskriptors auf ihren Höchstwert.
  • Swap
  • e32.descriptors.TDes.swap
  • Figure 01100002
  • 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
  • Figure 01100003
  • 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()
    Figure 01110001
  • Kopieren
  • e32.descriptors.TDes.copy
  • Figure 01110002
  • 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.
  • Figure 01120001
  • 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().
  • Figure 01120002
  • Figure 01130001
  • 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
  • Figure 01130002
  • 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.
  • Figure 01130003
  • 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
  • Figure 01130004
  • Figure 01140001
  • Figure 01140002
  • 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.
  • Figure 01140003
  • 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.
  • Figure 01150001
  • 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.
  • Figure 01150002
  • 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
  • Figure 01160001
  • 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.
  • Figure 01160002
  • Beispiel
  • Das folgende Code-Fragment illustriert die Verwendung von Repeat().
  • Figure 01160003
  • Figure 01170001
  • 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.
  • Figure 01170002
  • Kopieren und Ausrichten
  • e32.descriptors.TDes.copy-justify
  • Figure 01170003
  • 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.
  • Figure 01180001
  • 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().
  • Figure 01190001
  • 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.
  • Figure 01190002
  • Dieser Aufruf an Justify() erzeugt Panik, weil die resultierende Länge von Daten in tgt die maximale Länge von tgt überschreiten würde.
  • Figure 01190003
  • 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
  • Figure 01200001
  • 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.
  • Figure 01200002
  • Figure 01210001
  • Beispiel
  • Das folgende Code-Fragment illustriert die Verwendung von Insert().
  • Figure 01210002
  • Figure 01220001
  • 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.
  • Figure 01220002
  • Beispiel
  • Das folgende Code-Fragment illustriert die Verwendung von Delete().
  • Figure 01220003
  • Figure 01230001
  • Figure 01230002
  • 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.
  • Figure 01240001
  • Beispiel
  • Das folgende Code-Fragment illustriert die Verwendung von ReplaCe().
  • Figure 01250001
  • Löschen von voranstehenden und nachstehenden Leerstellen
  • e32.descriptors.TDes.delete-spaces
  • Figure 01260001
  • 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().
  • Figure 01260002
  • 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().
  • Figure 01270001
  • 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().
  • Figure 01280001
  • Falten/Mischen
  • e32.descriptors.TDes.fold-collate
  • Figure 01280002
  • Beschreibung
  • Diese Funktion dient zum Falten des Inhalts dieses Deskriptors (weitere Informationen über Falten siehe e32.descriptors.folding).
  • Figure 01280003
  • 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
    Figure 01290001
  • Beschreibung
  • Diese Funktion dient zum Umwandeln der Zeichen in diesem Deskriptor in Kleinbuchstaben.
  • Figure 01290002
  • Beschreibung
  • Diese Funktion dient zum Umwandeln der Zeichen dieses Deskriptors in Großbuchstaben.
  • Figure 01290003
  • 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()
  • Figure 01290004
  • Auffüllen
  • e32.descriptors.TDes.filling
  • Figure 01290005
  • 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.
  • Figure 01300001
  • Figure 01300002
  • 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.
  • Figure 01300003
  • 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.
  • Figure 01310001
  • 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.
  • Figure 01310002
  • Ganzzahlkonversion
  • e32.descriptors.TDes.integer-conversion
  • Figure 01310003
  • 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.
  • Figure 01310004
  • Beispiel
  • Das folgende Code-Fragment illustriert die Verwendung von Num().
  • Figure 01320001
  • Figure 01320002
  • Beispiel
  • Das folgende Code-Fragment illustriert die Verwendung von Num() und NumUC().
  • Figure 01330001
  • Konversion einer realen Zahl
  • e32.descriptors.TDes.real-number-conversion
  • Figure 01330002
  • 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).
  • Figure 01340001
  • Formatieren
  • e32.descriptors.TDes.formatting
  • Figure 01340002
  • 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)
  • Figure 01410001
  • 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().
  • Figure 01430001
  • Figure 01440001
  • Figure 01450001
  • Figure 01460001
  • Figure 01460002
  • Figure 01470001
  • Anhängen
  • Figure 01470002
  • 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.
  • Figure 01480001
  • 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.
  • Figure 01480002
  • 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.
  • Figure 01480003
  • 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.
  • Figure 01490001
  • Beschreibung
  • Diese Funktion dient zum Hinzufügen von aLength Zeichen aChatr an das Ende von existierenden Daten in diesem Deskriptor.
  • Figure 01490002
  • 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.
  • Figure 01490003
  • 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.
  • Figure 01500001
  • 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().
  • Figure 01510001
  • 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.
  • Figure 01510002
  • 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
  • Figure 01510003
  • 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.
  • Figure 01520001
  • 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().
  • Figure 01530001
  • 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.
  • Figure 01540001
  • 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.
  • Figure 01540002
  • Dieser Aufruf an AppendJustify() erzeugt Panik, weil die resultierende Länge von tgt die maximale Länge überschreiten würde.
  • Figure 01540003
  • 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.
  • Figure 01550001
  • 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.
  • Figure 01560001
  • 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
  • Figure 01560002
  • Figure 01570001
  • 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.
  • Figure 01570002
  • 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
  • Figure 01580001
  • Beispiel
  • Das folgende Code-Fragment illustriert die Verwendung von AppendNum().
  • Figure 01580002
  • Figure 01580003
  • e32.descriptors.TDes.appending.Appendnumusi
  • Figure 01580004
  • 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
  • Figure 01580005
  • Figure 01590001
  • Beispiel
  • Das folgende Code-Fragment illustriert die Verwendung von AppendNum() und AppendNumUC():
    Figure 01590002
    Figure 01600001
  • 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.
  • Figure 01600002
  • Figure 01610001
  • Beschreibung
  • Diese Funktion ist äquivalent mit AppendFoTmat().
  • Figure 01610002
  • Figure 01620001
  • 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).
  • Figure 01620002
  • Figure 01630001
  • Null-Terminator hinzufügen
  • e32.descriptors.TDes.zero-terminator
  • Figure 01630002
  • 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():
    Figure 01640001
  • Die Länge des Deskriptors tgt ist 5 vor und hinter dem Aufruf an ZeroTeiminate()
    Figure 01640002
  • 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.
  • Figure 01640003
  • 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
  • Figure 01650001
  • 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.
  • Figure 01650002
  • Figure 01660001
  • Beispiel
  • Die Code-Fragmente illustrieren die Verwendung von operator[]
    Figure 01660002
  • Anhängen von Operatoren
  • e32.descriptors.TDes.appending-operators
  • Figure 01660003
  • 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.
  • Figure 01670001
  • 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.
  • Figure 01670002
  • 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.
  • Zum Beispiel:
    Figure 01680001
  • Wenn die Memberfunktion MyCopy geändert wird, so dass sie wie folgt prototypisiert wird:
    Figure 01680002

    oder sogar:
    Figure 01680003

    dann würde der Klassenzuweisungsoperator TBuf<class S> vom Compiler verwendet. Eine solche Änderung würde jedoch das Design der Klasse TMyclass. kompromittieren.
  • Figure 01680004
  • 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.
  • Figure 01690001
  • 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.
  • Figure 01690002
  • 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.
  • Figure 01690003
  • 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.
  • Figure 01700001
  • 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).
  • Figure 01700002
  • 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
  • Figure 01700003
  • 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
  • Figure 01710001
  • 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.
  • Figure 01710002
  • 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
  • Figure 01720001
  • 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
  • Figure 01720002
  • Figure 01730001
  • 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.
  • Figure 01730002
  • Beschreibung
  • Eine Aufzählung, deren Enumeratoren die Ausrichtung von Daten in einem Bereich bestimmen. Die Aufzählung wird von den Deskriptor-Memberfunktionen
    Figure 01730003
    Figure 01740001
  • Beschreibung
  • Figure 01740002
  • Beschreibung
  • Figure 01740003
  • Hinweise
  • Figure 01750001
  • Beschreibung
  • Figure 01750002
  • Beschreibung
  • Figure 01750003
  • Beschreibung
  • Figure 01750004
  • Beschreibung
  • Figure 01750005
  • Figure 01760001
  • In ERA, ist 2-Byte-UNICODE-Unterstützung tief in das System integriert.

Claims (32)

  1. Computer, 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, die eine begrenzte Teilmenge verfügbarer Speichermanagementfunktionen erfordert; (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.
  2. Computer nach Anspruch 1, ferner umfassend ein Programm, das an das Betriebssystem anschließt und das ebenfalls Objekte nach einer oder mehreren der Anforderungen handhabt.
  3. Computer nach Anspruch 1, bei dem Objekte, die eine oder mehrere der Anforderungen erfüllen, flache Strukturen sind.
  4. Computer nach Anspruch 1, bei dem Objekte der String-Klasse für längenbegrenzten Text zur Laufzeit an bestimmten Speicherstellen gespeichert werden, die nicht Teil des Freispeichers sind.
  5. Computer nach Anspruch 1, bei dem die Objekte polymorph sind.
  6. Computer nach Anspruch 5, in dem Polymorphismus erzielt wird, indem ein Datenfeld für jedes Objekt bereitgestellt wird, das seine Klasse identifiziert, wobei jeweils eine andere Aktion mit unterschiedlichen Datenfeldwerten assoziiert wird.
  7. Computer nach Anspruch 6, in dem das Datenfeld Teil der Darstellung eines anderen Datenelementes in einem Maschinenwort ist.
  8. Computer nach Anspruch 7, der unabhängig von dem verwendeten Zeichencode-System und der verwendeten Zeichencode-Breite denselben Quellcode benutzen kann, indem er Aliasnamen für Klassennamen verwendet, die vom Zeichencode unabhängig sind.
  9. Computer nach Anspruch 8, in dem der Textstrings verwendende Quellcode auf eine Weise geschrieben ist, die von der tatsächlichen ASCII- oder Unicode-Implementation der Strings unabhängig ist, indem ein System von Aliasnamen für Klassennamen verwendet wird.
  10. Computer nach Anspruch 1, in dem Objekte Informationen über die Länge der in ihnen enthaltenen Daten und somit keinen '0'-Terminator haben.
  11. Verfahren, das es ermöglicht, dass Objekte der String-Klasse von einem Programm unter Verwendung eines objektorientieren Betriebssystems 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, die eine begrenzte Teilmenge verfügbarer Speichermanagementfunktionen erfordert; (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.
  12. Verfahren nach Anspruch 11, das an einem Betriebssystem ausgeführt wird.
  13. Verfahren nach Anspruch 11, das von einem Programm ausgeführt wird, das an ein Betriebssystem anschließt, das selbst ebenfalls das Verfahren nach Anspruch 12 durchführt.
  14. Verfahren nach Anspruch 11, bei dem Objekte, die eine oder mehrere der Anforderungen erfüllen, flache Strukturen sind.
  15. Verfahren nach Anspruch 11, bei dem Objekte der String-Klasse für längenbegrenzten Text zur Laufzeit an bestimmten Speicherstellen gespeichert werden, die nicht Teil des Freispeichers sind.
  16. Verfahren nach Anspruch 11, in dem die Objekte polymorph sind.
  17. Verfahren nach Anspruch 16, in dem Polymorphismus erzielt wird, indem ein Datenfeld für jedes Objekt bereitgestellt wird, das seine Klasse identifiziert, wobei jeweils eine andere Aktion mit unterschiedlichen Datenfeldwerten assoziiert wird.
  18. Verfahren nach Anspruch 17, in dem das Datenfeld Teil der Darstellung eines anderen Datenelementes in einem Maschinenwort ist.
  19. Verfahren nach Anspruch 18, das unabhängig von dem verwendeten Zeichencode-System und der verwendeten Zeichencode-Breite denselben Quellcode benutzen kann, indem es Aliasnamen für Klassennamen verwendet, die vom Zeichencode unabhängig sind.
  20. Verfahren nach Anspruch 19, in dem der Textstrings verwendende Quellcode auf eine Weise geschrieben ist, die von der tatsächlichen ASCII- oder Unicode-Implementation der Strings unabhängig ist, indem ein System von Aliasnamen für Klassennamen verwendet wird.
  21. Verfahren nach Anspruch 11, in dem Objekte Informationen über die Länge der in ihnen enthaltenen Daten und somit keinen '0'-Terminator haben.
  22. Computersoftware, die es ermöglicht, dass Objekte der String-Klasse von einem Programm unter Verwendung eines objektorientieren Betriebssystems 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, die eine begrenzte Teilmenge verfügbarer Speichermanagementfunktionen erfordert; (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.
  23. Computersoftware nach Anspruch 22, die ein objektorientiertes Betriebssystem ist.
  24. Computersoftware nach Anspruch 22, die ein Programm ist, das an das objektorientierte Betriebssystem von Anspruch 23 anschließen kann.
  25. Computersoftware nach Anspruch 22, in der Objekte, die eine oder mehrere der Anforderungen erfüllen, flache Strukturen sind.
  26. Computersoftware nach Anspruch 22, in der Objekte der String-Klasse für längenbegrenzten Text zur Laufzeit an bestimmten Speicherstellen gespeichert werden, die nicht Teil des Freispeichers sind.
  27. Computersoftware nach Anspruch 22, in der die Objekte polymorph sind.
  28. Computersoftware nach Anspruch 27, in der Polymorphismus erzielt wird, indem ein Datenfeld für jedes Objekt bereitgestellt wird, das seine Klasse identifiziert, wobei jeweils eine andere Aktion mit unterschiedlichen Datenfeldwerten assoziiert wird.
  29. Computersoftware nach Anspruch 28, in der das Datenfeld Teil der Darstellung eines anderen Datenelementes in einem Maschinenwort ist.
  30. Computersoftware nach Anspruch 29, die unabhängig von dem verwendeten Zeichencode-System und der verwendeten Zeichencode-Breite denselben Quellcode benutzen kann, indem sie Aliasnamen für Klassennamen verwendet, die vom Zeichencode unabhängig sind.
  31. Computersoftware nach Anspruch 30, in der der Textstrings verwendende Quellcode auf eine Weise geschrieben ist, die von der tatsächlichen ASCII- oder Unicode-Implementation der Strings unabhängig ist, indem ein System von Aliasnamen für Klassennamen verwendet wird.
  32. Computersoftware nach Anspruch 22, in der Objekte Informationen über die Länge der in ihnen enthaltenen Daten und somit keinen '0'-Terminator haben.
DE69812285T 1997-06-13 1998-06-12 Objektorientiertes betriebssystem Expired - Lifetime DE69812285T2 (de)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
GB9712455 1997-06-13
GBGB9712455.6A GB9712455D0 (en) 1997-06-13 1997-06-13 Operating system for a computer based on C++ programming techniques
PCT/GB1998/001717 WO1998057258A2 (en) 1997-06-13 1998-06-12 Object oriented operating system

Publications (2)

Publication Number Publication Date
DE69812285D1 DE69812285D1 (de) 2003-04-24
DE69812285T2 true DE69812285T2 (de) 2004-02-05

Family

ID=10814196

Family Applications (1)

Application Number Title Priority Date Filing Date
DE69812285T Expired - Lifetime DE69812285T2 (de) 1997-06-13 1998-06-12 Objektorientiertes betriebssystem

Country Status (7)

Country Link
US (1) US6836879B1 (de)
EP (1) EP0922250B1 (de)
AT (1) ATE235080T1 (de)
DE (1) DE69812285T2 (de)
GB (1) GB9712455D0 (de)
HK (1) HK1021036A1 (de)
WO (1) WO1998057258A2 (de)

Families Citing this family (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7150005B2 (en) * 1999-07-02 2006-12-12 Beryl Technical Assays, Llc Method and system for global constant management for memory
US7590837B2 (en) * 2003-08-23 2009-09-15 Softex Incorporated Electronic device security and tracking system and method
US20050261788A1 (en) * 2004-05-21 2005-11-24 Singman-Aste Michael K System and method for programmatically searching backwards in a string
EP1872595B1 (de) * 2006-02-03 2011-11-09 Sigram Schindler Beteiligungsgesellschaft mbH Änderungsverfahren der arbeitsweise einer technischen-kommunikationsgruppen-plattform (tkgp) eines telekommunikations-netzes (tk-netzes)
US7735061B2 (en) * 2006-05-03 2010-06-08 Epic Games, Inc. Efficient encoding and access of mathematically precise variable precision numeric types
US8307350B2 (en) 2009-01-14 2012-11-06 Microsoft Corporation Multi level virtual function tables
US8453130B2 (en) * 2011-02-09 2013-05-28 International Business Machines Corporation Memory management for object oriented applications during runtime
US8935663B2 (en) * 2012-03-22 2015-01-13 Oracle International Corporation Identifying deprecated external routines invoked by a software application implementing subtype polymorphism
CN112509629B (zh) * 2020-11-18 2024-06-18 北京确安科技股份有限公司 J750系统数据下载方法、系统、电子设备及存储介质

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5787431A (en) * 1996-12-16 1998-07-28 Borland International, Inc. Database development system with methods for java-string reference lookups of column names

Also Published As

Publication number Publication date
EP0922250A2 (de) 1999-06-16
GB9712455D0 (en) 1997-08-20
WO1998057258A2 (en) 1998-12-17
ATE235080T1 (de) 2003-04-15
WO1998057258A3 (en) 1999-03-04
US6836879B1 (en) 2004-12-28
DE69812285D1 (de) 2003-04-24
HK1021036A1 (en) 2000-05-26
EP0922250B1 (de) 2003-03-19

Similar Documents

Publication Publication Date Title
DE69735343T2 (de) System, Verfahren und Vorrichtung zum direkten Ausführen eines architekturunabhängigen binären Programms
DE69819188T2 (de) Programmschnittstellenumsetzer für rechner mit mehreren umgebungen
DE10101346B4 (de) Verfahren zum automatischen Umsetzen von Daten, die in einem bestimmten Laufzeitcodierungssystem erzeugt wurden, für die Verarbeitung in einem anderen Laufzeitcodierungssystem
DE19815865B4 (de) Kompiliersystem und Verfahren zum rekonfigurierbaren Rechnen
DE69814174T2 (de) Java laufzeitsystem mit veränderter sammlung von konstanten
Lesk et al. Lex: A lexical analyzer generator
DE60031370T2 (de) Tokenbasierte verknüpfung
US7178100B2 (en) Methods and apparatus for storing and manipulating variable length and fixed length data elements as a sequence of fixed length integers
EP2517105B1 (de) Verfahren zum komprimieren von bezeichnern
DE60007091T2 (de) Programmierbare vorrichtung zur extraktion und analyse von daten
DE69912410T2 (de) Schnelles zeichenkettensuchen und -indizieren
DE60006410T2 (de) Verfahren und system zum verteilen von objektorientierten rechnerprogrammen
DE69812285T2 (de) Objektorientiertes betriebssystem
DE60103521T2 (de) Vorladen von klassen in einer datenverarbeitungseinrichtung ohne virtueller speicherverwalter
CA2426496A1 (en) Processing fixed-format data in a unicode environment
Backus Programming language semantics and closed applicative languages
DE69907714T2 (de) Komponentbasiertes quellcodegeneratorverfahren
DE69830804T2 (de) Prozessor zur durchführung eines befehls welcher ergebnisse mit verschiedenen datentypen erzeugt
EP1182547A1 (de) Programmkopplungsmethode
DE10120867B4 (de) Computersystem, Verfahren zum Betrieb eines Computersystems, sowie Maschinenlesbare Speichervorrichtung
DE19933584A1 (de) Verfahren zur kompakten Darstellung von Informationspaketen und deren Speicherung oder Übertragung
DE10054001A1 (de) Automatisierte Schnittstellengenerierung für Computerprogramme in unterschiedlichen Umgebungen
WO2020177994A1 (de) Verfahren zum erzeugen einer darstellung einer programmlogik, dekompiliervorrichtung, rekompiliersystem und computerprogrammprodukt
DE112010003774T5 (de) Kompatibilität auf objektebene und klassenskalierung unter verwendung semantischer werte
DE69726140T2 (de) Verfahren und System zum Ausführen von Befehlen in einem Mikroprozessor

Legal Events

Date Code Title Description
8327 Change in the person/name/address of the patent owner

Owner name: NOKIA CORP., ESPOO, FI

8328 Change in the person/name/address of the agent

Representative=s name: COHAUSZ & FLORACK PATENT- UND RECHTSANWAELTE PARTN