C Dynamisches Array



  • Deine Argumente für die Funktion sind nicht gut gewählt.

    Da fehlt die Größe und für den neuen Speicherort bzw. Fehler kann man den Rückgabewert der Funktion nehmen.



  • Wie würde denn die "verbesserete" bzw. deine (@DirkB) Version aussehen des Code?

    @SeppJ: Ich wollte folgende Aufgabe(n) der Funktion überlassen:

    - Wenn ein neuer Eintrag in das Array geschrieben soll, wird das Array um +1 erhöht.

    - In dem neuen "Index" ´(Platz) wird der Wert eingetragen

    - Wenn die Größe nicht reserviert werden kann, soll ein entsprechender Fehler zurück gegeben werden.

    Danke und Grüße



  • Ich hab den Link aus dem ersten Beitrag aufgemacht und da wird realloc schon erwähnt. Steht allerdings noch nicht zur Debatte.



  • user-12b34 schrieb:

    Wie würde denn die "verbesserete" bzw. deine (@DirkB) Version aussehen des Code?

    @SeppJ: Ich wollte folgende Aufgabe(n) der Funktion überlassen:

    - Wenn ein neuer Eintrag in das Array geschrieben soll, wird das Array um +1 erhöht.

    - In dem neuen "Index" ´(Platz) wird der Wert eingetragen

    Wie willst du in der Funktion die neue Größe bestimmen, bzw. woher kennst du den Index?

    user-12b34 schrieb:

    - Wenn die Größe nicht reserviert werden kann, soll ein entsprechender Fehler zurück gegeben werden.

    Wie zeigt z.B malloc diesen Fehler an?

    Denke daran, das der neue Speicherbereich an einer ganz anderen Stelle liegen kann und du somit der rufenden Funktion diese Adresse irgendwie mitteilen musst.



  • Mechanics schrieb:

    Ich hab den Link aus dem ersten Beitrag aufgemacht und da wird realloc schon erwähnt. Steht allerdings noch nicht zur Debatte.

    Und free scheint so wichtig zu sein, dass es dafür sogar zwei Paragraphen gibt.
    Allerdings nutzt der Autor auf der verlinkten Seite kein free. 😮



  • Mir geht es darum, Werte in ein Array zu schreiben. Dieses soll aus Speicherplatzgründen sich immer vergrößen, wenn ein neuer Wert hinein geschrieben soll.

    Tritt dabei ein Fehler auf, soll darauf reagiert werden (Anzeigen Fehler, etc.)

    Diese Aufgabe soll in eine Funktion untergebracht werden.

    Danke



  • user-12b34 schrieb:

    Mir geht es darum, Werte in ein Array zu schreiben. Dieses soll aus Speicherplatzgründen sich immer vergrößen, wenn ein neuer Wert hinein geschrieben soll.

    Tritt dabei ein Fehler auf, soll darauf reagiert werden (Anzeigen Fehler, etc.)

    Diese Aufgabe soll in eine Funktion untergebracht werden.

    Danke

    Dann zeig mal den Code von der Funktion und sag, wo du Probleme hast.
    Interaktion mit dem User ist nicht Aufgabe dieser Funktion.


  • Mod

    Dann machst du eine schöne Struktur mit einem Zeiger auf die Daten und einem Merker, wie viele Plätze in dem Array sind. Dann machst du eine Funktion, die das struct initialisiert (für beide Werte macht 0 Sinn, denn schönerweise ist ein realloc auf einen Nullzeiger das gleiche wie ein malloc), eine Funktion zum Anhängen eines Wertes (die dann realloc benutzt) und eine Funktion zum Freigeben des Arrays am Programmende. Wenn wir schon objektorientiert sind, dann auch noch eine Funktion für den Zugriff. Und da ich gerade zu viel Zeit hatte:

    #include <stddef.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct
    {
      int *data;
      size_t size;
    } *dynamic_array;
    
    dynamic_array create_dynamic_array()
    {
      dynamic_array array = malloc(sizeof(*array));
      array->data = NULL;
      array->size = 0;
      return array;
    }
    
    void* append_to_dynamic_array(dynamic_array array, int value)
    {
      int *new_array = realloc(array->data, (array->size+1) * sizeof(*array->data));
      if (new_array)
        {
          array->data = new_array;
          new_array[array->size] = value;
          ++array->size;
        }
      return new_array;
    }
    
    void destroy_dynamic_array(const dynamic_array array)
    {
      free(array->data);
      free(array);
    }
    
    int get_from_dynamic_array(const dynamic_array array, size_t index)
    {
      return array->data[index];
    }
    
    size_t get_size_of_dynamic_array(const dynamic_array array)
    {
      return array->size;
    }
    
    int main()
    {
      dynamic_array my_array = create_dynamic_array();
      int value; 
      size_t i; 
    
      while(scanf("%d", &value) == 1)
        {
          if (!append_to_dynamic_array(my_array, value))
            {
              puts("Au weia! Kein Speicher mehr.");
            }
        }
    
      puts("Arrayinhalt:");
      for(i = 0; i < get_size_of_dynamic_array(my_array); ++i)
        printf("%d\n", get_from_dynamic_array(my_array, i));
    
      destroy_dynamic_array(my_array);
    }
    

    So macht man das in C halbwegs sauber. Ich hab's jetzt absichtlich relativ anfängerfreundlich gehalten (insbesondere sehr lange Bezeichner), aber gleichzeitig das Konzept möglichst konsequent durchgezogen. Ansonsten könnte man hier und da noch ein paar Details verbessern.

    Demonstration:
    http://ideone.com/dgAi8c

    PS: Das malloc im Konstruktor sollte natürlich noch auf Erfolg prüfen. Das überlasse ich dem geneigten Leser zur Übung, den Fehler und dessen Weiterleitung sauber zu implementieren. Irgendwie juckt es mich in den Fingern, da jetzt ein kleines Exceptionframework drumherum zu basteln (oder meinetwegen mit at_exit & Co.), aber dann entfernt man sich schnell von der Tauglichkeit als Beispiel für Anfänger 🙂 . Für ein Wolf-Opfer ist das Beispiel vermutlich jetzt schon schwer genug verständlich.



  • Danke für die hilfreichen Antworten



  • Kennt jemand ein gutes C Buch bzw. hat jemand Erfahrung mit den auf dieser Seite aufgezeigten Bücher?

    Danke


  • Mod

    Ist ja nur als wichtig markiert 🙄 :
    https://www.c-plusplus.net/forum/300567


Anmelden zum Antworten