Pointerproblem

OP #547945
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
#547948
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


#547949
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.
#548003
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.

#548016
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.
#548026
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.
#548034
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.
OP #548048
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 ++;
          }
        }
      }
    }
#548077
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.
OP #548131
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.