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 derwhile
-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()
oderrealloc()
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]); }