C Funktion mit Parametern unterschiedlichen Datentyps

OP #3221446
Hallo zusammen,
gibt es in C die Möglichkeit eine Funktion mit unterschiedlichen 
Datentypen auszuführen?

Beispiel:
1
uint8_t inc(uint16_t *var, uint16_t bottom, uint16_t top)
2
{
3
  if(*var<top)
4
  {
5
    ++(*var);
6
    return 0;
7
  }
8
  else
9
  {
10
    *var=bottom;
11
    return 1;
12
  }
13
}

Diese Funktion will ich mit uint8_t und uint16_t Variablen als 
Übergabeparameter ausführen können.

Gruß
Michael
OP
Hallo Peter,
wie würde das mit dem Makro gehen? Ich brauch nämlich einen 
Rückgabewert.
1
#define  inc(var, bottom, top)  ({if( (var) < (top) ){++(var); return 0;}  else{(var) = (bottom); return 1;} })
liefert
1
warning: ‘return’ with a value, in function returning void
und
1
error: lvalue required as left operand of assignment

Gruß
Michael
OP
Geht leider auch nicht.
1
games/X01.c:135:5: error: lvalue required as left operand of assignment
2
games/X01.c:135:8: warning: left-hand operand of comma expression has no effect
3
games/X01.c:135:5: error: lvalue required as left operand of assignment
4
games/X01.c:135:41: warning: left-hand operand of comma expression has no effect
5
games/X01.c:135:41: warning: statement with no effect

Der Aufruf sieht übrigens so aus:
1
if(inc(player, 1, numberofplayers)) inc(lap, 1, 99);
Gast
so geht es bei mir durch den Compiler, ob es geht habe ich nicht 
getestet

#define inc(var, bottom, top) ( (var) < (top) ? var++, 0 : (var=bottom, 
1) )
Gast
Und deswegen gibt es C++ und Meta-Programmierung:
1
template <typename T>
2
bool inc (T& var, T bottom, T top) {
3
  if (var < top) {
4
    var++;
5
    return false;
6
  } else {
7
    var = bottom;
8
    return true;
9
  }
10
}
Aufzurufen z.B. so:
1
uint8_t bla;
2
if (inc (bla, 2, 27)) {
3
}
oder:
1
uint16_t bla;
2
if (inc (bla, 2, 2217)) {
3
}
Oder beliebigen anderen Integer-Typen. Im Endeffekt wird für jeden 
angebenen Typ eine eigene Funktion speziell für diesen Typ erzeugt, die 
dann auch entsprechend effizient ist.

Dies ist dann auch typsicher, d.h. so etwas wird vom Compiler 
angemeckert:
1
uint8_t bla;
2
if (inc (bla, 2, 2217)) {
3
}
und hat einen eigenen Scope und Typ, im Gegensatz zum Makro, und ist 
deswegen vorzuziehen.
Gast
Peter II schrieb:
> er wollte aber
>
>> gibt es in C die Möglichkeit
Diese Anforderung hat er vermutlich nur angegeben weil er kein C++ 
kannte; er kann mit großer Wahrscheinlichkeit einfach seinen Code mit 
einem C++ Compiler compilen und die C-Kompatibilität von C++ nutzen.
OP
@Peter:
Jetzt kompilierts bei mir auch ohne Fehler und Warnung. Die Klammer um 
"var=bottom, 1" hat geholfen. Testen werd ichs aber heute nicht mehr. 
Vielen Dank für die Hilfe.

@Dr. Sommer:
Dass es in C++ mehr Möglichkeiten gibt war schon bekannt. Es ging 
wirklich explizit um C. Dennoch danke für den Post.
Gast
Übergebe einen Void-Pointer und carste das dann in der Funktion abhängig 
von dem, was Du erwartest:

int8 var8;
int16 var16;

void myFunction (void *var, int kind) {
  if (0 == kind) {
    int8 var8 = (int8) *var;
    ...
  } else {
    int16 var16 = (int16) *var;
    ...
  }
  ...
}


myFunction ((void *) &var8, 0);
myFunction ((void *) &var16, 1);

Rosa
Gast
Rosa-Kleidchen schrieb:
> Übergebe einen Void-Pointer und carste das dann in der Funktion abhängig
> von dem, was Du erwartest:
Diese C-Ineffizienz... Langsamer und am Ende auch noch größer als die 
C++ Template Version... Typunsicher sowieso.

Michael L. schrieb:
> Es ging
> wirklich explizit um C. Dennoch danke für den Post.
Wenn das nicht gerade eine Hausaufgabe ist in der steht "schreiben Sie 
in C..." gibt es eigentlich kaum einen Grund nicht einfach mit C++ zu 
compilen, die template-Funktion reinzuschreiben und den ganzen 
restlichen Code zu lassen wie er ist...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.