www.mikrocontroller.net

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


Autor: dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
C++ nehmen? ;-)

Autor: dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
C++ <> C

Soll heißen in C gehts nicht?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja.

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ach bullsh*t

nicht Operatorüberladung, Überladung von Funktionen. UUps

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Frank

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

Einfachste Loesung: 3 verschiedene Funktionsnamen erfinden.

Autor: Frank Erdrich (erdi-soft)
Datum:

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

Autor: Frank Erdrich (erdi-soft)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
:)

Da war mal wieder einer schneller.

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mea maxima culpa. Es geht in der Tat nicht in c.

Autor: dennis (Gast)
Datum:

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

Autor: dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Christoph __ (chris)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

Matthias

Autor: Christoph __ (chris)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christoph __ (chris)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hier is doch das gcc forum, oder nicht?

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

Autor: dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Ewald (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.