programm beendet sich selber - hilfe



  • wieso das denn? ich finde halt keinen fehler! suche wie bescheuert, kann mir niemand anders helfen? kann ja sein das du interpreter ihn auch nicht findest.



  • ???? schrieb:

    wieso das denn? ich finde halt keinen fehler! suche wie bescheuert, kann mir niemand anders helfen? kann ja sein das du interpreter ihn auch nicht findest.

    Kann ich auch nicht, weil in dem Sourcecode kein Fehler mehr drinnen ist. 🤡
    Bemängeln könnte man zwar, dass in main kein explizites return steht und das der Code einfach sinnfrei ist aber dennoch ist in ihm kein Fehler.



  • /*
    FIDB ist ein Filmarchiv.
    Man kann Filmnamen, Art, Codec usw. eintragen und dies dann auch
    abspeichern, ausdrucken oder auch in eine sql db eintragen lassen.
    */
    
    #include <stdlib.h>
    #include <stdio.h>
    
    #define MAX 101
    
    int fidblesen(); /*die db lesen*/
    int fidbschr(); /*in die db schreiben*/
    int fidbaen(); /*db ändern*/
    
    int main()
    
    {
    	int menua;
    
    	printf("FIDB - v. 0.1 - by err0r\n");
    
    	printf("Bitte waehlen sie ein Menupunkt aus.\n");
    	/*das menü*/
    	printf("1. FIDB lesen\n");
    	printf("2. FIDB schreiben\n");
    	printf("3. FIDB aendern\n");
    	/*printf("4. FIDB beenden\n"); nur bei windows*/
    	printf("\n");
    	scanf("%d",&menua);
    
    	switch(menua)
    	{
    		case 1: fidblesen();
    		break;
    
    		case 2: fidbschr();
    		break;
    
    		case 3: fidbaen();
    		break;
    
    		/*case 4: exit(0);
    		break; nur bei windows*/
    	}
    
       return(0);	
    /*getch 0; nur bei windows*/
    } 
    
    int fidblesen() /*die db lesen*/
    {
    }
    int fidbschr() /*in die db schreiben*/
    {
    int menuafidbschr;
    /*FILE *stdin;*/
    char filmname[MAX];
    int filmnr, filmcodec, filmart, filmsource, filmfsk, filmdatum;
    
    	printf("Film in die FIDB hinzufuegen.\n");
    	printf("\n");
    	printf("Eingabe:\n");
    	printf("Filmname:\n");
    	fgets(filmname, sizeof(filmname), stdin);
    
    }
    int fidbaen() /*db ändern*/
    {
    }
    

    So sollte es funktionieren.

    Möglicherweise wird das fgets() noch "übersprungen", da vom scanf() in main() noch ein RETURN im Eingabepuffer stehen könnte.

    Ist das der Fall?

    @interpreter
    Vom ANSI-C Standard her, war eindeutig noch ein Fehler drin!



  • AJ schrieb:

    @interpreter
    Vom ANSI-C Standard her, war eindeutig noch ein Fehler drin!

    Und wo?

    Mein Compileoutput:
    io - 0 error(s), 7 warning(s)

    ---------------------- Done ----------------------
    Build: 1 succeeded, 0 failed, 0 skipped



  • interpreter schrieb:

    [cpp]
    ...
    int fidbschr() /*in die db schreiben*/
    {
    #define MAX 101
    int menuafidbschr;
    /*FILE *stdin;*/
    char filmname[MAX];
    int filmnr, filmcodec, filmart, filmsource, filmfsk, filmdatum;

    printf("Film in die FIDB hinzufuegen.\n");
    printf("\n");
    printf("Eingabe:\n");
    printf("Filmname:\n");
    char* res = fgets(filmname, sizeof(filmname), stdin);
    return 0;
    }
    ...
    [/cpp]

    Genau da. Ein C++-Compiler schluckt das natürlich ohne murren.



  • hi.

    also hab das jetzt mal getestet so wie es AJ sagte. mit der zeile "fgets(filmname, sizeof(filmname), stdin);" nur es geht noch immer nicht.
    fehler krieg ich keinen.
    schaut:
    *
    dean@gentoo diverses $ gcc -o modbp2 modbp2.c
    modbp2.c:69:2: warning: no newline at end of file
    dean@gentoo diverses $ ./modbp2
    FIDB - v. 0.1 - by err0r
    Bitte waehlen sie ein Menupunkt aus.
    1. FIDB lesen
    2. FIDB schreiben
    3. FIDB aendern

    2
    Film in die FIDB hinzufuegen.

    Eingabe:
    Filmname:
    dean@gentoo diverses $*

    verstehs einfach nicht. jetzt ist es doch wirklich ansi c 😞 und vom code her ist doch alles richtig 😞 was kann da nur falsch sein?

    ciao



  • Schreib mal hinter fgets() noch einen Ausgabetext. Wenn dieser sofort kommt, ohne dass du was eingeben kannst, dann liegt es, wie schon gepostet, daran:

    AJ schrieb:

    Möglicherweise wird das fgets() noch "übersprungen", da vom scanf() in main() noch ein RETURN im Eingabepuffer stehen könnte.

    Abhilfe könnte durch das Ersetzen deines scanf() durch ein weiteres fgets() geschaffen werden. Wie man fgets() benutzt, solltest du ja jetzt wissen ;).



  • Warum eigentlich nicht einfach ein fflush auf stdin, wie ich es bereits erwähnt habe?
    Bei mir funktioniert das einwandfrei



  • @interpreter
    Das funktioniert auch meistens. Allerdings ist das Verhalten undefiniert. Es ist also nicht sicher, dass es überall so ist. Siehe dazu auch die FAQ.



  • hi.

    also wenn ich:

    fgets(menua,stdin);
    

    schreib gehts net. und net wenn ichs so schreib:

    fgets(menua, sizeof(menua), stdin);
    

    fehler:
    modbp2.c: In function main': modbp2.c:31: Warnung: passing arg 1 offgets' makes pointer from integer without a cast
    modbp2.c:70:2: Warnung: no newline at end of file

    und zeile 31 ist die in der ich aus dem scanf das fgets gemacht habe.
    cya



  • @ne

    ...
    int menua;
    char menu[10];
    ...
    fgets(menu, sizeof(menu), stdin);
    menua = atoi(menu);
    ...
    

    fgets() erwartet immer einen Zeiger auf char. Wenn du der Funktion dann mit einer Integervariablen kommst, meckert natürlich der Compiler ;).

    atoi() wandelt dir übrigens die Zahl im String in einen Integer um.


Anmelden zum Antworten