Arraylaenge an Daten anpassen



  • Die Daten sind in der "richtigen" Reihenfolge, nur die (Test)Ausgabe läuft rückwärts.



  • Okay, ich werde es mal versuchen einzubinden in mein Programm.

    Koenntest du mir vielleicht noch kurz erklaeren wie folgender Teil des Pogramms
    funktioniert:

    while (1 == fscanf(fp, "%lf", &a[i]))
    

    Was ist 1?



  • Mark_W schrieb:

    while (1 == fscanf(fp, "%lf", &a[i]))
    

    Was ist 1?

    Gegenfrage: was ist der Rückgabewert von fscanf() ?



  • Ich denke mal die Anzahl der Argumente und das waere in diesem Fall 1.
    Okay, das macht jetzt etwas mehr Sinn. Leider sagt mir das Programm wenn ich
    aus der if-Bedingung rausgehe und Irgendwas mit dem Array anstellen will, dass das leer ist.. Irgendwas mache ich falsch.. 😕 Ich versuche vll noch ein kleines Beispiel zu bringen.



  • Bis zum fclose steht in i die Anzahl der gelesenen Werte.
    In der while -Schleife danach wird i bis 0 runter gezählt.



  • Mark_W schrieb:

    Ich denke mal die Anzahl der Argumente und das waere in diesem Fall 1.

    Nein. Kein Foto für Dich.

    Du wirst irgendwoher die Dokumentation der C-Standardbibliothek brauchen...
    Ohne die kann man kaum von Dir verlangen, richtige Programme zu schreiben.

    Z.B. für scanf() hier http://en.cppreference.com/w/c/io/fscanf



  • Mark_W schrieb:

    Ich denke mal die Anzahl der Argumente und das waere in diesem Fall 1.
    Okay, das macht jetzt etwas mehr Sinn. Leider sagt mir das Programm wenn ich
    aus der if-Bedingung rausgehe und Irgendwas mit dem Array anstellen will, dass das leer ist..

    Natürlich. Bei 'free' wird der Speicher ja auch wieder freigegeben (in Wutzs Code).
    Der ist nämlich ein Beispiel, ein Muster. Jetzt wäre der richtige Zeitpunkt für ein bisschen Eigenleistung ...



  • Das ist mir schon klar, ganz kopflos handel ich hier auch nicht. 😉
    Ich habe mein komplettes Programm jetzt auch stehen mithilfe des Muster von
    Wutz.

    Ich zeige hier noch schnell meine Abaenderungen und fuer mich ist dieser Thread
    dann sehr erfolgreich gewesen. Ich danke euch allen fuer eure schnelle Hilfe! 🙂

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
      FILE *fp;
      fp = fopen("Signal_Samples.txt", "r");
    
      int blocksize = 1000, i = 0;
      double *a = malloc(blocksize*sizeof*a);
    
      if (fp)
      {
        while (1 == fscanf(fp, "%lf", &a[i]))
        {
          if (++i >= blocksize)
            a = realloc(a, (blocksize *= 2) * sizeof*a);
        }
      }
    
      int j;
      for (j = 0; j < i; j++)
      {
          printf("%d: %lf\n", j, a[j]);
      }
    
      fclose(fp);
      free(a);
      return 0;
    }
    


  • Deine Datei könnte viel eher geschlossen werden:

    fclose(fp);
    

    könntest Du zwischen Zeile 18 und 19 packen.



  • IMHO solltest Du auch mal überlegen, was passiert, wenn malloc() oder realloc() fehlschlagen. Insbesondere letzteres zwingt Dich noch zu einer Erweiterung von Wutz' Minimalbeispiel ohne Fehlerbehandlung.
    Wirst auch nochmal in die Dokumentation gucken müssen... 🙂

    Ausserdem ist das ja alles ganz nett, aber früher oder später willst Du Deine Daten an Funktionen übergeben oder noch Daten anhängen...
    Zu diesem Zeitpunkt lohnte sich dann, dass ganze zu kapseln, das könnte z.B. so aussehen:

    typedef struct {
      int size;       // aktuelle Anzahl Elemente
      int max_size;   // maximale Elemente vor realloc
      double values[]; // Elemente (ein sogenanntes "Flexible Array Member")
    } vector;
    
    // Die drei sind zu implementieren:
    vector* vector_alloc();
    void vector_free(vector* v);
    void vector_grow(vector** v);
    
    // Benutzung ist dann Pipifax:
    void vector_print(const vector* v) {
      for(int i=0; i<v->size; ++i)
        printf("%lf\n", v->values[i]);
    }
    

Anmelden zum Antworten