Funktionsprobleme



  • hi, hab hier zwei Funktionen wo ich plötzlich rausfliege und nicht weiss warum ,vll kann mir ja einer helfen :

    int Tagspeichern(char I[],char A[],char S[],int J)
    {
    	struct list *zeiger = first;
    	int x;
    
    	if(first==NULL)
    	{
    
    			if((first=(struct list*)malloc(sizeof(struct list))) == NULL)
    			{
    				printf("Kein Speicher vorhanden!");
    				system("pause");
    				return main();
    			}
    			else
    			{
    				strcpy(first->Interpret,I);
    				strcpy(first->Album,A);
    				strcpy(first->Song,S);
    				first->Jahr = J;
    
    				system("cls");
    				printf("Sie haben diesen Tag gespeichert :\n\n");
    				printf("----------------------------------\n");
    				printf("Interpret: %s\n",I);
    				printf("Album: %s\n",A);
    				printf("Song: %s\n",S);
    				printf("Erscheinungsjahr: %d\n",J);
    				printf("----------------------------------\n\n");
    				printf("Bitte waehlen: \n");
    				printf("1 : Noch einen Tag eingeben\n");
    				printf("0 : Hauptmenue\n\n\n");
    				scanf("%d",&x);
    
    				if(x==1)
    				{
    
    				return Neuertag();   // 1.
    
    				}
    
    				if(x==0)
    				{
    				return main();
    
    				}
    
    			}
    
    	}
    
    return 0;
    
    }
    
    int Neuertag()
    {
    
    	int x=10;
    	char Interpret[50],Album[50],Song[50];
    	int Jahr;
    
    	system("cls");
    	printf("Interpret: ");
    	scanf("%s",&Interpret);
    	printf("Album: ");
    	scanf("%s",&Album);
    	printf("Song: ");
    	scanf("%s",&Song);
    	printf("Erscheinungsjahr (xxxx): ");
    	scanf("%d",&Jahr);
    
    	printf("\n\nEingegebener TAG :\n");
    	printf("----------------------------------\n");
    	printf("Interpret: %s\n",Interpret);
    	printf("Album: %s\n",Album);
    	printf("Song: %s\n",Song);
    	printf("Erscheinungsjahr: %d\n",Jahr);
    	printf("----------------------------------\n\n");
    	printf("Bitte waehlen: \n");
    	printf("1 : TAG speichern\n");
    	printf("2 : TAG neu eingeben\n");
    	printf("0 : Hauptmenue\n\n\n");
    	scanf("%d",&x);
    
    	if(x==1)
    	{
    
    	return Tagspeichern(Interpret,Album,Song,Jahr);  // 2.
    
    	}
    	if(x==2)
    	{
    	return Neuertag();
    
    	}
    
    return 0;
    }
    

    Wenn ich das Prog starte, dann geht das wunderbar. Allerdings wenn ich (1) wähle (siehe Markierung), dann fliege ich bei (2) raus. Ich bekomme keine Fehlermeldung oder sonstwas, ich flieg dort einfach raus. Allerdings erst nach dem zweiten Durchlauf, der erste Durchlauf funktioniert problemlos.
    Weiss einer was da schief läuft ?



  • hi, ich weis jetzt zwar nicht genau wo das Problem liegt, aber kannst du mir mal erklären warum du die main-Funktion in der Funktion Tagspeichern aufrufst??? Ich habe noch nie gesehen das man die main-Funktion selber aufruft! Oder meinst du mt main dein Hauptmenu?

    Und kannst du mal die deine main-Funktion mit posten?



  • Ja genau , die main ist mein Hauptmenü

    int main()
    {
    
    	int x=1;
    	char i;
    
    	while(x!=0)
    	{		
    				system("cls");
    				printf("\n");
    				printf("\t\t\t*** ID3-TAG Extraktor ***\n\n");
    				printf("\t\t\t          MENUE          \n");
    				printf("\t\t\t    ****************     \n\n\n");
    				printf("\t\t\t    1.Liste laden          \n\n");
    				printf("\t\t\t    2.TAG erstellen\n\n");
    				printf("\t\t\t    3.TAG suchen\n\n");
    				printf("\t\t\t    0.Exit                 \n\n\n\n");
    
    				printf("\t\t\t    Ihre Eingabe : ");
    				if(scanf("%d",&x))
    				{
    
    								switch(x)
    								{
    								case 1: 
    
    									return Ladeliste();
    									break;
    								case 2: 
    
    									return Neuertag();
    									break;
    								case 3:
    									return Suchetag();
    									break;
    								case 0:		
    									return Exit();
    									break;
    								default : 
    									system("cls");
    									printf("Falsche Eingabe!\n\n");
    									system("pause");
    
    									break;
    								}
    
    				}
    
    				else if(scanf("%c",&i))
    				{			
    							system("cls");
    
    							printf("Eingabe akzeptiert keine Buchstaben\n\n");
    							system("pause");
    
    				}
    
    	}
    
    }
    


  • ich glaube hier liegt ein Missverständnis vor... die main-Funktion rufst du nicht selber auf, sondern das macht das Betriebssytem! Und was noch viel wichtiger ist: wenn du die main-Funktion verlässt wird dein Programm auch beendet. In deinem speziellen Fall gehst du in die main rein und du gibst dann bestimmt '1', '2' oder '3' ein, damit rufst du die entsprechende Funktion auf. Diese Funktion wird abgearbeitet und da du jetzt 'return Funktions_Name()' geschrieben hast, wird die main verlassen und dein Programm beendet! Dein Programm stürtzt nicht ab, es beendet sich nur zu früh.
    Probier mal das return raus zu nehmen, könnte schon die Lösung sein! Wäre dann nur noch das Problem das du die Funktion(main) selbst nochmal aufrufst! Ich denke da wird es auch nochmal crashen...



  • Tatsächlich, ich habe überall das "return" weggenommen, jetzt flieg ich nicht mehr raus, aber lande wieder im Hauptmenü ^^

    Hmmm ich glaub ich muss das irgendwie alles nochmal ändern...



  • ist ja klar das du wieder im Hauptmenu landest, da du dich ja noch in der while-Schleife befindest!



  • Danke für deine Hilfe, hab bisher immer gedacht das das anders geht



  • Helf' doch gerne :>



  • Sry jetzt muss ich nochmal nachbohren. Irgendwie bekomm ich das nicht in den Griff.
    Kann ich die Funktion nicht nochmal aufrufen weil ich Sie bereits aufgerufen habe ?
    Irgendwie versteh ich nicht woran es liegt das ich beim zweiten mal im Hauptmenü lande...vorallem weiss ich auch nicht wie ich das ändere.



  • Eigentlich musst du ja auch gar nicht mehr die Funktion aufrufen... da du dich noch in der while-Schleife(die in der main) befindest und so lange x!=0 bleibst du ja im Hauptmenu! Mach einfach mal stat return main(); nur return;
    Und nein, du kannst sie überhaupt nicht selber aufrufen! Sie wird automatisch aufgerufen, wenn du das Programm startest.
    Weil du wieder im Hauptmenu landest:
    Hier mal ein prinzipeller Ablauf
    1. Programm starten -> Hauptmenu wird ausgegeben (du befindest dich in der while-Schleige)
    2. Du wählst einen Menu-Punkt und die entsprechende Funktion wird aufgerufen( z.B Suchetag() )
    3. Die Funktion wird abgearbeitet, es wird evt. ein Untermenu aufgerufen, und Funktion wird verlassen.
    4. Du kehrst wieder zurück in deine while-Schleife, du gehst aus der switch-Anweisung heraus, verläßt die if-Anweistung und die while-Schleifen-Bedingung wird neu geprüft ( x ist immer noch ungleich 0 ) und dein Hauptmenu wird wieder neu ausgegeben!
    sorry, wenn ich es etwas umständlich formuliert haben



  • Achso sry, ich hab mich wohl nicht gut ausgedrückt, ich meine nicht warum ich dir main nicht mehr aufrufen kann, sondern, warum kann ich hier :

    ...
    
    if(j==1)
    	{
    
    	Tagspeichern(Interpret,Album,Song,Jahr);
    
    	}
    
    ...
    

    die Funktion nicht nochmal aufrufen. Das geht irgendwie nur das erste mal, dannach lande ich immer in der main, anstatt das der die Funktion Tagspeichern() wieder aufruft.



  • Ich nehme mal an, dass die first Instanz global ist! Bei ersten Mal ist diese NULL, nun holst du dir Speicher (via malloc) und in first ist nun die Adresse auf den Speicher darauf! Beim zweiten Mal prüfst du wieder, ob first gleich NULL ist... was jetzt aber nicht mehr der Fall ist, sondern es hängt ja noch der vorher allokierte Speicher dran! Deswegen ist die Bedingung in der if-Anweisung falsch und du machst dann ja nur noch ein return 0;
    Von daher, find ich es nachvollziehbar, das du beim zweiten Mal sofort wieder im Hauptmenu landest. Ich weis jetzt nicht genau was du damit machen willst. Soll es eine Liste werden?



  • Ich nehme mal an(wegen dem Namen list^^) das es eine sein soll... dann musst du nach dem ersten Durchlauf, den Pointer auf das nächste Element setzt ( ein neues Element, 'mit einem NULL-Pointer?')!



  • Jo genau, is natürlich noch nicht fertig, bin mehr oder weniger grad am herumprobieren mit den zeigern. Du kannst recht haben, verdammt, hab da gar nicht mit gerechnet das es am zeiger liegt das es nicht klappt.



  • tjaja... manchmal Sieht man den Code vor lauter Pointer nicht, was?^^



  • hehe so ungefähr, obwohl ja atm noch human ist :p

    Na ok jetzt weiss ich wo ich ansetzen muss, also nochmal vielen vielen Dank , hast mir echt geholfen ( jetzt gehts ins Bett 😃 )


Anmelden zum Antworten