system()-Funktion mit gcc- Compiler



  • supertux schrieb:

    system() und gcc haben damit nichts zu tun, sondern die Shell Befehle/Programme PAUSE und cls gibt es in Unix nicht.

    mh ja stimmt, die console kannst ja nicht einfach so löschen, da müsst dann sowas wie strg+l her

    gibt es sonst eine möglichkein? statt system("PAUSE")?



  • für cls zumindest gibts eine alternative: system("CLEAR")



  • player4245 schrieb:

    für cls zumindest gibts eine alternative: system("CLEAR")

    das fuzt. bei mir nicht, kommt die gleiche Fehlermeldung wie vorher



  • Hast du es kleingeschrieben?



  • man: system gibt den Parameter einfach an das System weiter. Was das System damit macht ist systemabhängig! PAUSE und CLEAR sind DOS Commandos, die eben unter Linux nicht funktionieren.

    Bist du sicher, dass du diese Funktionalität wirklich benötigst? (Wenn du die Funktionen aus irgend einem Tutorial hast, würde ich dir zu einem anderen raten. Ist immer ein schlechtes Zeichen, wenn das verwendet wird)

    pause kannst du systemunabhängig durch folgende Funktion ersetzen

    #include <stdio.h>
    
    void wait ()
    {
        setvbuf(stdin,NULL,_IONBF,0);
        setvbuf(stdin,NULL,_IOFBF,BUFSIZ);
        getchar();
    }
    

    (und dann einfach wait() anstelle pause aufrufen, http://c-plusplus.net/forum/viewtopic-var-t-is-111042.html )

    Ein einfacher Ersatz für system("CLEAR") wäre die Verwendung von Escape Sequenzen

    void clear() {
      printf("\033[2j")
    }
    

    http://c-plusplus.net/forum/viewtopic-var-t-is-62523.html



  • aber den befehl clear gibts wirklich unter linux. Und wegen der der Plattformunabhängigheit hilft der Präprozessor.



  • player4245 schrieb:

    aber den befehl clear gibts wirklich unter linux. Und wegen der der Plattformunabhängigheit hilft der Präprozessor.

    den Befehl clear ja, CLEAR aber nicht!



  • rüdiger schrieb:

    (Wenn du die Funktionen aus irgend einem Tutorial hast, würde ich dir zu einem anderen raten. Ist immer ein schlechtes Zeichen, wenn das verwendet wird)

    das halte ich für ein gerücht. kannst du das begründen?



  • danke fuer eure antworten, diese threads hab ich nicht gefunden, sehr hilfreich!

    nur bei mir funktioniert das mit den escape-sequenzen nicht!

    bei mir gibt er stattdessen immer so ein komisches zeichen aus.

    es steht ja: (⚠ geht nur auf Terminals, wo die ANSI Escape Sequenzen aktiviert sind), kann das bei gcc der fall sein?

    PS: ich weiß nicht mehr woher ich das mit der system() funktion habe, aber aus keinem buch oder tutorial



  • falls du code für mehrere systeme schreibst, machst du so:

    #define LINUX
    
    #ifdef WIN32
    void cls()
    {
        system("cls");
    }
    #endif
    
    #ifdef LINUX
    void cls()
    {
        system("clear");
    }
    #endif
    
    #ifdef MY_OS
    void cls()
    {
        system("my_os_func");
    }
    #endif
    
    int main()
    {
        puts("kuckuck!");
        cls();
        getchar();
    
    return 0;
    }
    


  • danke, sowas ist echt hilfreich 🙂



  • hätt noch ne kurze frage:

    wenn das main.c ist (unten rufe ich die funktionen auf)

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <curses.h> 
    
    #include "clear.h"
    #include "global.h"
    #include "schuelerstruktur.h"
    #include "eingabe.h"
    #include "ausgabe.h"
    #include "suche.h"
    #include "aendernLoeschen.h"
    #include "aendern.h"
    #include "loeschen.h"
    #include "faecherAendern.h"
    
    /**********************************************************/
    /*                        Funktionskoepfe                 */
    /**********************************************************/
    void eingabe();    				// Schueler eingeben
    void ausgabe();    				// Schueler ausgeben
    void aendernLoeschen(void);    	// Wählen zwischen Schueler aendern oder loeschen  
    void faecherAendern(void);		// Faecher aendern
    

    und dass meine clear datei(clear.h):

    /* Leert den Bildschirm */
    /* Compile: gcc -lncurses clr.c  */
    #define LINUX
    
    #ifdef WIN32
    void clear() {
    	system("cls");
    } 
    #endif
    
    #ifdef LINUX
    void clear() {
    	setupterm(NULL, 1, NULL);
    	putp(clear_screen);
    }
    #endif
    

    die clear datei wird in anderen externen funktionen auch noch aufgerufen.
    dann kommt immer der fehler:

    In file included from schuelerverwaltung.c:12:
    clear.h:12: Fehler: In Konflikt stehende Typen für »wclear«
    /usr/include/curses.h:746: Fehler: Vorherige Deklaration von »wclear« war hier
    clear.h: In Funktion »wclear«:
    clear.h:14: Fehler: »clear_screen« nicht deklariert (erste Benutzung in dieser Funktion)
    clear.h:14: Fehler: (Jeder nicht deklarierte Bezeichner wird nur einmal aufgeführt
    clear.h:14: Fehler: für jede Funktion in der er auftritt.)
    huber@ubuntu:~/Desktop/gcc/Mehrere_Dateien/a$
    

    verstehe irgendwie nicht, hab schon alles ausprobiert und die curses.h datei habe ich ja schon eingebunden!

    mfg Sund0se



  • hab noch eine alternative gefunden:

    /*************************************/
    /* system("PAUSE") ersatz fuer LINUX */
    /*************************************/
    	#define MKFLAG(which) \
    	static int io_tio_set_flag_##which(int fd, int val, int on, int *old) \
    	{ struct termios tio; \
    		if (tcgetattr(fd,&tio)) return -1; \
    		if (old) *old=(tio.which & (val)); \
    		if (on) tio.which |= (val); \
    		else tio.which &= ~(val); \
    		if (tcsetattr(fd,TCSADRAIN,&tio)) return -1; \
    		return 0; \
    	} \
    	static int io_tio_get_flag_##which(int fd, int bit, int *value) \
    	{ struct termios tio; \
    		if (tcgetattr(fd,&tio)) return -1; \
    		*value=(tio.which & (bit)); \
    		return 0; \
    	}
    	MKFLAG(c_lflag)
    
    	static int 
    	read_character_now_without_echo(int fd, char *c)
    	{
    		int old_ICANON,old_ECHO;
    		int restoreflag=0;
    		int e=0;
    		int retcode=-1;
    		/* some devices do not support terminal flags. Notably:
    		 * /dev/disk|floppy
    		 * /dev/zero
    		 * ...
    		 * This function is able to handle them:
    		 */
    		if (-1==io_tio_set_flag_c_lflag(fd,ICANON,0,&old_ICANON)) {
    			if (errno!=ENOTTY 
    				&& errno!=EINVAL) { /* LINUX /dev/random lossage */
    				e=errno;
    				perror("Turnoff of ICANON failed");
    				errno=e;
    				return -1;
    			}
    		} else
    			restoreflag=1;
    		if (restoreflag && -1==io_tio_set_flag_c_lflag(fd,ECHO,0,&old_ECHO)) {
    			e=errno;
    			perror("Turnoff of ICANON failed");
    		} else {
    			if (restoreflag) restoreflag++;
    			while (1) {
    				retcode=read(fd,c,1);
    				if (retcode==1 || retcode==0) break;
    				if (errno==EINTR) continue;
    				break;
    			}
    		}
    		/* we do not check for errors anymore: If we were able to change
    		 * a flag before and are unable to do that afterwards then we
    		 * are in unsolvable trouble anyway.
    		 * btw, it _could_ happen, in case revoke() is summoned upon
    		 * us. Oh, well.
    		 */
    		/* set echo to old value */
    		if (restoreflag==2)
    			io_tio_set_flag_c_lflag(fd,ECHO,old_ECHO,NULL);
    		/* back to canonical input mode (line by line) */
    		if (restoreflag)
    			io_tio_set_flag_c_lflag(0,ICANON,old_ICANON,NULL);
    		errno=e;
    		return retcode;
    	}
    

    aufruf mit:

    int wait(void)
    {
    	#define UNIX
    
    	#ifdef UNIX
    	char c;
    	int r;
    
    	r=read_character_now_without_echo(0,&c);
    	if (r==-1) exit(1);
    	if (r) {
    		if (-1==write(1,&c,1)) 
    			perror("write");
    	}
    	return (0);
    	#endif
    
    	#ifdef WINDOWS
    		system("PAUSE");
    	#endif
    }
    

Anmelden zum Antworten