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.
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?
> 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.
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).
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.