malloc problem
-
MandaJohn schrieb:
hab vor dem malloc noch das double ergänzt...
Das kannst du beruhigt wieder in die Tonne hauen. Warum? Guckst du hier:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-206606.htmlMandaJohn schrieb:
kleine ergänzung zum programm...hab den Luftdruck noch mit drin
scanf("%d", &tage);
//...
Den Rückgabewert von scanf solltest du prüfen und nach jedem scanf solltest du den Puffer leeren. Wenn z.B. ein Buchstabe eingegeben wird, funktioniert das Programm nicht richtig.
Davon kannst du dich überzeugen, indem du dieses Beispiel übersetzt und beim ersten scanf einen Buchstaben eingibst:int main () { double val; scanf ( "%lf", &val ); printf ( "%lf\n", val ); scanf ( "%lf", &val ); printf ( "%lf\n", val ); return 0; }
Scanf ist also mit Vorsicht zu benutzen.
Die Funktion realloc funktioniert im Prinzip wie malloc. Der zusätzliche Parameter zeigt auf den Speicherbereich, der verkleinert/vergrößert werden soll.
Das hier:_msize(temp)
funktioniert nicht. Dem Zeiger temp kann man keine Infos über die Anzahl der Elemente entnehmen, auf die er zeigt.
Die Anzahl musst du separat speichern.
-
oh du meinst ich müsste dann einen neuen zeiger definieren und dort die weiteren tage speichern??
also: double *sichern = NULL;
aber müsste ich nicht hier auch mit malloc arbeiten?? oder könnte ich auch realloc verwenden?
weil ich eigentlich dachte, das ich mit realloc einfach neuen speicher dazu holen kann(was ich eigentlich auch soll, also realloc verwenden), und dann auf *temp die nächsten tage speichern kann...
oder seh ich das falsch??
-
MandaJohn schrieb:
oder seh ich das falsch??
nee, das stimmt schon. mit 'realloc' kannste was dranhängen, allerdings kann's auch schiefgehen. deshalb nicht so:
void *p = malloc(...); ... p = realloc (p, ...); // wenn realloc fehlschlägt ist dein pointer futsch
sondern so:
void *p = malloc(...); void *q; // zwischenspeicher für realloc ... q = realloc (p, ...); // versuch noch was dranzuhängen if (q) p = q; // hat geklappt
-
@+fricky
du meinst es so:if('j' == getch()) { scanf("%lf", &tage); //sichern ist neuer pointer, und temp war der alte wo die ersten Tage drin sind if( NULL == (sichern = (double*)realloc(temp, _msize(temp) + werte_pro_tag * tage * sizeof(double)) )) { printf("\nEs konnte kein Speicher reserviert werden!"); exit(1); } temp = sichern; } else { printf("\n***Der reservierte Speicherplatz wurde wieder freigegeben***"); printf("\n***Das Programm wird beendet***"); }
ich hoffe ich versteh es jetzt richitg???
/Edit: was könnte denn der Grund sein das "realloc" nicht klappt? das man nicht genügend RAM hat?? oder auch was anderes??
-
MandaJohn schrieb:
/Edit: was könnte denn der Grund sein das "realloc" nicht klappt? das man nicht genügend RAM hat?? oder auch was anderes??
alles mögliche. über den grund schweigt sich realloc leider aus. sogar 'malloc' selbst kann scheitern.
-
Big Brother schrieb:
Das hier:
_msize(temp)
funktioniert nicht.
Ohoh, Bruder. Guckst du MSDN, dann siehst du es geht doch.
Die Funktion kannte ich bisher gar nicht.
:p
-
@B.B
Entschludige, aber ich bin gerade nicht bisschen schlauer geworden.
_msize(temp) geht nicht? damit wollte ich eigentlich nur die größe ermitteln, die schon reserviert ist.
Um dann was dazu hängen.
Aber ich google mal...
-
MandaJohn schrieb:
@B.B
Entschludige, aber ich bin gerade nicht bisschen schlauer geworden.
_msize(temp) geht nicht? damit wollte ich eigentlich nur die größe ermitteln, die schon reserviert ist.
Um dann was dazu hängen.
Aber ich google mal...Nö, ich habe mich geirrt. _msize geht, ich kannte die Funktion bisher nicht.
-
Leute ich will ja nicht nerven, aber leider stecke ich noch beim Einlesen der Werte. Irgendwie will das ding nicht.
Könntet ihr mir sagen obs denn so richtig ist, realloc zu verwenden(4 posts weiter oben der code)??
Ich komme irgendwie nicht drauf, wie das ding dann die Tage weiter zählen kann und ich da neue Werte einlesen könnte??Danke schonmal!
-
Das wird wie ein Array eingelesen, wie gehabt. Einfach mit dem Index weitermachen, mit dem du aufgehört hast. D.h. Index speichern oder über _msize berechnen.
-
Big Brother schrieb:
Nö, ich habe mich geirrt. _msize geht, ich kannte die Funktion bisher nicht.
ich auch nicht, aber das ist auch keine standard-funktion, sondern irgend so eine m$-windows-spezialität.