Iguan schrieb:
> Könnt ihr mir sagen, was passiert
Wie oben schon gesagt: Der Compiler wird das nicht zulassen, sondern
eine Fehlermeldung ausspucken. Wenn Du nun, um den Compiler zu
überlisten,
1 | unsigned char myChar = 0;
|
2 | setBit((unsigned int *) &myChar, 5);
|
schreibst, dann zeigt Dein Pointer auf einen int, der etwas größer ist
als Dein myChar. Die aufgerufene Funktion schreibt dann undefiniert in
den Speicher, in der Regel hinter myChar.
Wenn Du nämlich schreibst:
1 | unsigned char myChar = 0;
|
2 | unsigned char check = 0;
|
3 | setBit((unsigned int *) &myChar, 5);
|
wirst Du (auf vielen Plattformen) beobachten können, dass der Wert der
Variablen "check" sich plötzlich geändert hat.
Aber mal eine Gegenfrage: Gehts um Arduino? Wenn ja, handelt es sich um
C++ und nicht um C. Hier hast Du folgende Möglichkeit, die Funktion
mehrfach zu implementieren, nämlich für verschiedene Typen von
Parametern:
1 | void setBit(unsigned char *var, unsigned char bitNo)
|
2 | {
|
3 | *var |= (1UL<<bitNo);
|
4 | }
|
5 |
|
6 | void setBit(unsigned int *var, unsigned char bitNo)
|
7 | {
|
8 | *var |= (1UL<<bitNo);
|
9 | }
|
10 |
|
11 | void setBit(unsigned long *var, unsigned char bitNo)
|
12 | {
|
13 | *var |= (1UL<<bitNo);
|
14 | }
|
Der C++-Compiler wählt dann automatisch die richtige Funktion aus, je
nachdem, mit welchem Parameter Du sie aufrufst.
Bei nacktem C müsstest Du die drei Funktionen unterschiedlich benennen,
also z.B. setBit_uchar(), setBit_uint() und setBit_ulong(). Du musst
dann selbst darauf achten, die richtige Funktion aufzurufen.