Makros (zählen)



  • Hallo habe folgendes Problem ich habe eine protokoll.h

    #ifndef NDEBUG
    #include <iostream>
    int a = 0;
    static int o = 1;
    static int b = 1;
    
    	#define AUFRUF(func) \
    			a++; 
    	#define BERICHT \
    			cout << "Es wurden insgesamt " << (a) << " Funktionsaufrufe durchgefuehrt." << endl;
    #else
    	#define AUFRUF(func)
    	#define BERICHT
    #endif
    

    und eine main.cpp

    // Test der Makros aus protokoll.h
    #include <cstdlib>
    
    using namespace std;
    
    #include "protokoll.h"
    
    void aha(int i) {
    	AUFRUF(aha);
    	if (i > 0)
    		aha(i - 1);
    }
    void oho() {
    	AUFRUF(aha);
    	aha(1);
    }
    
    int main() {
    	aha(0);
    	oho();
    	aha(1);
    	BERICHT;
    	system("pause");
    	return 0;
    }
    

    nun möchte ich die Aufrufe der Funktionen zählen das dies raus kommt

    aha: 1. Aufruf
    oho: 1. Aufruf
    aha: 2. Aufruf
    aha: 3. Aufruf
    aha: 4. Aufruf
    aha: 5. Aufruf
    Es wurden insgesamt 6 Funktionsaufrufe durchgefuehrt.

    darf die main.cpp aber nicht verändern....

    wie geht das 😕



  • hmm so wie ich das jetzt schnell überfliege

    zählst du in a alle func aufrufe, egal ob aha oder oho
    und am schluss gibts du BERICHT aus und dann steht ja einmal dran wieviel insgesamt gemacht wurden

    macht doch z.b. ein stringvector einen globalen
    dann in jeder func baust du ne zeile ein

    meinvector.pusch_back("hier_der_func_name);
    

    dann, am schluss wo du BERICHT eingibst ne for schleife die dann die ganzen func namen ausgibt

    in der art wie

    for(int i = 0; i < meinvector.size(); i++)
    {
    cout << "Aufruf von der func:  " << meinvector[i] << endl;
    }
    

    naja oder du machst oben defines und gibts denen zahlenwerte z.b. 4711, 4712 uws die zahlen haben dann die fkt namen
    kansnt auch 1,2,3 nehmen dann den vector als short nehmen ( bei langen functionensnamen sparst dir speicherplatz )



  • ups sorry hab gerade gesehen, dass du die main nicht ändern darfst 😞
    wohl ne prof aufgabe was 😉



  • protokoll.h darfst du ändern?
    du weißt schon, dass du in defines so ziemlich alles hineinpacken kannst, was du willst?a
    auch statische variablen, ifs etc.

    ... eine seltsame aufgabe



  • ups, sorry, newkid. hab deinen beitrag aus versehen gelöscht.

    #include <cstdlib> 
    
    using namespace std; 
    
    //begin protokoll.h
    #include <iostream>
    
    #define AUFRUF(func)\
    {\
    	extern int BERICHTa;\
    	static int AUFRUF##func=0;\
    	++BERICHTa;\
    	++AUFRUF##func;\
    	std::cout<<#func<<": "<<AUFRUF##func<<".Aufruf"<<std::endl;\
    }
    
    #define BERICHT \
    {\
    	extern int BERICHTa;\
    	std::cout << "Es wurden insgesamt "<<BERICHTa<<" Funktionsaufrufe durchgefuehrt."<<std::endl;\
    }
    //end protokoll.h
    
    //begin protokoll.cpp
    int BERICHTa;
    //end protokoll.cpp
    
    void aha(int i) { 
        AUFRUF(aha); 
        if (i > 0) 
            aha(i - 1); 
    } 
    void oho() { 
        AUFRUF(oho); 
        aha(1); 
    } 
    
    int main() { 
        aha(0); 
        oho(); 
        aha(1); 
        BERICHT; 
        system("pause"); 
        return 0; 
    }
    


  • wir sagen alle

    "danke volkard"

    ist oki, denke meine lösung war falsch. oder so falsch war die gar nicht, oder?

    naja, aber seit wann machst du hausaufgaben? hehe 😉



  • tippfehler?
    auf jedenfall sieht C++ Neulings oho so aus:

    void oho() {
        AUFRUF(aha);
        aha(1);
    }
    


  • newkid schrieb:

    ist oki, denke meine lösung war falsch. oder so falsch war die gar nicht, oder?

    wenn ich mich recht erinnere war alles ok, außer daß du zwei strings mit == statt mit strcmp verglichen hast.


Log in to reply