Frage zur dynamischen Speicherverwaltung
-
icarus2 schrieb:
SeppJ schrieb:
icarus2, C-Coder: Wozu die Casts? stdlib.h nicht eingebunden? C++-Compiler benutzt? In beiden Fällen habt ihr nun ein zur Compilezeit findbares Problem verdeckt, ohne einen Vorteil zu haben. Dafür aber auch noch mehr Code geschrieben.
Schlechte Gewohnheit, die ich irgendwie nicht wegkriege
Sorry, bei mir auch. Ich gelobe nächstes mal Besserung...
-
kann mir nochmal jemand genauer erklären, wie ich hier nun vorgehen soll? wieso wird die eingabe bei 0 beendet?
wie schaffe ich es, dass das programm soviele speicherstellen reserviert, bis 0 eingegeben wird??
-
In einer Schleife fragst du den Wert vom User ab und besorgst dafür Speicher mit realloc.
Wenn der User 0 eingegeben hat, bist du mit der Schleife fertig.Der Speicher wird nicht am Anfang auf einmal geholt sondern in der Schleife immer ewas mehr.
realloc ist da sehr hilfreich, da es die alten Daten an die neue Stelle kopiert.
Auch realloc kann NULL zurückgeben wenn nicht genug Speicher vorhanden ist.
-
int i, j, a=0, b=1; float *temp, k; temp = (float *) malloc(b * sizeof(float)); while(temp[a]!=0) { temp= (float *) realloc(b * sizeof(float)); printf("Bitte geben Sie eine Temperatur ein!\n 0 beendet die Eingabe:\n"); scanf("%d", &temp[a]); a++; }
bekomme folgende fehler:
error: too few arguments to function 'realloc'|
warning: passing argument 1 of 'realloc' makes pointer from integer without a cast|ich will oben zunächst mal 1 speicherstelle für den temp array zuweisen mit malloc. danach in der schleife mit realloc immer weiter zuweisen, bis die eingabe von temp[a] == 0. An was liegt das?
-
also ich habe nun die eingabe hinbekommen, sodass ich beliebig viele temperaturen eingeben kann.
int main() { int i, j, a=0, b=1; float *temp, k; temp = (float *) malloc(b * sizeof(float)); while(*temp!=0.0) { realloc(temp, b); printf("\nTemperatur %d (0 beendet die Eingabe):", a+1); scanf("%d", &temp[a]); a++; }
jedoch bricht er mir bei "0" noch nicht ab. AN was könnte das liegen?
-
Du rufst realloc immer mit b=1 auf. Wie soll das funktionieren? Du vergrößerst den Puffer nicht. In deinem gesamten Code ist keine Stelle, die b nach der Initialisierung verändert.
Deine Abbruchbedingung für die Schleife schaut immer nur auf den ersten Wert und vergleicht den mit 0.0. Wenn du sofort 0 eingibst, bricht die Schleife auch ab. Würdest du allerdings mehrere Werte eingeben und weiter hinten irgendwann 0, dann kriegt deine Abbruchbedingung das nicht mit. Aber mehrere Werte zu erfassen, ist sowieso nicht sinnvoll, weil du ab Wert 2 über den gültigen Speicher hinaus schreibst.
Variablen sollten immer sinnvoll benannt werden. a und b sind nicht sinnvoll. Es ist am Namen überhaupt nicht ersichtlich, was der Zweck dieser Variablen ist.
-
!beliebig schrieb:
beliebig - wunschdenken.
die ressourcen eines rechners sind begrenzt. du hast nicht beliebig viel speicher.Völlig unnötig zu erwähnen. Hilf ihm lieber.
-
Außerdem nutzt du den von realloc besorgten Speicher gar nicht.
Ich habe mir extra dei Mühe gemacht und den Link zu einer Referenz gepostet.realloc gibt einen Wert zurück. Genau wie malloc auch.
Und wenn du die Beiträge hier gründlich gelesen hättest, würdest du auch auf den cast bei malloc verzichten.
-
_matze schrieb:
!beliebig schrieb:
beliebig - wunschdenken.
die ressourcen eines rechners sind begrenzt. du hast nicht beliebig viel speicher.Völlig unnötig zu erwähnen. Hilf ihm lieber.
Ach, einfach ignorieren. Mittlerweile bin ich dazu übergegangen, groben Unsinn* einfach stillschweigend zu löschen, aber manchmal sehe ich es nicht schnell genug.
*: Auch ernst gemeinten Unfug (z.B. Sone an einem schlechten Tag), Trollerei natürlich sowieso.
-
Immer, wenn du eine dir unbekannte Funktion verwenden willst, solltest du erst mal einen Blick in die Doku werfen. Dort gibt es eine Beschreibung der Parameter, der Rückgabewerte, allgemeinen Text zur Verwendung und sogar noch ein Beispiel. Wer die Doku fleißig liest, macht deutlich weniger Fehler und kommt schneller voran. Lohnt sich also eher als reines Ausprobieren.
@SeppJ: Ja, hast wohl Recht. Manchmal fällt mir das Ignorieren einfach schwer. Lösch' halt schneller!