SO WIRD'S GEMACHT: Große Arrays vom Typ Character initialisieren

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 38728 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Dieser Artikel wurde zuvor veröffentlicht unter D38728
Dieser Artikel ist eine Übersetzung des folgenden englischsprachigen Artikels der Microsoft Knowledge Base:
38728 HOW TO: Initialize Large Character Arrays
Alles erweitern | Alles schließen

Auf dieser Seite

Zusammenfassung

Ein häufiges Problem in der C-Programmierung ist das Initialisieren eines großen Arrays vom Typ Character. Es gibt verschiedene Methoden dafür sowie auch verschiedene potenzielle Probleme.

Methode 1 -- Zeichenfolgenliterale

Eine Methode der Initialisierung von Arrays vom Typ Character ist die Verwendung eines Zeichenfolgenliterals. Die von ANSI erlaubte Mindestgrenze für ein Zeichenfolgenliteral nach Verkettung liegt bei 509 Zeichen. Diese Grenze lag in früheren Versionen von Microsoft C/C++ zwischen 512 und 2048 Zeichen, abhängig von der spezifischen Version des Compilers. Aufgrund der Grenze bei der Länge eines Zeichenfolgenliterals können Sie mit dieser Methode keine Arrays vom Typ Character initialisieren, die diese Grenze überschreiten. (Diese Grenze umfasst das letzte Nullzeichen einer C-"Zeichenfolge". Daher führt die Anweisung char a[] = "12"; zu einem 3-Element-Array.)

Da es in den meisten Editoren auch eine Grenze bei der Zeilenlänge gibt, können Sie so viele Zeichen gewöhnlich nicht direkt in ein Zeichenfolgenliteral einfügen. Der Compiler verkettet jedoch eine Reihe von Zeichenfolgen in Anführungszeichen zu einer einzelnen Zeichenfolge, so dass die Deklaration
char a[] = "a" 
           "b";
	   
dieselbe ist wie:
char a[] = "ab";
Dies ermöglicht das Platzieren von großen Literalinitialisierern in den Code, wie weiter unten gezeigt. Diese Methode stößt an die Grenze des Compilers.
char stuff[] = 
   "xxx...xxx" 
       ...
   "xxx...xxx";
(Der ANSI-Standard besagt, dass Zeichenfolgen, die nur durch weiße Felder getrennt sind, automatisch verkettet werden.)

Methode 2 -- Zeicheninitialisierer

Folgende Anweisung kann verwendet werden:
char stuff [] = 
   { 'a', ...
          ... 
	  ... 'z' };
Die Eingabe eines solchen Initialisierers ist jedoch mühsam. Schreiben Sie, wenn Sie diese Methode verwenden, ein Programm, das eine Datendatei liest und den geeigneten Initialisierer ausgibt.

Methode 3 -- Mehrdimensionale Arrays

char stuff[][10] = {
   "0123456789",
   ...
   "0123456789" };
   
Der Wert 10 ist nicht wichtig, er muss jedoch der tatsächlichen Länge der Zeichenfolgenkonstanten entsprechen. Sind Konstanten kürzer als die angegebene Länge, wird das Ende der Zeile mit null Bytes aufgefüllt. Sind Konstanten länger, werden die zusätzlichen Zeichen verworfen. Das Ergebnis ist ein zweidimensionales Array. Ein weiterer Zeiger kann verwendet werden, um auf Folgendes in nahezu jeder gewünschten Methode zuzugreifen:
 char *stuffptr = (char *) stuff;
Diese Methode scheint die am besten geeignete zu sein. Das große Problem bei der Verwendung des Zeigers zum Testen und Adressieren des Arrays als eindimensionales Array besteht darin, dass die zusätzlichen Nullzeichen das Zählen schwierig machen, besonders wenn alle Initialisiererzeichenfolgen nicht gleich lang sind. Daher greift stuffptr[97] möglicherweise nicht auf das erwartete Element zu, es sei denn, Sie zählen sehr genau.

Methode 4 - Assembly-Module

Das Array kann auch in MASM definiert und mit Ihrem C-Programm verknüpft werden. Schreiben Sie folgenden Code, sobald in MASM die richtigen Segment- und Public-Definitionen vorgenommen wurden:
stuff   db   "abcdefghijkl"
        db   "morestuff"
        ...
        db "laststuff"
Greifen Sie in C mit folgender Anweisung auf das Array zu:
extern char stuff[]; /*   char * stuff;   will NOT work */ 

Methode 5 - Lesen aus einer Datei

Eine weitere Methode besteht darin, die Werte zur Laufzeit aus einer Datendatei in das Array zu lesen. Wird die Datei in großen Blöcken gelesen (z.B. mit "read" oder "fread"), wird die E/A sehr schnell sein. Diese Methode hat auch den Vorteil, dass die Initialisierungszeichenfolge geändert werden kann, ohne dass der Code geändert und neu kompiliert werden muss.

Bitte beachten Sie: Bei diesem Artikel handelt es sich um eine Übersetzung aus dem Englischen. Es ist möglich, dass nachträgliche Änderungen bzw. Ergänzungen im englischen Originalartikel in dieser Übersetzung nicht berücksichtigt sind. Die in diesem Artikel enthaltenen Informationen basieren auf der/den englischsprachigen Produktversion(en). Die Richtigkeit dieser Informationen in Zusammenhang mit anderssprachigen Produktversionen wurde im Rahmen dieser Übersetzung nicht getestet. Microsoft stellt diese Informationen ohne Gewähr für Richtigkeit bzw. Funktionalität zur Verfügung und übernimmt auch keine Gewährleistung bezüglich der Vollständigkeit oder Richtigkeit der Übersetzung.

Eigenschaften

Artikel-ID: 38728 - Geändert am: Dienstag, 5. Juli 2005 - Version: 2.3
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft C Professional Development System 6.0a
  • Microsoft Visual C++ 1.0 Professional Edition
  • Microsoft Visual C++ 1.5 Professional Edition
  • Microsoft Visual C++ 1.51
  • Microsoft Visual C++ 1.52 Professional Edition
  • Microsoft Visual C++ 2.0 Professional Edition
  • Microsoft Visual C++ 2.1
  • Microsoft Visual C++ 4.0 Standard Edition
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++, 32-Bit Learning Edition 6.0
Keywords: 
kbhowto kbhowtomaster kbvc400 kbvc150 kbvc100 kbvc500 kbvc600 kbvc151 kbvc200 kbvc210 kbvc152 kblangc KB38728
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com