Forum: Mikrocontroller und Digitale Elektronik Pointerproblem


von Andreas E. (andrease112)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@ 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



von Uhu U. (uhu)


Lesenswert?

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

von Andreas E. (andrease112)


Lesenswert?

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

von Werner B. (Gast)


Lesenswert?

Dann mach halt einen ; hinter

p_pixel_attribute *p_Pixel

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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;


von Andreas E. (andrease112)


Lesenswert?

da iss eins habs beim kopieren vergessen

von Uhu U. (uhu)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.


von Andreas E. (andrease112)


Angehängte Dateien:

Lesenswert?

Ja glaub ich auch so langsam ich poste jetzt mal das File
die betreffende Stelle steht fast ganz unten

von Uhu U. (uhu)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Uhu U. (uhu)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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

von Andreas E. (andrease112)


Lesenswert?

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 ++;
          }
        }
      }
    }

von Andreas E. (andrease112)


Lesenswert?

BIN ICH ein DEPP DER * muss natürlich auf die andere seite *kopfhau

von Uhu U. (uhu)


Lesenswert?

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

von Andreas E. (andrease112)


Lesenswert?

ein schlauer mensch sage mal " Hilf Dir selbst... dann ist dir geholfen 
" ;)

von Andreas E. (andrease112)


Lesenswert?

es geht schon

von Uhu U. (uhu)


Lesenswert?

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.

von Andreas E. (andrease112)


Lesenswert?

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

von Simon K. (simon) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.