Christoph Zurnieden: (C) Was bedeutet (char *)?

Beitrag lesen

Hi,

Ist mir im Grunde genommen auch klar, aber dennoch weiß ich nicht ganz, was es im Code eigentlich bewirkt, wenn die dazugehörende Funktion, die ein Pixel am Bildschirm zeichnet, folgendermaßen aussieht:

Ich weiss ja,das es Dich beim Verstaendnis nicht viel weiterbringen wird, aber wer hat das verbrochen und warum?

void setpixel(SDL_Surface *surface, int x, int y, Uint8 R, Uint8 G, Uint8 B)    {
int bbp = surface->format->BytesPerPixel;

  
Was passiert wenn surface->format->BytesPerPixel nicht oder falsch belegt ist?  
Wird das vorher geprueft?  
  

> ~~~c
  

> Uint32 pixel = SDL_MapRGB(surface->format, R, G, B);  
> 

Wo wird der Rueckgabewert von SDL_MapRGB() geprueft oder gibt diese FUnktion zwingend etwas gueltiges zurueck?

//pixaddr ist die Adresse zum Pixel, das wir setzen wollen
Uint8 *pixaddr = (Uint8 *)surface->pixels + y *surface->pitch + x * bbp;

  
Die ersten beiden sind Sternchen sind Zeichen fuer Pointer, die beiden anderen sind Multplikationen. Wenn sowas oefter vorkommt waere es der Lesbarkeit dienlich den Praeprozessor zu beschaeftigen. Is aber natuerlich reine Geschmacksache.  
Es muss zwar nicht, kann aber hier zwei Probleme geben: einmal ein Vorzeichenproblem (wenn Uint8 "8 Bit langer vorzeichenloser Integer" bedeutet) wenn 'bbp' kleiner als 0 ist und zum zweitem, wenn bbp gleich Null ist. Bei letzterem wird auch der Pointer "genullt", ein spaetere Zuweisung ist dann nicht mehr moeglich.  
  

> ~~~c
  

> switch(bbp)    {  
> }  
> 

Auch wenn hier wahrscheinlich nicht noetig, dennoch fehlt ein default Zweig im switch().

Desweiteren glaube ich sogar, dass die Verzweigung case 3 fehlerhaft ist. Es wird zwischen big endian, und offensichtlich little endian unterschieden, aber dennoch wird den Indizes 2 x dasselbe zugewiesen. Müsste die else-Verzweigung nicht so aussehen?

pixaddr[0] = pixel & 0xff;
    pixaddr[1] = (pixel >> 8) & 0xff;
    pixaddr[2] = (pixel >> 16) & 0xff;

  
Das koennte moeglich sein, allerdings ist hin und wieder auch die Reihenfolge der Zuweisung wichtig, was aber dann auch in fast allen Faellen ein deutliches Zeichen von Murks ist. Duerfte aber wirklich nur ein C&P Fehler gewesen sein: Zeilen per C&P umsortiert, aber vergessen die Indizes zu aendern.  
Allerdings und nicht zuletzt deshalb ist jeglicher endianessabhaeniger Code auch dringend zu vermeiden!  
Erst wenn Du das beherrschst kannst Du es auch anders machen ;-)  
  
Zuletzt noch: bitte beschaeftige Dich mal ausfuehrlich mit Pointern. Das muss im Schlaf sitzen, wenn Du Dich naeher mit C beschaeftigen moechtest.  
Ich kann auch nicht oft genug die [C-FAQ](http://www.eskimo.com/~scs/C-faq/top.html) an's Herz legen.  
  
  
so short  
  
Christoph Zurnieden