Forum: Mikrocontroller und Digitale Elektronik casting Frage C


von Jan H. (janiiix3)


Lesenswert?

1
/* Pointer Operator vor dem casting */
2
unsigned char add(void *x, void *y){
3
  return *(unsigned int*)x+=*(unsigned int*)y;
4
}
5
6
/* Pointer Operator nach dem casting */
7
unsigned char add(void *x, void *y){
8
  return (unsigned int*)*x+=(unsigned int*)*y;
9
}

Moin.
Die erste Funktion, funktioniert. Bei der Zweiten meckert der Compiler 
rum. Wieso?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Jan H. schrieb:
> Bei der Zweiten meckert der Compiler rum.
Wie denn? Was denn?

> Bei der Zweiten meckert der Compiler rum. Wieso?
Weil das Ergebnis der zweiten Addition ein Pointer ist und du diesen 
Pointer in einem char zurückgeben willst. Und weil es eigentlich sinnlos 
ist, zwei Pointer zu addieren...

Was sollte denn das Ziel der zweiten Operation sein?

von M. Н. (Gast)


Lesenswert?

Jan H. schrieb:
> Wieso?

Weil du anderen (falschen Code) schreibst.

Erstes: void pointer wird nach unsigned int gecastet und dann passend 
dereferenziert und verrechnet.

Im zweiten code, dereferenzierst du einen void Pointer. Der Compiler 
weiß gar nicht, was für ein Datentyp das genau ist. Und dann castest du 
das in einen pointer auf einen unsigned int. da stimmt einfach die 
Reihenfolge, wie du bereits bemerkt hast, nicht.

Deine erste Funktion liefert einen unsigned char zurück. Gerechnet wird 
aber mit unsigned ints. Das ist nicht so schön. eigentlich sollte der 
Compiler da auch 'ne Warnung ausspucken.

von Jan H. (janiiix3)


Lesenswert?

Das war jetzt eigentlich nur zum Verständnis. Die Funktionen brauche ich 
nicht, habe ich nur zum Lernen nachgebaut.

Wieso ist das addieren "sinnlos"?

von Richard T. (richi1901)


Lesenswert?

Bei der ersten Funktion weist du den Compiler an es zu einem unsigned 
int pointer um zu casten und diesen dann zu dereferenzieren.

Bei der zweiten Funktion versuchst du zu erst den void pointer zu 
dereferenzieren und diesen inhalt auf einen unsigned int pointer zu 
casten.

Nichts desto trotz beide return Werte sind unsigned char was in keinem 
Fall ein unsigned int sein kann bzw. ein unsigned int pointer (abhängig 
von der Architektur).

Viele Grüße

von Peter II (Gast)


Lesenswert?

Jan H. schrieb:
> Wieso ist das addieren "sinnlos"?

was soll denn rauskommen, wenn man 2 Pointer addiert?

von Jan H. (janiiix3)


Lesenswert?

Peter II schrieb:
> Jan H. schrieb:
>> Wieso ist das addieren "sinnlos"?
>
> was soll denn rauskommen, wenn man 2 Pointer addiert?

Der Inhalt?

von M. Н. (Gast)


Lesenswert?

Jan H. schrieb:
> Peter II schrieb:
>> Jan H. schrieb:
>>> Wieso ist das addieren "sinnlos"?
>>
>> was soll denn rauskommen, wenn man 2 Pointer addiert?
>
> Der Inhalt?

Es weiß doch wohl jeder, dass das Ergebnis in jedem Fall 42 ist.

von Jan H. (janiiix3)


Lesenswert?

M. H. schrieb:
> Jan H. schrieb:
>> Peter II schrieb:
>>> Jan H. schrieb:
>>>> Wieso ist das addieren "sinnlos"?
>>>
>>> was soll denn rauskommen, wenn man 2 Pointer addiert?
>>
>> Der Inhalt?
>
> Es weiß doch wohl jeder, dass das Ergebnis in jedem Fall 42 ist.

Sorry. 42?

von Stefan K. (stefan64)


Lesenswert?

Jan H. schrieb:
> Wieso ist das addieren "sinnlos"?

Ein Pointer ist eine Adresse.

