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

Eine eigene Frage? Dieser Thread ist über 8 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.