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.
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.
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.
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