Ein Index auf eine Adresse macht Sinn:
"Herrmannstraße 1 in Hamburg + 3 Häuser weiter"

Eine Subtraktion von Adressen macht noch manchmal Sinn, wenn die Adresse 
denselben Bezugspunkt hat, das Ergebnis ist ein Index:
"Herrmannstraße 21 in Hamburg - Herrmannstraße 7 in Hamburg"

Aber eine Addition von Adressen ergibt kein definiertes Ergebnis:
"Herrmannstraße 1 in Hamburg + Schöffelstraße 19 in Kassel"

Gruß, Stefan

von Jan H. (janiiix3)


Lesenswert?

Stefan K. schrieb:
> Jan H. schrieb:
>> Wieso ist das addieren "sinnlos"?
>
> Ein Pointer ist eine Adresse.
>
> Ein Index auf eine Adresse macht Sinn:
> "Herrmannstraße 1 in Hamburg + 3 Häuser weiter"
>
> Eine Subtraktion von Adressen macht noch manchmal Sinn, wenn die Adresse
> denselben Bezugspunkt hat, das Ergebnis ist ein Index:
> "Herrmannstraße 21 in Hamburg - Herrmannstraße 7 in Hamburg"
>
> Aber eine Addition von Adressen ergibt kein definiertes Ergebnis:
> "Herrmannstraße 1 in Hamburg + Schöffelstraße 19 in Kassel"
>
> Gruß, Stefan

Das war der Test. Das Ergebnis passt.
1
unsigned char a=1,b=2;
2
3
4
unsigned char add(void *x, void *y){
5
  return *(unsigned char*)x+=*(unsigned char*)y;
6
}
7
8
unsigned char addFunc(uint8_t (*funcPtr)(void*, void*),void *a, void *b){
9
  return funcPtr(a,b);
10
}
11
12
int main(void){  
13
14
  printf("%d", addFunc(add,&a,&b));
15
16
   return EXIT_SUCCESS;
17
}

von Peter II (Gast)


Lesenswert?

Jan H. schrieb:
> Das war der Test. Das Ergebnis passt.

aber nur durch ein zufall.

mache mal
1
unsigned char a=1,x=42,y=42,z=42,b=2;



%d und char passt auch nicht wirklich.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Jan H. schrieb:
> Das war der Test.
Wofür? Was wolltest du da testen?

> Das Ergebnis passt
Logisch, du addierst da ja auch keine Pointer, sondern das, worauf die 
zeigen:
1
  return *(unsigned char*)x+=*(unsigned char*)y;

BTW: "casting Frage C"
Im Codepad muss ich dafür C++ auswählen: http://codepad.org/Yk4t3cTx
Welchen Compiler verwendest du, dass das C ist?

von Jan H. (janiiix3)


Lesenswert?

Lothar M. schrieb:
> Jan H. schrieb:
>> Das war der Test.
> Wofür? Was wolltest du da testen?
>

Einfach um ein bisschen besser in C rein zu kommen.

> BTW: "casting Frage C"
> Im Codepad muss ich dafür C++ auswählen: http://codepad.org/Yk4t3cTx
> Welchen Compiler verwendest du, dass das C ist?

Ich benutze DevC++

von Dennis S. (eltio)


Lesenswert?

Jan H. schrieb:
> Ich benutze DevC++

Die Frage war welcher Compiler... nicht welche IDE. Und selbst da hast 
du keine genaue Angabe gemacht damit man sich das zur Not selber 
raussuchen kann (Bundle).

von Jan H. (janiiix3)


Lesenswert?

Dennis S. schrieb:
> Jan H. schrieb:
>> Ich benutze DevC++
>
> Die Frage war welcher Compiler... nicht welche IDE. Und selbst da hast
> du keine genaue Angabe gemacht damit man sich das zur Not selber
> raussuchen kann (Bundle).

Ahja.. Sorry!

TDM-GCC 4.9.2

von Dirk B. (dirkb2)


Lesenswert?

Peter II schrieb:
> %d und char passt auch nicht wirklich

Bei printf schon.
Bei variadischen Funktionen wird mindestens ein int übergeben.
https://de.wikipedia.org/wiki/Variadische_Funktion#C

Da ist eher %d und unsigned problematisch.

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.