Forum: Compiler & IDEs verschiedene Typen an eine Funktion übergeben


von dennis (Gast)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

C++ nehmen? ;-)

von dennis (Gast)


Lesenswert?

C++ <> C

Soll heißen in C gehts nicht?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ja.

von peter dannegger (Gast)


Lesenswert?

"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

von peter dannegger (Gast)


Lesenswert?

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

von Frank (Gast)


Lesenswert?

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.

von Frank (Gast)


Lesenswert?

ach bullsh*t

nicht Operatorüberladung, Überladung von Funktionen. UUps

von Karl H. (kbuchegg)


Lesenswert?

@Frank

Schon. Nur leider spielts das in C nicht.
Da musst Du schon C++ nehmen.

Einfachste Loesung: 3 verschiedene Funktionsnamen erfinden.

von Frank E. (erdi-soft)


Lesenswert?

Überladen von Funktionen geht aber nur in C++, nicht in C.

von Frank E. (erdi-soft)


Lesenswert?

:)

Da war mal wieder einer schneller.

von Frank (Gast)


Lesenswert?

mea maxima culpa. Es geht in der Tat nicht in c.

von dennis (Gast)


Lesenswert?

hm, ok, danke Leute. Dann muß ich mal weiter überlegen wie ich es machen
kann

von dennis (Gast)


Lesenswert?

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?

von Christoph _. (chris)


Lesenswert?

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

von dennis (Gast)


Lesenswert?

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?

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

warum ist die Verwendung von ordentlichem C++ und der STL ein
Widerspruch in sich?

Matthias

von Christoph _. (chris)


Lesenswert?

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

von dennis (Gast)


Lesenswert?

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

von Christoph _. (chris)


Lesenswert?

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

von dennis (Gast)


Lesenswert?

hier is doch das gcc forum, oder nicht?

naja, mal schauen was sich so rausholen läßt

von dennis (Gast)


Lesenswert?

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?

von Ewald (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.