Hallo habe da mal eine Frage ich habe ein Array unsigned char Buffer[512] und ich habe einen pointer vom Typ typedef struct { unsigned char red; unsigned char green; unsigned char blue; }pixel_attribute, *pixel_attribute; pixel_attribute *p_Pixel ; Nun will ich mit diesem Pointer über das array laufen. warum geht folgendes nicht bzw. wie mach ich es richtig ? p_Pixel = Buffer
@ Andreas Engler >unsigned char Buffer[512] >und ich habe einen pointer vom Typ >typedef struct >{ > unsigned char red; > unsigned char green; > unsigned char blue; >}pixel_attribute, *pixel_attribute; >pixel_attribute *p_Pixel ; >Nun will ich mit diesem Pointer über das array laufen. >warum geht folgendes nicht bzw. wie mach ich es richtig ? >p_Pixel = Buffer Weil die Typen der Pointer unterschiedlich sind. Es fehlt ein type cast. Und ein Semikolon. ;-) p_Pixel = (pixel_attribute)Buffer; MFG Falk
> } pixel_attribute, *pixel_attribute;
Das geht natürlich nicht: pixel_attribute hat zwei verschiedene Typen.
Richtig wäre sowas:
} pixel_attribute, *ppixel_attribute;
Und wenn typecast, dann
p_Pixel = (pixel_attribute *)Buffer;
oder
p_Pixel = (ppixel_attribute)Buffer;
Allerdings bin ich mir im Moment nicht sicher, ob der typecast in C
notwendig ist. ANSI-C wird ihn wohl verlangen, das ursprüngliche K&R-C
nicht.
C++ fordert ihn auf jeden Fall.
typedef struct { unsigned char red; unsigned char green; unsigned char blue; }pixel_attribute, *p_pixel_attribute; p_pixel_attribute *p_Pixel p_Pixel = (p_pixel_attribute) Buffer; jetzt meckert er in der letzen Zeile syntax error expecting ; before Buffer ???? RATLOS
Na, das Semikolon fehlt am Ende der Zeile davor: typedef struct { unsigned char red; unsigned char green; unsigned char blue; }pixel_attribute, *p_pixel_attribute; p_pixel_attribute *p_Pixel <<<<< HIER FEHLT DAS SEMIKOLON! p_Pixel = (p_pixel_attribute) Buffer;
Dann lügt Dich Dein Compiler schamlos an ;-) Aber erfahrungsgemäß hat der Compiler immer recht, kann sich nur manchmal nicht präzise ausdrücken. Das liegt aber am Bottom-Up-Parsingverfahren, das in C/C++ - Compilern benutzt wird.
Andreas Engler wrote: > > typedef struct > { > unsigned char red; > unsigned char green; > unsigned char blue; > }pixel_attribute, *p_pixel_attribute; > > p_pixel_attribute *p_Pixel Der Datentyp p_pixel_attribute ist bereits ein Pointer. Was soll daher der zusätzliche * ? (Genau darum bin ich zum Gegner von Pointer-typedefs geworden. Die bringen nur Konfusion anstatt Klarheit) also entweder muss es pixel_attribute *p_Pixel; heissen, oder aber p_pixel_attribute *p_Pixel; > jetzt meckert er in der letzen Zeile syntax error expecting ; before > Buffer ???? RATLOS > da iss eins habs beim kopieren vergessen Dann kopier noch mal die ganze Sequenez herein. Aber diesmal mit Copy&Paste. Interessant ist die Zeile die in der Fehler- meldung genannt wird und die Zeile davor.
Ja glaub ich auch so langsam ich poste jetzt mal das File die betreffende Stelle steht fast ganz unten
Karl heinz Buchegger wrote: > (Genau darum bin ich zum Gegner von Pointer-typedefs > geworden. Die bringen nur Konfusion anstatt Klarheit) Freut mich, daß ich nicht der einzige bin, der diesen Quatsch nicht mag...
Uhu Uhuhu wrote: > Karl heinz Buchegger wrote: >> (Genau darum bin ich zum Gegner von Pointer-typedefs >> geworden. Die bringen nur Konfusion anstatt Klarheit) > > Freut mich, daß ich nicht der einzige bin, der diesen Quatsch nicht > mag... Ich denke ausprobiert hat das jeder C Programmiere irgendwann in seiner Karriere. Und die meisten lassen es dann ganz schnell wieder bleiben.
Karl heinz Buchegger wrote: > Ich denke ausprobiert hat das jeder C Programmiere irgendwann > in seiner Karriere. Und die meisten lassen es dann ganz schnell > wieder bleiben. Bei Kleinweich ist das Standard. Allerdings gibt es einen Fall, in dem die konsequente Definition von Pointertypen nützlich ist: Wenn man nachträglich Smartpointer einbauen will - geht aber nur mit C++. Ich vermute, der Grund für diesen Standard ist, daß viele Programmierer mit verschachtelten Pointertypen nicht klar kommen. Typedef Pointertypen machen solche Sachen Idiotensicher.
@Uhu zurück zum Problem. Siehst du in dem Code was? Ich hab mal drübergescrollt hab aber dann entschieden, dass ich nicht hergehen werde und den Code in einem Compiler meiner Wahl lauffähig zu machen. Wenn der Poster es nicht für notig hält die Zeile zu markieren, halte ich es auch nicht für nötig da mehr Energie als nötig hineinzustecken.
Dann halt noch mal auch für die die nicht unbedingt helfen wollen ... aber lieber nicht helfende kommentare schreiben ;) for(unsigned int akt_block=0;akt_block < ( blocks+1) ; akt_block++) { for( pixel_count_y = 480; pixel_count_y >0 ; pixel_count_y -- ) { for( pixel_count_x = 0; pixel_count_x < 640; pixel_count_x++) { SetPixel(pixel_count_y ,pixel_count_x , set_color(Pixel) ); // zeichne Pixel if( p_Pixel > Buffer + sizeof(Buffer) ) { // Block zu ende -> lade neuen block fat_read_file (Clustervar,Buffer,akt_block); p_Pixel = (p_pixel_attribute) Buffer; // <<<< Hier ist das Problem } else { // nächstes Pixel p_Pixel ++; } } } }
Wenn ich das richtig sehe, hast Du die Ursache noch nicht gefunden. Sieh Dir mal Deine Definition für p_Pixel an. Und nicht zu sehr *kopfhau, das tut der Grütze nicht gut...
Daß der Compiler jetzt keinen Fehler mehr meldet, heißt noch lange
nicht, daß alles richtig ist.
> p_Pixel = (p_pixel_attribute) Buffer; // <<<< Hier ist das Problem
Das ist falsch.
Poste mal die Definition für p_Pixel und die eben zitierte Zeile, so wie
Du sie jetzt hast. Dann wird man sehen, ob Dus hast oder nicht.
ich habe jetzt so gemacht: pixel_attribute *p_Pixel; p_Pixel = (pixel_attribute*) Buffer; ich meine ich programmier ja nicht seit gestern ;) aber manchmal bin ich mit den Pointern etwas durcheinander ;).... vor allem weil das nich mein Haupproblem ist ... habe jetzt ein ganz anderes... nämlich mit einer SD_Karte. Da habe ich es geschafft eine TXT datei zu lesen aber bei bmp funzt es nicht
Karl heinz Buchegger wrote: > also entweder muss es > > pixel_attribute *p_Pixel; > > heissen, oder aber > > p_pixel_attribute *p_Pixel; Öhem. Doch eher
1 | pixel_attribute *p_Pixel; |
heissen, oder aber
1 | p_pixel_attribute p_Pixel; |
>Freut mich, daß ich nicht der einzige bin, der diesen Quatsch nicht >mag... Dito!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.