Funktion für alle Datentypen?



  • Hallo ich habe ein paar Funktionen in meiner Bibliothek die genau das selbe machen. Kann ich anstatt diese beiden Funktionen z.b. double Add(double,double) und int Add(int, int) nicht eine Funktion haben für alle datentypen, so ehnlich wie bei den tamplets, size_t in C++?.



  • du könnest du void* pointern arbeiten aber so flexibel (wie du willst) wird wohl sehr schwer sein.



  • Wie soll denn das mit void* gehen? Du kannst damit doch nicht einaml eine lokale Variable vom Typ der Parameter erstellen.
    Die einzige Möglichkeit, die ich sehe, wäre mit Makros zu arbeiten. ZB

    #define DEFINE_ADD(T)\
        T Add(T a, T b)\
        {\
            T ergebnis = a;\
            ergebnis += b;\
            return ergebnis;\
        }
    
    DEFINE_ADD(short);
    DEFINE_ADD(int);
    DEFINE_ADD(long);
    DEFINE_ADD(long long);
    // etc.pp
    

    Dennoch, so flexibel wie mit Templates bist du damit auch nicht.

    edit:
    Ich sehe gerade, dass meine Idee in C ja gar nicht funktioniert, da es keine Funktionsüberladung gibt. Dann musst du halt noch den Funktionsnamen entsprechend anpassen. ZB

    #define DEFINE_ADD(T, unique)\
        T Add##unique(T a, T b)\
        {\
            T ergebnis = a;\
            ergebnis += b;\
            return ergebnis;\
        }
    
    DEFINE_ADD(short, _short);
    DEFINE_ADD(int, _int);
    DEFINE_ADD(long, _long);
    DEFINE_ADD(long long, _long_long);
    // etc.pp
    

    Und dann kannst du die Funktionen entsprechend aufrufen

    int a = Add_int(10, 20);
    


  • Hmm intressant ich werde es mal ausprobieren. Aber wass sollen diese "/" oder dieses ##unigue



  • Master User schrieb:

    Hmm intressant ich werde es mal ausprobieren. Aber wass sollen diese "/" oder dieses ##unigue

    '\' braucht man um ein Makro über mehrere Zeilen zu schreiben.

    '##' Ist eine Möglichkeit einer Textersetzung innerhalb eines Makros.

    @groovemaster:

    Als Funktion könnte man das auch schreiben, man müsste halt innerhalb der Funktion alle Datentypen deklarieren die man evtl. verwenden will, und dann den void * in den jeweiligen Typ casten. Dass das keine schöne Lösung ist, brauch ich glaube ich nicht erwähnen...



  • @groovemaster:

    Das mit "Variablen deklarieren" war natürlich Schwachsinn. Aber es geht wunderbar...
    so z.B.

    void weird_add(void * bla, void * blubb,void * result , const char * type)
    {
            if(!strcmp("float",type))
                    *(float *)result=  ((*(float *)bla) + (*(float *)blubb));
            if(!strcmp("int",type))
                    *(int *)result=  ((*(int *)bla) + (*(int *)blubb));
    }
    

    Bitte nicht steinigen 😃



  • Nun ich habe jetzt 3 problemme.

    1. Wie trenne ich eine Funktion damit ich ein teil in einer header Datei schreiben kann und ein anderen teil in eine .c Datei?. Ich habe alles versucht aber es klappt nicht.
    2. Wieso funktioniert das nicht? Also wie rufe ich eine andere funktion auf?. Die auch ein makro ist? ICh bekomme bei jeder if schleife ein fehler!
    #define DEFINE_ARRAYEMPTY(T, unique)\
    	bool ArrayEmpty##unique(T Array)\
    	{\
    		return (DBisa(Array,EMPTYARRAY));\
    	}
    DEFINE_ARRAYEMPTY(double **, _double);
    DEFINE_ARRAYEMPTY(int **, _int);
    
    #define DEFINE_ARRAYGETONE(T, unigue)\
    	T ArrayGetOne##unigue(T Array, long int xi, long int yj)\
    	{\
    		if(ArrayEmpty(Array))\
    		{\
    			printf("!!!Fatal Erroe!!! __FILE__ 000 000. O pinakas einai adios.\n");\
    			exit(EXIT_FAILURE);\
    		}\
    
    		//an mpikan arnitikes times
    		if(TCheckNeg(xi))\
    		{\
    			printf("!!!Fatal Error!!! __FILE__ 000 001. Entopistike arnitikh timh.\n");\
    			exit(EXIT_FAILURE);\
    		}\
    
    		//an mpikan arnitikes times
    #if CheckNeg(yj)##unigue
    
    			printf("!!!Fatal Error!!! __FILE__ 000 002. Entopistikh arnitikh timh.\n");\
    			exit(EXIT_FAILURE);\
    
    #endif
    
    		//An to x pollh megalo
    		if(xi > DArrayMaxX(Array,ZERO,wREAD))\
    		{\
    			printf("!!!Fatal Error!!! __FILE__ 000 003. Entopisthke pollh megalh timh.\n");\
    			exit(EXIT_FAILURE);\
    		}\
    
    		//An to y pollh megalo
    		if(yj > DArrayMaxY(Array,ZERO,wREAD))\
    		{\
    			printf("!!!FATAL ERROR!!! __FILE__ 000 004. Entopistike pollh megalh timh.\n");\
    		}\
    
    		//Return timh
    		return Array[xi][yj];\
    	}
    DEFINE_ARRAYGETONE(double **, _double);
    
    1. wieso bekomme ich anstatt bool zum Beispiel ein int zurück?
      int __cdecl TEqualunique(int ,int )

    Man dieses Makro zeug ist echt cool!.



  • TactX schrieb:

    Bitte nicht steinigen 😃

    Was anderes würde mir dazu aber nicht einfallen. 😃

    Master User schrieb:

    1. Wie trenne ich eine Funktion damit ich ein teil in einer header Datei schreiben kann und ein anderen teil in eine .c Datei?

    Was meinst du mit 'trennen'?

    Master User schrieb:

    1. Wieso funktioniert das nicht? Also wie rufe ich eine andere funktion auf?. Die auch ein makro ist? ICh bekomme bei jeder if schleife ein fehler!

    Schon wieder die berühmte if Schleife. 🙄
    Zudem wird sowas

    printf("!!!Fatal Erroe!!! __FILE__ 000 000. O pinakas einai adios.\n");
    

    nicht wie erwartet funktionieren. Makros (in diesem Fall __FILE__) werden innerhalb von String Literalen nicht aufgelöst. Eventuell hilft dir auch hier ##, zB

    printf("!!!Fatal Erroe!!! "##__FILE__##" 000 000. O pinakas einai adios.\n");
    

    Ich bin mir aber nicht sicher ob das funktioniert. Da musst du dir mal anschaun, wie diese 'Makros' vom Standard definiert werden, bzw ob es richtige Makros sind.
    Zum Problem, nehmen wir mal folgendes if Konstrukt

    if(ArrayEmpty(Array))\
            {\
                printf("!!!Fatal Erroe!!! __FILE__ 000 000. O pinakas einai adios.\n");\
                exit(EXIT_FAILURE);\
            }\
    

    ArrayEmpty gibt es nicht. Hier

    DEFINE_ARRAYEMPTY(double **, _double);
    DEFINE_ARRAYEMPTY(int **, _int);
    

    hast du ja ArrayEmpty_double und ArrayEmpty_int definiert. Womöglich hilft dir aber folgendes

    if(ArrayEmpty##unique(Array))\
            {\
                printf("!!!Fatal Erroe!!! __FILE__ 000 000. O pinakas einai adios.\n");\
                exit(EXIT_FAILURE);\
            }\
    

    (es heisst übrigens unique und nicht unigue)
    Ausserdem bin ich mir nicht sicher, ob du wirklich so einfach Kommentare innerhalb von solchen Makrodefinitionen einfügen kannst.

    Master User schrieb:

    1. wieso bekomme ich anstatt bool zum Beispiel ein int zurück?
      int __cdecl TEqualunique(int ,int )

    Weil TEqualunique nunmal int zurückgibt. Willst du bool, dann sollte die Funktion so aussehen

    bool TEqualunique(int, int)
    

    (und stdbool.h nicht vergessen)

    Master User schrieb:

    Man dieses Makro zeug ist echt cool!.

    Nicht wirklich. Es ist schwer zu warten, noch schwerer zu debuggen und nichts im Vergleich zu 'echten' C++ Templates. Natürlich haben auch Makros Vorteile, aber für sowas sind sie einfach zu beschränkt.


Anmelden zum Antworten