malloc problem

@Bexx danke erstmal für den code....
ich mach mich gleich mal ran...

@deepthroat...sorry falls ich was falsches gesagt habe oder mich nich richtig ausgedrückt hab! war keine böse absicht!!

/EDIT: Danke es läuft jetzt auch ohne speicher zu reservieren....und danke für den hinweise printf kein %lf

gruß manda
 
@deepthroat...sorry falls ich was falsches gesagt habe oder mich nich richtig ausgedrückt hab! war keine böse absicht!!
Ist es denn so schwierig sich an die Netiquette zu halten? Insbesondere Punkt 15:

Unser Forum ist kein Chatroom. Kurz-Beiträge ("Ein-Zeilen Postings"), die einfach so ins Forum "geklatscht" werden, werden ohne Vorwarnung von einem Moderator oder Administrator gelöscht. Das gleiche gilt insbesondere für Beiträge, die in Rechtschreibung, Satzbau und Verständlichkeit nicht ein vernünftiges, allgemein übliches und altersgruppen-übergreifendes Niveau erfüllen. Jugendsprache, regional verbreitete Dialekte und durchgehend kleingeschriebene Beiträge sind ebenfalls unerwünscht. Mit anderen Worten: wer erfolgreich die im Deutsch-Unterricht erlernten Kenntnisse praxisnah auf unserem Forum anwenden kann, wird nicht mit dieser Regel in Konflikt kommen. "Wiederholungstäter" werden, nachdem sie zuvor von einem Moderator auf die Mängel hingewiesen wurden, ggf. unbefristet gesperrt.

Danke.
 
hallo jungs, nochmal eine frage wegen realloc
ich will einfach den benutzer fragen ob er noch einen tag eingeben möchte...falls ja, soll der speicher vergrößert bzw neu reserviert werden(realloc)
leider stecke ich da gerade und weis nicht wie ich die daten einlesen könnte...
ich kann zwar den speicher neu reservieren, allerdings fehlt mir die idee wie ich die daten eingabe mache...

hier der code (hab noch luftdruck mit drinne):
C++:
#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]);
   } 	

	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);
	
	/*Hier abfragen ob noch ein weiterer Tag eingegeben werden soll
	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***");
	}*/
	
	free(temp);
	free(luft);

	printf("\n\n");
	return 0;
}

den "neuen" teil(also wo ich realloc mache) habe ich auskommentiert, weil ich mir nicht sicher bin ob ich es an der richtigen stelle mache.
danach sollen die durchschnittswerte auch neu bestimmt werden.
bsp.:
1tag man gibt 3temperaturen ein und einen luftdruck
durchschnitt berechnen
dann benutzer fragen ob noch ein tag erwünscht ist? falls ja, wie viele tage denn?
hier: 1tag und man gibt wieder 3temperaturen + 1luftdruck ein
danach durchschnitt wieder berechnen (jetzt sinds allerdings ja 2tage und davon den schnitt)

leider komme ich hier überhaupt nicht weiter!! hoffe ihr könntet mir ein paar tips geben :)
danke schonmal im vorraus!!

gruß
manda
 
@deepthroat: ich versteh jetzt garnicht, was ich falsch gesagt/gefragt habe? also wenn du mir nicht helfen willst, dann ist es ja ok, ich hab ja nur gefragt.
Dachte dafür gibts auch ein Forum.
Ich weis nicht, warum du immer sagst, ich halte mich nicht an die Netiquette:confused:
Ich wollt dich nicht irgendwie angreifen oder so, war auch nicht böse gemeint vonr mir (falls ich denn was falsches gesagt haben sollte)
Wenn man mir nicht helfen will, ist es ja ok, dann frag ich auch nichts mehr.

Gruß
Manda
 
@deepthroat: ich versteh jetzt garnicht, was ich falsch gesagt/gefragt habe? also wenn du mir nicht helfen willst, dann ist es ja ok, ich hab ja nur gefragt.
Dachte dafür gibts auch ein Forum.
Ich weis nicht, warum du immer sagst, ich halte mich nicht an die Netiquette:confused:
Ganz einfach: weil du dich ignorant einfach nicht an die Netiquette hälst. Den Grund dafür kenne ich nicht. Zumal ich dir den entsprechenden Absatz genannt, dann sogar noch zitiert und die betreffende Stelle hervogehoben habe - damit du es nicht so schwierig hast die Netiquette zu finden und nicht noch auf einen Link klicken mußt. :rolleyes:

