mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Pointerproblem


Autor: Andreas Engler (andrease112)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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



Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas Engler (andrease112)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann mach halt einen ; hinter

p_pixel_attribute *p_Pixel

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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;


Autor: Andreas Engler (andrease112)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
da iss eins habs beim kopieren vergessen

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.


Autor: Andreas Engler (andrease112)
Datum:
Angehängte Dateien:

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

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas Engler (andrease112)
Datum:

Bewertung
0 lesenswert
nicht 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 ++;
          }
        }
      }
    }

Autor: Andreas Engler (andrease112)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
BIN ICH ein DEPP DER * muss natürlich auf die andere seite *kopfhau

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Andreas Engler (andrease112)
Datum:

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

Autor: Andreas Engler (andrease112)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
es geht schon

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas Engler (andrease112)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger wrote:
> also entweder muss es
>
> pixel_attribute *p_Pixel;
>
> heissen, oder aber
>
> p_pixel_attribute *p_Pixel;

Öhem. Doch eher
pixel_attribute *p_Pixel;
heissen, oder aber
p_pixel_attribute p_Pixel;


>Freut mich, daß ich nicht der einzige bin, der diesen Quatsch nicht
>mag...

Dito!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.