programm beendet sich selber - hilfe



  • Und was hat das mit dem hier vorliegenden Problem zu tun? Richtig: Nichts.

    Deshalb ist der Code trotzdem buggy. Und wenn ein Anfänger so einen Fehler in seinem Code hat, dann sollte man ihn doch darauf hinweisen, damit er es sich gleich angewöhnt, darauf zu achten.
    Und es ist ja nicht so, daß diese Art von Fehler keine Konsequenzen hätte.
    Stattdessen wurde ihm vorgeschlagen, gets() zu benutzen. Echt super 😞
    Das ist in etwas genauso toll, wie einen Blinden direkt auf eine stark befahrene Straße zu führen.



  • hi.

    okay dann erklär mir mal bitte wie ich das dann bei mir realisier? 😞
    versuch das grad schon, aber der code von der msdn sagt mir nur das etwas in ein file geschrieben wird, was ich ja net will. nur einlesen in das array.
    thx



  • ka schrieb:

    hm? msdn? ne nutz linux, daher auch standard C!
    was soll ich denn nu nehmen? fgets? oder was?
    so wie ich das versteh wird da ine datei geschrieben, aber das will ich doch gar net, nur EINLESEN (like scanf!!!) soll ich gets nehmen oder was jetzt?

    Und weil du Linux benutzt kannst du also nicht die msdn benutzen, soso...

    Wenn du mein Posting zuvor gelesen hättest, dann wüsstest du, dass wenn du für den Filepointer stdin übergibst du von der Std-Eingabe lesen kannst.



  • hi. also so:

    #include <stdio.h>
    
    int main( void )
    {
       FILE *stdin;
       char line[100];
    
          fgets( line, 100, stdin )
             printf( "%s", line);
    }
    

    so?



  • hm schrieb:

    hi.

    okay dann erklär mir mal bitte wie ich das dann bei mir realisier? 😞
    versuch das grad schon, aber der code von der msdn sagt mir nur das etwas in ein file geschrieben wird, was ich ja net will. nur einlesen in das array.
    thx

    char filmname[MAX]; 
    char* res = fgets(filmname, sizeof(filename), stdin);
    


  • hi.
    ne es geht so irgendwie auch nich, das kommt:
    *
    dean@gentoo diverses $ ./modbp
    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:
    Segmentation fault
    *

    und so sieht der code aus:

    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);
    
    }
    

    bye



  • ne schrieb:

    hi.
    [cpp]
    int fidbschr() /*in die db schreiben*/
    {
    #define MAX 101
    int menuafidbschr;
    *FILE stdin;
    [/cpp]

    Diese Zeile ist das problem.
    stdin ist eine globale Variable der C-Runtime. Durch deine eigene Deklaration 'überdeckst' du diese globale Variable, und wenn du später fgets aufrufst, übergibst du deine eigene 'stdin'-Variable statt der der C-Runtime.
    Einfach diese Zeile entfernen, und es sollte funktionieren.



  • ne schrieb:

    hi.
    ne es geht so irgendwie auch nich, das kommt:
    *
    dean@gentoo diverses $ ./modbp
    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:
    Segmentation fault
    *

    und so sieht der code aus:

    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);
    
    }
    

    bye

    Kommentier das FILE* stdin aus, dann sollte es gehen. stdin is einfach ein #define, das du nicht anlegen musst.



  • hi.
    ne leider nich. dann kommt nur das:
    *
    dean@gentoo diverses $ ./modbp
    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:
    Filmn
    dean@gentoo diverses $:
    *

    und der code is so(das FILE *stdin auskommentiert):

    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);
    
    }
    

    ciao

    ps: ist das ganze auch möglich mit einem dynamischem array? (okay, erstmal das ich das hier hinkriege)



  • hi schrieb:

    hi.
    ne leider nich. dann kommt nur das:
    *
    dean@gentoo diverses $ ./modbp
    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:
    Filmn
    dean@gentoo diverses $:
    *

    und der code is so(das FILE *stdin auskommentiert):

    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);
    
    }
    

    ciao

    ps: ist das ganze auch möglich mit einem dynamischem array? (okay, erstmal das ich das hier hinkriege)

    Dann hast du noch irgendwo anders einen Fehler, denn dieser Code ist, abgesehen davon, dass du nix returnst, richtig.



  • hi.

    okay dann hier der ganze code.
    ich finde aber 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>
    
    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*/
    	}
    
    /*getch 0; nur bei windows*/
    } 
    
    int fidblesen() /*die db lesen*/
    {
    }
    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);
    
    }
    int fidbaen() /*db ändern*/
    {
    }
    

    Ciao



  • Dass deine Funktionen keine Werte zurückgeben, wie ich bereits vorher angemerkt habe, sind schon mal Fehler 😉

    Ansonsten probier mal das:

    #include <stdlib.h> 
    #include <stdio.h> 
    
    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); 
        fflush(stdin);
        switch(menua) 
        { 
            case 1: fidblesen(); 
            break; 
    
            case 2: fidbschr(); 
            break; 
    
            case 3: fidbaen(); 
            break; 
    
            /*case 4: exit(0); 
            break; nur bei windows*/ 
        } 
    
    /*getch 0; nur bei windows*/ 
    } 
    
    int fidblesen() /*die db lesen*/ 
    { return 0;
    } 
    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;
    } 
    int fidbaen() /*db ändern*/ 
    { 
       return 0;
    }
    


  • hi.

    ne sorry 😞 hab das ganze wochenende probiert aber kriegs nich hin. jmd ne idee?

    danke 😞



  • hm schrieb:

    hi.

    ne sorry 😞 hab das ganze wochenende probiert aber kriegs nich hin. jmd ne idee?

    danke 😞

    Dann is dir nicht mehr zu helfen...



  • 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


Anmelden zum Antworten