Komischerweise hast du ja jetzt die Umschalttaste gefunden... :suspekt:
Ich wollt dich nicht irgendwie angreifen oder so, war auch nicht böse gemeint vonr mir (falls ich denn was falsches gesagt haben sollte)
Du warst einfach nur unhöflich, da die Netiquette nicht beachtet hast, welche du allerdings bei der Anmeldung akzeptiert haben mußt.
Wenn man mir nicht helfen will, ist es ja ok, dann frag ich auch nichts mehr.
Das ist nicht nötig. Du kannst/darfst ruhig fragen. Aber halte dich einfach an die Regeln. Danke.

Gruß
 
@deepthroat:
Achso ok. Es liegt wohl an dem stil, wie ich schreibe. Gut, ich werde es ändern. Ich wollte nicht unhöflich und/oder ignorant sein!
Wollte auch nicht irgendwelche Regeln verletzen, die ich ja bei der Anmeldung akzeptiert habe.
Soll ich Zukunft nicht mehr vorkommen.

Gruß
Manda
 
Hi.
1tag man gibt 3temperaturen ein und einen luftdruck
durchschnitt berechnen
dann benutzer fragen ob noch ein tag erwünscht ist? falls ja, wie viele tage denn?
hier: 1tag und man gibt wieder 3temperaturen + 1luftdruck ein
danach durchschnitt wieder berechnen (jetzt sinds allerdings ja 2tage und davon den schnitt)

leider komme ich hier überhaupt nicht weiter!! hoffe ihr könntet mir ein paar tips geben :)
Es wäre evlt. angebrachter statt eines Arrays eine andere Datenstruktur, z.B. eine Liste, zu wählen.

Ansonsten müßtest du den bereits berechneten Durchschnitt einfach mit der Anzahl der Messwerte multiplizieren, die anderen Werte auf diese Summe noch dazu addieren und anschließend durch die Gesamtanzahl dividieren.

Gruß
 
Hallo,


ich habe zufällig mal etwas ähnliches geschrieben,. was dir in deinem Fall sicher weiterhilft, da es vom Konzept her ähnlich ist...
Du kannst dir einfach ableiten was du brauchst, auch im kommenden Beispiel habe ich Spendendurchschnitte berechnet mit neuen Eingaben usw...

Hier:

C++:
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <io.h>
#include <ctype.h> 


struct eingabe
{
	char vname[21];
	char nname[21];
	char adresse[60];
	char geb_dat[10];
	float betrag;
	char telefon[21];
};

