30.06.2013 Aufrufe

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

130 6. Po<strong>in</strong>ter und References<br />

für sich hält dann die Reihen. Bleiben wir aber bei unserer ersten Def<strong>in</strong>ition,<br />

denn diese wurde im Programm implementiert.<br />

In Zeile 18 wird e<strong>in</strong>mal das Array angelegt, das die Reihen repräsentiert.<br />

Wenn man sich überlegt, dass e<strong>in</strong>e Reihe quasi e<strong>in</strong> Array von <strong>in</strong>t32 Werten<br />

ist, also e<strong>in</strong> <strong>in</strong>t32* dann ergibt sich für die Reihen, dass diese vom Typ e<strong>in</strong><br />

<strong>in</strong>t32**, also e<strong>in</strong> Po<strong>in</strong>ter auf (viele) Po<strong>in</strong>ter auf <strong>in</strong>t32 ist.<br />

In der äußeren Schleife, deren Kopf <strong>in</strong> Zeile 19 zu f<strong>in</strong>den ist, wird für jede<br />

e<strong>in</strong>zelne Reihe e<strong>in</strong>mal e<strong>in</strong> Array angelegt, das die Werte halten kann, also die<br />

Spalten. Dies passiert <strong>in</strong> Zeile 21. In der <strong>in</strong>neren Schleife von Zeile 22–24<br />

werden nur noch den e<strong>in</strong>zelnen Zellen Werte zugewiesen.<br />

Lassen wir kurz noch die Funktion außer Acht, die den Clone erzeugt und<br />

wenden wir uns den Zeilen zu, die den von der Matrix belegten Speicher dann<br />

auch wieder freigeben. Dies passiert immer von <strong>in</strong>nen nach außen. Zuerst<br />

werden die e<strong>in</strong>zelnen Reihen <strong>in</strong> e<strong>in</strong>er Schleife freigegeben. Danach erst wird<br />

das Array freigegeben, das die e<strong>in</strong>zelnen Reihen gehalten hat. Dass dies nur<br />

<strong>in</strong> dieser Reihenfolge geht, lässt sich leicht nachvollziehen, denn wenn man<br />

das äußere Array freigibt, dann hat man die Base-Po<strong>in</strong>ter für die <strong>in</strong>neren<br />

Arrays damit verloren.<br />

Vorsicht Falle: E<strong>in</strong>er der ganz typischen Fehler von Neul<strong>in</strong>gen ist es, anzunehmen,<br />

dass e<strong>in</strong> delete[] auf das äußerste Array automatisch auch die<br />

e<strong>in</strong>zelnen <strong>in</strong>neren Arrays löscht, also quasi alles aufräumt. Dies ist ke<strong>in</strong>eswegs<br />

der Fall! Vergisst man, die e<strong>in</strong>zelnen <strong>in</strong>neren Arrays zu löschen, dann<br />

erzeugt man e<strong>in</strong> tolles Programm, das nach genügend langer Laufzeit zu e<strong>in</strong>em<br />

guten Test wird, wie sich e<strong>in</strong> Rechner verhält, dem langsam aber sicher<br />

der Speicher ausgeht :-).<br />

Wenn wir uns nun noch kurz der assignClone Funktion <strong>in</strong> Zeile 51 zuwenden,<br />

die im Pr<strong>in</strong>zip genau nach dem Pr<strong>in</strong>zip funktioniert, das bereits<br />

zuvor zum Anlegen der Matrix beschrieben wurde, dann fällt uns noch e<strong>in</strong>e<br />

Besonderheit auf: Der zweite Parameter, also das src Array ist nun wirklich<br />

sehr komisch deklariert. Was um alles <strong>in</strong> der Welt soll der Ausdruck<br />

const <strong>in</strong>t32 *const *src<br />

bedeuten? Überlegen wir e<strong>in</strong>mal ganz kurz, was es z.B. mit e<strong>in</strong>em Po<strong>in</strong>ter<br />

auf e<strong>in</strong>en <strong>in</strong>t32 so auf sich hat. Im Pr<strong>in</strong>zip s<strong>in</strong>d ja daran zwei verschiedene<br />

Typen beteiligt, nämlich e<strong>in</strong>erseits e<strong>in</strong> Po<strong>in</strong>ter und andererseits der <strong>in</strong>t32,<br />

auf den er zeigt. Um die volle Kontrolle zu haben, will man jeden Teil für<br />

sich konstant machen können oder auch nicht. Und genau dies ist <strong>in</strong> C ++<br />

auch möglich, denn e<strong>in</strong>e Variable<br />

const <strong>in</strong>t32 *var;<br />

stellt e<strong>in</strong>en (nicht konstanten) Po<strong>in</strong>ter auf e<strong>in</strong>en konstanten <strong>in</strong>t32 dar. Dagegen<br />

stellt e<strong>in</strong>e Variable<br />

<strong>in</strong>t32 *const var;

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!