C Funktion mit Parametern unterschiedlichen Datentyps

#3221446
Lesenswert?

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
#3221488
Lesenswert?

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
#3221502
Lesenswert?

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 #3221507
Lesenswert?

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 #3221509
Lesenswert?

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.
#3221515
Lesenswert?

@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 #3221597
Lesenswert?

Ü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 #3221897
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren