1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

C: malloc auf struct anwenden

Discussion in 'Programmieren' started by BigSwopa, Dec 3, 2003.

Thread Status:
Not open for further replies.
  1. BigSwopa

    BigSwopa Byte

    Hallo erstmal!

    Ich hab vor ein paar Tagen schonmal das Programm hier gepostet. Das läuft auch unter Win NT4, aber nicht unter XP, weil da anscheinend die Speicherverwaltung ein wenig restriktiver ist. Das Resultat ist eine "General Protection Exception" in Zeile 138 in meinem Borland Turbo C++ 4.5 Compiler. Das passiert nach der Eingabe des "Preises" (Ferienwohung Buchungssystem).
    Hier hat mir bereits jemand gesagt, dass mir der Befehl "malloc" evtl helfen könnte, aber ich hab es bisher nicht geschafft malloc auf meine struct-Variablen anzuwenden.
    Ich hab es bisher so versucht:

    Zuerst einen Zeiger definieren:
    int * memory;

    memory=malloc(sizeof(struct fewo));

    Klappt aber nicht, da steht dann immer was von "cannot convert int to....".

    Wärt ihr so nett mir bei den zwei Zeilen weiter zu helfen?
    Ihr könnt auch gerne das Programm mal kompilieren und schauen wo der Fehler liegen könnte. Ich komme einfach nicht drauf! :-( Hab schon viel zu viele Stunden vor diesem Billig-Programm gesessen und hab irgendwie keinen Nerv mehr!


    Code:
    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <string.h>
    
     [b]struct fewo
      {
    	 char name[20];
    	 char email[30];
    	 char preis[2];
    	 float fpreis;
    	 short belegt;
      } kwoche[52];[/b]
    
     short dsatz;
    
    void buchung (void)
    {
     char index[2];
     short i;
     short len;
    
    
    do
    {
     do
      {
    	printf("\n\n\tIn welcher Kaldendarwoche möchten Sie verreisen?\n\n");
    	scanf("%s", &index);
    
    	 clrscr();
    
    	  for (i=0, len=strlen(index); i<len; i++)
    		 {
    			if ((index[i]>='a' && index[i]<='z') || (index[i]>='A' && index[i]<='Z'))
    			  {
    				 printf("Buchstabe(n) enthalten!");
    				 break;
    			  }
    		 }
    
      } while ((index[i]>='a' && index[i]<='z') || (index[i]>='A' && index[i]<='Z'));
    
    	  if (i>2 || (index[0]>'5' && index[1]>='0') || (index[0]>='5' && index[1]>'2') || !index[0])
    		 {
    			printf("Nur Eingaben von 1-52 erlaubt!");
    		 }
    
    } while (i>2 || (index[0]>'5' && index[1]>='0') || (index[0]>='5' && index[1]>'2') || !index[0]);
    
    
     dsatz = atoi (index);
    
    
    do
     {
      printf("\n\n\tBitte geben Sie Ihren Nachnamen ein:\n\n");
      scanf("%s", &kwoche[dsatz].name);
    
    	clrscr();
    
    	  if (strlen(kwoche[dsatz].name) > 20)
    		 {
    		  printf("Maximal 30 Zeichen erlaubt!");
    		 }
    
    	  for (i=0, len=strlen(kwoche[dsatz].name); i<len; i++)
    		 {
    			if (kwoche[dsatz].name[i]>='0' && kwoche[dsatz].name[i]<='9')
    			  {
    				 printf("Zahl(en) enthalten!");
    				 break;
    			  }
    		 }
    
     } while ((kwoche[dsatz].name[i]>='0' && kwoche[dsatz].name[i]<='9') || strlen(kwoche[dsatz].name) > 20);
    
    
    
    do
     {
      printf("\n\n\tIhre Emailadresse zur Reservierungsbestätigung:\n\n");
      scanf("%s", &kwoche[dsatz].email);
    
    	clrscr();
    
    	  if (strlen(kwoche[dsatz].email) > 30)
    		 {
    		  printf("Maximal 30 Zeichen erlaubt!");
    		 }
    			else if (strchr(kwoche[dsatz].email, '@')==0)
    			  {
    				 printf("Dies ist keine Emailadresse, @ fehlt!");
    			  }
    			else if (strchr(kwoche[dsatz].email, '.')==0)
    			  {
    				 printf("Dies ist keine Emailadresse, Punkt fehlt!");
    			  }
    
     } while (strlen(kwoche[dsatz].email) > 30 || strchr(kwoche[dsatz].email, '@')==0 || (strchr(kwoche[dsatz].email, '.')==0));
    
    
    do
     {
      printf("\n\n\tIhre Preisvorstellungen:\n\n");
      scanf("%s", &kwoche[dsatz].preis);
    
    	clrscr();
    
    	  for (i=0, len=strlen(kwoche[dsatz].preis); i<len; i++)
    		 {
    			if ((kwoche[dsatz].preis[i]>='a' && kwoche[dsatz].preis[i]<='z') || (kwoche[dsatz].preis[i]>='A' && kwoche[dsatz].preis[i]<='Z'))
    			  {
    				 printf("Buchstabe(n) enthalten!");
    				 break;
    			  }
    		 }
    
    	  if (strchr(kwoche[dsatz].preis, ',')!=0)
    			  {
    				 printf("Nachkommastellen bitte mit einem '.' trennen!");
    				 break;
    			  }
    
     kwoche[i].fpreis = atof (kwoche[dsatz].preis);
    
    	  if ( kwoche[i].fpreis > 9999.99 ||  kwoche[i].fpreis <= 0.01)
    		 {
    			printf("\nNur Eingaben von 0.01 - 9999.99 erlaubt!");
    		 }
    
     } while ( kwoche[i].fpreis > 9999.99 ||  kwoche[i].fpreis < 0.01 || (kwoche[dsatz].preis[i]>='a' && kwoche[dsatz].preis[i]<='z') || (kwoche[dsatz].preis[i]>='A' && kwoche[dsatz].preis[i]<='Z') || strchr(kwoche[dsatz].preis, ',')!=0);
    
    
     kwoche[dsatz].belegt=1;
    
    
    }
    
    
    void liste (void)
    {
     short i;
    
    	 clrscr();
    
      printf("KW\t\tName\t\tE-Mail Adresse\t\tPreis in EUR\n");
      printf("-----------------------------------------------------------------------\n");
    
    	  for(i=0; i<52; i++)
    		 {
    			if (kwoche[i].belegt==1)
    			  {
    				 printf("%d", i);
    				 printf("\t\t%s", kwoche[i].name);
    				 printf("\t\t%s", kwoche[i].email);
    				 printf("\t\t%4.2f", kwoche[i].fpreis);
    				 printf("\n");
    			  }
    		 }
    
    }
    
    
    void stornierung (void)
    {
      printf("\n\n\tHier können Sie eine Buchung stornieren.\n\n");
    }
    
    
    void zurueck (void)
    {
      printf("Bitte Taste drücken um zum Menue zurückzukehren...");
    	 getche();
    		clrscr();
    }
    
    
    int menue()
    {
     char auswahl;
    
    do
     {
      printf("\n\n\tFeWo Buchungssystem");
      printf("\n\n\n\t1. Gast einbuchen");
      printf("\n\t2. Buchung stornieren");
      printf("\n\t3. Buchungsliste anzeigen");
      printf("\n\t4. Programm beenden");
      printf("\n\t\n\n\n\tBitte wählen Sie:");
      auswahl = getche();
    
    	  switch (auswahl)
    		 {
    			case '1':  clrscr();
    						  buchung();
    						  zurueck();
    						  break;
    
    			case '2':  clrscr();
    						  stornierung();
    						  zurueck();
    						  break;
    
    			case '3':  clrscr();
    						  liste();
    						  zurueck();
    						  break;
    
    			case '4':  clrscr();
    						  printf("\n\n\tProgramm beendet! Bis bald!\n");
    						  exit(1);
    						  break;
    
    			default:   clrscr();
    						  printf("\n\n\tFalsche Eingabe!\n");
    						  break;
    		 }
     } while (auswahl !='3');
    
    }
    
    
    int main()
    {
      menue();
    }
    
     
  2. gargyle

    gargyle ROM

    DieFunktion ist so :

    void *malloc(size_t size);

    d.h.: malloc gibt standartmässig als Type void zurück.
    Du must den Type selber angeben.
    Das sollte natürlich irgendwie passen:

    int * memory;

    memory=(int *)malloc(sizeof(int));


    char * buffer;

    buffer = (char*) malloc (20);
     
Thread Status:
Not open for further replies.

Share This Page