int main(void)
{	
	int max = 2;
	float gesamt;
	int i = 0, nbr = 0, wahl = 0, zaehler = 0; 

	struct eingabe *liste;

	liste = (eingabe *)malloc(max * sizeof (eingabe));
    
	if (liste != NULL)
	{
		for (int j = 0; j < max; j++)
		{
			liste[j].betrag = 0;
			
		}
		gesamt = 0;

		while (true)
		{
			if (i < max)
			{	

				printf("Bitte Vornamen eingeben(max. 20 Zeichen): ");
				fflush(stdin);
				for (int x = 0; x < sizeof(liste[i].vname); x++)
				{
					liste[i].vname[x]= getchar();
					if (liste[i].vname[x] == 10)
					{
						liste[i].vname[x] = '\0';
						break;
					}
				}
				fflush(stdin);
				printf("\nBitte Nachnamen eingeben (max.20 Zeichen): ");
				for (int x = 0; x < 21; x++)
				{
					liste[i].nname[x] = getchar();
					if (liste[i].nname[x] == 10)
					{
						liste[i].nname[x] = '\0';
						break;
					}
				}
				fflush(stdin);
				printf("\nBitte Adresse eingeben (max. 60 Zeichen): ");
				for (int x = 0; x < 60; x++)
				{
					liste[i].adresse[x] = getchar();
					if (liste[i].adresse[x] == 10)
					{
						liste[i].adresse[x] = '\0';
						break;
					}
				}
				fflush(stdin);
				printf("\nGeburtsdatum im Format \"01.01.1999\": ");
				for (int x = 0; x < 11; x++)
				{
					liste[i].geb_dat[x] = getchar();
					if (liste[i].geb_dat[x] == 10)
					{
						liste[i].geb_dat[x] = '\0';
						break;
					}
				}
				fflush(stdin);
				printf("\nTelefonnummer im Format 123-456 eingeben: ");
				for (int x = 0; x < 21; x++)
				{
					liste[i].telefon[x] = getchar();
					if (liste[i].telefon[x] == 10)
					{
						liste[i].telefon[x] = '\0';
						break;
					}
				}
				fflush(stdin);
				printf("\nGeben Sie die Hoehe der Spende ein: ");
				scanf("%f", &liste[i].betrag);
				fflush(stdin);
				do
				{
					printf("\n\nWeitere Eintragungen machen? (1 = JA, 2 = NEIN) ");
					scanf("%d", &wahl);
				} while (wahl < 1 || wahl > 2);
				
				printf("\n\n");
				
				gesamt += liste[i].betrag;
				nbr = i+1;
				zaehler = i;
				if (wahl == 2)
				{
					printf("\nHauptmenue:\n");
					break;
				}
				i++;
			}	
			else 
			{
				struct eingabe * merke;
				merke = liste;
				liste = (eingabe *)malloc(2 * sizeof(eingabe));
				if (liste == NULL)
				{
					printf("Kein Speicher verfuegbar!\n");
					break;
				}
				for (int j = 0; j < max; j++)
				{
					liste[j] = merke[j];
				}
			max *= 2;
			free (merke);
			}
		}
		wahl = 0;
		while (wahl != 4)
		{
			printf("\n\n");
			printf("Waehlen Sie bitte aus: 1- Eintraege anzeigen\n");
			printf("                       2- Durchschnittliche Spendenhoehe pro Person\n");
			printf("                       3- Spenden gesamt\n");
			printf("                       4- Abbrechen\n");
			scanf("%d", &wahl);
			
			switch (wahl)
			{
			case 1:
			for (i = 0; i < (zaehler + 1); i++)
			{
				printf("\nSpender: %s %s  Geburtsdatum: %s", liste[i].vname, liste[i].nname, liste[i].geb_dat);
				printf("\nAdresse: %s", liste[i].adresse);
				printf("\nSpendenhoehe: %.2f Euro", liste[i].betrag);
				printf("\nTelefon: %s\n\n", liste[i].telefon);
			}
			break;

			case 2:
				printf("\nDurchschnittliche Spende p.P.: %.2f Euro\n\n", gesamt / nbr);
				break;
			
			case 3:
				printf("\nEs wurden insgesamt %.2f Euro Spenden eingenommen!\n\n", gesamt);
				break;
			
			case 4:
				printf("Auf Wiedersehen!\n");
				break;
			getch();
			return 0;
			}
		}
	}
	else
	{
		printf("Kein Speicher verfuegbar!\n");
	}
}

Hoffe du kannst damit etwas anfangen :)
 
@deepthorat: Liste soll ich nicht benutzen. Ist nur zur Übung mit malloc/realloc bisschen zu arbeiten. Deswgen mach ich das so.

@Bexx: Danke für den Code, ich gehe den mal durch und gucke mal, was ich da brauchen könnte.
Allerdings hätte ich in meinem Fall nur (so glaube ich es) einen letzten Schritt zu machen. Wenn du möchtest, kannst du dir den Code ja angucken (ausschnitt mit realloc):

C++:
printf("Wollen Sie weitere Tage eingeben[j/n]?");
	if('j' == getch())
	{
		scanf("%lf", &tage);
		//sichern ist vom Typ double, wo ich das zwischen speichern will
		if( NULL == (sichern = (double*)realloc(temp, _msize(temp) + werte_pro_tag * tage * sizeof(double)) ))
		{
			printf("\nEs konnte kein Speicher reserviert werden!");		
			exit(1);	
		}
               //wenn realloc geklappt hat
		temp = sichern;
	}
	else
	{
		printf("\n***Der reservierte Speicherplatz wurde wieder freigegeben***");
		printf("\n***Das Programm wird beendet***");
	}

Grübel gerade darum, wie ich die Werte hier noch einlesen kann, so dass er die Tage normal weiter zählt :confused:

Aber DANKE trotzdem mal!!

Gruß
Manda
 

Neue Beiträge

Zurück