Menu
Coddy logo textTech

Wiederholung: Generisches Array

Teil des Abschnitts Object Oriented Programming der C-Journey von Coddy — Lektion 53 von 61.

challenge icon

Aufgabe

Einfach

Lassen 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 das GenericArray-Struct mit drei Elementen: ein void**-Array, um Pointer zu halten, ein int für die aktuelle Anzahl (count) und ein int fü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 0
    • add_element — speichert einen void*-Pointer am nächsten verfügbaren Platz und erhöht count (nehmen Sie an, dass die Kapazität ausreicht)
    • get_element — gibt den void* am angegebenen Index zurück
    • free_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 (i für Integer, s fü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:

  1. Die Anzahl der hinzuzufügenden Elemente
  2. Für jedes Element: einen Typindikator (i oder s), 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
100

Beispielhafte Ausgabe, wenn die Eingaben 4, dann s World, s Generic, i -5, s Arrays sind:

World
Generic
-5
Arrays

Denken 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