C: malloc auf struct anwenden

Dieses Thema im Forum "Programmieren" wurde erstellt von BigSwopa, 3. Dezember 2003.

Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. BigSwopa

    BigSwopa Byte

    Registriert seit:
    3. August 2003
    Beiträge:
    74
    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

    Registriert seit:
    22. Juni 2007
    Beiträge:
    1
    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);
     
Status des Themas:
Es sind keine weiteren Antworten möglich.

Diese Seite empfehlen