Portierung von C-Programm nach C++



  • In dem Buch "THE UNIX PROGRAMMING ENVIRONMENT" von den Unix- und c-Erfindern wird unter anderem dieses Program vorgestellt:
    (Fragen habe ich als Kommentare formuliert)

    #include <stdio.h>
    #include <ctype.h>
    int strip=0;
    
    main(argc, argv)
    	int argc;            // Was ist das fuer
    	char *argv[];        // eine Konstruktion?
    
    {
    	int i;
    	FILE *fp;            
    
    	while(argc > 1 && argv[1][0] == '-'){
    		switch(argv[1][1]){
    		case 's':
    			strip=1;
    			break;
    		default:
    			fprintf(stderr,"%s: unknown arg %s\n", argv[0], argv[1]);
    			exit(1);
    		}
    		argc--;
    		argv++;
    	}
    	if(argc==1)
    		vis(stdin);
    	else
    		for(i=1; i<argc; i++)
    			if((fp=fopen(argv[i],"r")) == NULL) {
    			fprintf(stderr,"%s: can't open %s\n", argv[0], argv[i]);
    			exit(1);
    		} else {
    			vis(fp);
    			fclose(fp);
    		}
    	exit(0);
    }
    
    vis(fp)            // Wo ist der return-type?
    	FILE *fp;
    {
    	int c;
    
    	while((c=getc(fp)) != EOF)        //was ist das denn fuer ne schleife
    		if(isascii(c) &&         // mit dem if im schleifenkopf ??
    			(isprint(c) || c=='\n' || c=='\t' || c==' '))
    			putchar(c);
    		else if(!strip)
    			printf("\\%03o",c)
    }
    

    Dieses Code ist, wie jeder sehen kann in C geschrieben.
    Koenntet ihr bitte Kommentare(auch Code) abgeben, wie man es in modern,
    effizient, effektiv, elegant, objektorientiert,C++ machen wuerde.
    Dabei stoert euch bitte nicht an den Adjektiven "elegant, effizient, effektiv", dass das immer nur die eigene Meinug sei.

    thx in advance



  • das

    main(argc, argv)
        int argc;            // Was ist das fuer
        char *argv[];        // eine Konstruktion?
    
    {
    

    ist der selbe müll wie das

    int main(int argc,char *argv[]){...
    

    zum wird wenn du den typ weglässt int angenommen und das andere ist so ne nachgelagerte typenbestimmung... die meisten kompiler haben probleme damit aber nach dem standard war das erlaubt...

    vis(fp)            // Wo ist der return-type?
    

    auch int als returntyp... kann einfach weggelassen werden weil int per default

    while((c=getc(fp)) != EOF)        //was ist das denn fuer ne schleife
    

    einfach ne ganz normale schleife... so lange das zeichen das nicht EOF ist...
    man könnte theoretisch auch while(getc(fp)!=EOF) machen aber dann kann man mit dem zeichen c nicht mehr innerhalb der schleife weiterarbeiten...

    if(isascii(c) &&         // mit dem if im schleifenkopf ??
    

    nein gehört nicht zu schleifenkopf. guck mal nach wieviele klammern auf und zu gehen.. das ist die einzige anweisung die zum inneren der schleife gehört da nicht geklammert wurde...



  • [EDIT] Wie immer nur zweiter... [/EDIT]

    Ich hab zwar jetzt keine Zeit und Lust, das ganze in C++ umzuschreiben, aber auf die Kommentare geh ich ein.

    main(argc, argv)
        int argc;            // Was ist das fuer
        char *argv[];        // eine Konstruktion?
    

    Mit dieser Konstruktion kannst du Parameter in der Konsole annehmen, z.B. "programm -param1". In C++ sieht das so aus:

    int main(int argc, char *argv[])
    
    vis(fp)            // Wo ist der return-type?
        FILE *fp;
    

    Das FILE *fp ist der return. In C++ sieht das so aus:

    FILE *vis(FILE *fp)
    {
        // ...
        return fp;
    }
    
    while((c=getc(fp)) != EOF)        //was ist das denn fuer ne schleife
    

    c wird mit einem Zeichen von fp gefüllt, es wird aber abgebrochen, wenn der File zu Ende ist.

    if(isascii(c) &&         // mit dem if im schleifenkopf ??
                (isprint(c) || c=='\n' || c=='\t' || c==' '))
    

    Wo ist hier if im Schleifenkopf? Der Schleifenkopf wurde schon geschlossen. Vielleicht irritiert dich die nicht gesetzte {-Klammer.



  • Das FILE *fp ist der return. In C++ sieht das so aus

    nein das ist blödsinn... int ist der returntyp... FILE* ist der typ des übergabeparameters...



  • Dann musst du mir die fehlenden Klammern und das Semikolon aber mal erklären.



  • Dann musst du mir die fehlenden Klammern und das Semikolon aber mal erklären.

    mach ich doch glatt 🤡

    int vis(FILE *fp); //deklaration
    int vis(FILE *fp){...}//definition
    


  • Entweder bin ich schon geistig am schlafen oder du redest Unsinn. Ich weiß nicht, was dein Codeschnipsel bringen soll.



  • also so ich nicht gerade auch nen geistigen tiefflieger habe ist

    int vis(FILE *fp); //deklaration
    

    das gleiche wie

    vis(fp)FILE *fp; //deklaration
    

    wo hingegen du bei ner definition dann klammern würdest...
    also so

    vis(fp)FILE *fp{...}
    

    oder auf lesebar geschrieben dann halt so

    int vis(FILE *fp){...}//definition
    


  • Mist, ich war bei einer vorgeschlagenen Spracherweiterung von C++. Das hätte so ausgesehen, bloß ohne das Semikolon und hätte die von mir beschriebene Wirkung gehabt.


Anmelden zum Antworten