Hi, ich grüble grad wie man in C einen Parameter mit unterschiedlichen Typen übergeben kann. also einmal funkt(char); oder funkt(int); oder funkt(string); usw Ich hab rausgefunden das man einen Void Pointer nehmen kann. Problem ist das ich in der Funktion weder Typ noch Größe ermitteln kann. Zumindest hab ich noch keine entsprechenden Funktionen gefunden die das könnten. Bei OOP Sprachen wie Delphi geht das meines Wissens. Da kann man den Objekttyp und die Objektgröße ermitteln. Gibt es in C etwas äquivalentes ohne der Funktion jedesmal Größe oder Typ als zusätzlichen Parameter übergeben zu müssen? grüße
"Soll heißen in C gehts nicht?" Geht nicht, gibts nicht. 1. Ein char wird atomatisch nach int konvertiert, da brauchts keine extra Funktion. 2. String gibts nicht unter C, es gibt nur Pointer auf char-Array. Mögliche Lösung: Der Funktion werden 2 Argumente übergeben, ist das erste ein Null-Pointer, dann wird der char- oder int-Wert als 2. Argument genommen, ansonsten der nicht-Null-Pointer auf ein Text-Array. Peter
P.S.: Grundsätzlich bin ich der Meinung, daß das Überlagern von verschiedenen Funktionen nur die Fehlerhäufigkeit erhöht und damit die Fehlersuche erschwert. Ich habe es lieber, wenn eine Funktion meckert, wenn ich ihr durch einen Schreibfehler versehentlich einen falschen Argumenttyp übergebe (z.B. &-Zeichen vergessen, wo ein Pointer erwartet wird). Das erspart einem haufenweise Stunden an Fehlersuche, warum eine Funktion nicht das tut, was man eigentlich vorhatte. Peter
Stichwort "Operatorüberladng". void funkt(char Zeichen) { ... //was auch immer mit dem zeichen geschen soll } void funkt(int zahl) { ....// funktion für integer } void funkt(char *string) { int i; i = atoi(string); funkt(i); } Der Compiler wählt dann je nach übergebenem Typ die passende Funktion auf.
ach bullsh*t nicht Operatorüberladung, Überladung von Funktionen. UUps
@Frank Schon. Nur leider spielts das in C nicht. Da musst Du schon C++ nehmen. Einfachste Loesung: 3 verschiedene Funktionsnamen erfinden.
Überladen von Funktionen geht aber nur in C++, nicht in C.
hm, ok, danke Leute. Dann muß ich mal weiter überlegen wie ich es machen kann
mal ne Frage: wenn ich C++ verwenden wollte, worauf kommt es da an? Worauf muß ich achten? Hat da schon jemand Erfahrung? Gibts schon irgendwo Beispiele?
> mal ne Frage: wenn ich C++ verwenden wollte, worauf kommt es da an?
Idealerweise kommt es darauf an, dass du dann in C++ schreibst und
nicht C/C++.
Soll heißen: Einen objekt-orientierten Ansatz und lieber viele kleine
statt großer Funktionen nutzen. Und die STL verwenden, man will ja
nicht das Rad zwei Mal erfinden. Und C-Funktionen meiden, also kein
malloc/free mehr, sondern new/delete, und kein printf mehr, sondern
cout.
Ein gutes Buch über C++ könnte auch nicht schaden, am einfachsten
schaut man erstmal in der nächsten (Uni-)Bibliothek.
Hi Chris, naja, zum einen schreibst du "C++ und nicht C/C++", zum anderen schreibst du "die STL verwenden". Ist ein Wiederspruch in sich. Ne, wenn C++ dann richtig. Dann erfinde ich das Rad lieber nochmal neu, sonst rattert und schlingert das Auto nur rum. C++ ist mir schon durchaus geläufig. Bücher und Online Tutorials hab ich zur Genüge. Was mir wichtiger ist: worauf ist in Verbindung mit dem AVR zu achten um nicht mehr Schaden zu verursachen als Nutzen zu bringen?
Hi warum ist die Verwendung von ordentlichem C++ und der STL ein Widerspruch in sich? Matthias
> naja, zum einen schreibst du "C++ und nicht C/C++", zum anderen > schreibst du "die STL verwenden". Ist ein Wiederspruch in sich. Kannst du mir das bitte erklären? Ich sehe darin trotz deiner Bemerkung keinen Widerspruch. Der C++-Standard definiert nicht nur die Syntax, die Semantik und ähnliches, sondern eben auch die STL. Die STL gehört also praktisch genauso zu C++ wie "if" und "while". > Ne, wenn C++ dann richtig. Dann erfinde ich das Rad lieber > nochmal neu, sonst rattert und schlingert das Auto nur rum. Zu "richtigem" C++ gehört nunmal die STL. Mittlerweile würde ich sogar behaupten, dass boost dazugehört, obwohl das noch nicht im Standard steht. boost implementiert allerdings z.T. schon sehr ausgefallene Sachen (ich sage nur boost::spirit), wo ich sehr gut verstehen kann, wenn man das erstmal per Hand machen möchte. Wirkliche Standard-Sachen wir std::list oder std::vector sollte man aber höchstens zu Übungszwecken mal selbst implementieren. Oder wenn man Performanceprobleme hat und sie nicht in std::* vermutet, sondern durch Messen dort nachgewiesen hat.
Wenn es eine STL für den AVR-GCC gibt die in C++ geschrieben ist is es ja in Ordnung. Dann hab ich nix gesagt
War dieser Thread vorhin auch schon im avr-gcc-Forum? Auf einem AVR sieht es natürlich etwas anders aus, da ist die STL vielleicht doch nicht so das Wahre (jedenfalls zur Zeit).
hier is doch das gcc forum, oder nicht? naja, mal schauen was sich so rausholen läßt
Nochmal ne Frage zu C++: soweit ich das bisher gesehen habe bekommt man erstmal nur das mit was der compiler selbst kann, also zb sizeof(). Alle anderen Sachen wie iostream usw fehlen. Seh ich das richtig? Ist da irgendwas in Arbeit? Wie schwierig/sinnvoll ist es die STL anzupassen und zu verwenden?
Um auf das eigentliche Thema zurückzukommen: Das Übergeben unterschiedlichert Typen an eine C-Funktion lässt sich mit etwas Aufwand hinbekommen: typedef enum { tui8, tui16, tui32, ti8, ti16, ti32, tstr, } typ; typedef struct { typ UnserTyp; union { uint8_t u8; uint16_t u16; uint32_t u32; // etc, }; } TypContainer; Nachteil: Vor Gebrauch muss der gewünschte Typ "eingestellt" werden und sizeof (TypContainer) ist sizeof (enum) + sizeof (größter enthaltener Typ). Geht aber ohne STL, Boost, iostream, SEH etc.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.