malloc problem
-
@BigBrother lol ziemlich creative variablen namen lol
aber danke, es läuft jetzt...
if( NULL == (pwerte = (double*)malloc ( tage * werte_pro_tag * sizeof (double))))
hab vor dem malloc noch das double ergänzt...das mit durchschnit hat wunderbar geklappt...hat sich also erledigt
gruß
manda
-
+fricky schrieb:
supertux schrieb:
int *tmp; ... temp = (int **)malloc(tage*sizeof(int *));
tmp
ist ein einfacher Zeiger, aber du reserviert Speicher für einen zweifachen Zeiger.
nö, sondern für mehrere zeiger. der cast zählt nicht, sondern das argument von 'malloc'
hm, ja, das hab ich gemeint, aber falsch ausgedruckt.
-
kleine ergänzung zum programm...hab den Luftdruck noch mit drin
ich möchte den benutzer fragen ob er noch einen weiteren tag eingeben möchte.
also soll mit realloc neuer speicher geholt werden und dann anschließend neue durchschnittswerte (für Temperaturen und Luftdruck) berechnet werden
allerdings soll er dann die tage dort weiter zählen, wo er am anfang aufgehört hat.
bsp.:
erst will ich nur 2tage eingeben(mit temperaturen und luftdruck) dann benutzer fragen ob noch ein tag eingegeben werden soll? wenn ja(bsp 1tag noch) dann soll er ab tag2 weiter zählen, also wären es 3tage und dann neu berechnenich geb mal mein code bis jetzt:
#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <malloc.h> int main(void) { double *temp = NULL; double *luft = NULL; int werte = 0; int werte_pro_tag = 3; int tage = 1; int i = 0; int j = 0; int k = 0; double summeT = 0.0; double summeL = 0.0; printf("F\201r wieviele Tage sollen die Messdaten eingelesen werden?"); printf("\nIhre eingabe: "); scanf("%d", &tage); printf("\n"); //Speicher für Temperaturen reservieren if( NULL == (temp = (double*)malloc(tage * werte_pro_tag * sizeof(double))) ) { printf("\nEs konnte kein Speicher reserviert werden!"); exit(1); } //Speicher für Luftdruck reservieren if( NULL == (luft = (double*)malloc(tage * sizeof(double))) ) { printf("\nEs konnte kein Speicher reserviert werden!"); exit(1); } for(i=0; i<tage; i++) { printf("\nTag: %d\n", i+1); for(j=0; j<werte_pro_tag; j++, k++ ) { printf(" Temperatur %d: ", j+1 ); while( 1 != scanf ( "%lf", &temp[k] )) { puts("Fehler in der Eingabe, bitte wiederholen!"); while(getchar () != '\n');//puffer leeren } while(getchar () != '\n'); } printf(" Luftdruck: "); scanf("%lf", &luft[i]); } printf("\n\n"); /* printf("Wollen Sie weitere Tage eingeben[j/n]?"); if('j' == getch()) { scanf("%lf", &tage); if( NULL == (temp = (double*)realloc(temp, _msize(temp) + tage * sizeof(double)) )) { printf("\nEs konnte kein Speicher reserviert werden!"); exit(1); } } else { printf("\n***Der reservierte Speicherplatz wurde wieder freigegeben***"); printf("\n***Das Programm wird beendet***"); }*/ for(i=0; i<=k; i++)//durchschnitt Temperaturen { summeT += temp[i]; } for(i=0; i<tage; i++)//durchschnitt Luftdruck { summeL += luft[i]; } summeT /= k; summeL /= (k/3); printf("\nDurchnittstemperatur \201ber %d Tag(e): %f", k/3, summeT); printf("\nDurchnittsluftdruck \201ber %d Tag(e): %f", k/3, summeL); free(temp); free(luft); printf("\n\n"); return 0; }
den teil mit realloc hab ich auskommentiert...weil ich mir nicht sicher bin ob ich es an der richtigen stelle machen und wie ich dann wieder die werte einlese??
hoffe ihr könnt mir noch helfen!!
danke schonmalgruß
Manda
-
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.