casting Frage C

OP #5201720
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?
Moderator (Firma: Titel) Persönliche Seite #5201726
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?
Gast #5201727
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.
#5201732
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
#5201747
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
OP #5201751
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
}
Moderator (Firma: Titel) Persönliche Seite #5201803
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?

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