Wiederholung: Generisches Array
Teil des Abschnitts Object Oriented Programming der C-Journey von Coddy — Lektion 53 von 61.
Aufgabe
EinfachLassen Sie uns einen GenericArray-Container bauen — eine flexible Datenstruktur, die mithilfe von void*-Poitern eine Mischung aus Integern und Strings in derselben Sammlung halten kann.
Sie werden Ihren Code über drei Dateien organisieren:
generic_array.h: Definieren Sie dasGenericArray-Struct mit drei Elementen: einvoid**-Array, um Pointer zu halten, einintfür die aktuelle Anzahl (count) und einintfür die Kapazität (capacity). Deklarieren Sie die Funktionsprototypen zum Erstellen des Arrays, Hinzufügen von Elementen, Abrufen von Elementen nach Index und Freigeben des Arrays.generic_array.c: Implementieren Sie die Funktionalität Ihres Containers:create_array— alloziert ein GenericArray mit einer gegebenen Anfangskapazität und initialisiert count auf 0add_element— speichert einenvoid*-Pointer am nächsten verfügbaren Platz und erhöht count (nehmen Sie an, dass die Kapazität ausreicht)get_element— gibt denvoid*am angegebenen Index zurückfree_array— gibt das items-Array und das GenericArray-Struct selbst frei
main.c: Demonstrieren Sie Ihr generisches Array, indem Sie sowohl Integer als auch Strings speichern. Lesen Sie die Anzahl der hinzuzufügenden Elemente ein, lesen Sie dann für jedes Element einen Typindikator (ifür Integer,sfür String), gefolgt vom Wert. Nachdem Sie alle Elemente hinzugefügt haben, iterieren Sie durch das Array und geben Sie jeden Wert aus. Geben Sie für Integer die Zahl direkt aus. Geben Sie für Strings den Text direkt aus.
Ihr Programm erhält:
- Die Anzahl der hinzuzufügenden Elemente
- Für jedes Element: einen Typindikator (
ioders), gefolgt vom Wert
Wenn Sie Integer hinzufügen, allozieren Sie Speicher für den int und speichern Sie den Pointer. Wenn Sie Strings hinzufügen, allozieren Sie Speicher und kopieren Sie den String. Casten Sie beim Abrufen zurück in den entsprechenden Typ, um ihn auszugeben.
Wichtig: Um die Typen für die Ausgabe zu verfolgen, können Sie ein einfaches paralleles Array von Typindikatoren in main verwenden oder das Typindikator-Zeichen zusammen mit jedem Element speichern.
Beispielhafte Ausgabe, wenn die Eingaben 3, dann i 42, s Hello, i 100 sind:
42
Hello
100Beispielhafte Ausgabe, wenn die Eingaben 4, dann s World, s Generic, i -5, s Arrays sind:
World
Generic
-5
ArraysDenken Sie daran, Include-Guards in Ihrer Header-Datei zu verwenden. Der Container selbst muss nicht wissen, welche Typen er speichert — er hält lediglich void*-Pointer. Die Verantwortung, den Typ zu kennen, liegt beim Code, der die Elemente hinzufügt und abruft.
Probier es selbst
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "generic_array.h"
int main() {
int n;
scanf("%d", &n);
// TODO: Erstelle ein GenericArray mit der Kapazität n
// TODO: Erstelle ein paralleles Array, um die Typen zu verfolgen (char-Array der Größe n)
// TODO: Für jedes Element:
// - Lies den Typ-Indikator (i oder s)
// - Lies den Wert
// - Wenn Integer: Reserviere Speicher für int, speichere den Wert, füge ihn zum Array hinzu
// - Wenn String: Reserviere Speicher für den String, kopiere den Wert, füge ihn zum Array hinzu
// - Speichere den Typ-Indikator in deinem parallelen Array
// TODO: Iteriere durch das Array und gib jedes Element aus
// - Überprüfe den Typ aus deinem parallelen Array
// - Caste den void* zurück in den entsprechenden Typ und gib ihn aus
// TODO: Gib den gesamten reservierten Speicher frei (Integers, Strings und das Array)
return 0;
}
Alle Lektionen in Object Oriented Programming
1Grundlagen der modularen Programmierung
Header-DateienInclude GuardsQuelldateienStatische FunktionenWiederholung: Modularer Taschenrechner4Kapselung
Konzept der Opaque PointersOpaque Structs definierenGetter und SetterValidierung in SetternRückblick: Die geheime Box7Funktionszeiger
Funktionszeiger deklarierenFunktionszeiger aufrufenTypedef für FunktionszeigerFunktionen als Argumente übergebenZusammenfassung: Calculator Dispatch10Generische Container
Wiederholung: Void-PointerGenerischer WrapperGenerisches SwapGenerisches VergleichenWiederholung: Generisches Array2Objekte und Methoden
Structs als ObjekteDer 'Self'-PointerConst-CorrectnessPointer vs. WertHilfsmethodenZusammenfassung: Point Manager5Projekt: Einfaches Bankkonto
Projekt-SetupImplementierung des Kontos3Objekt-Lebenszyklus
Konstruktor-MusterDestruktor-MusterStack-InitialisierungTiefe KopieRückblick: String-Wrapper6Vererbung durch Komposition
Struct-EinbettungDie First-Member-RegelZugriff auf Parent-MemberUpcastingRückblick: Formenhierarchie9Projekt: Formen-Zeichner
ProjektübersichtKreis-Implementierung