mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bitte um Hilfe bei einem unverständlichen C-Code Abschnitt


Autor: noips (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo an alle!

Ich komme mit dem folgenden Code nicht klar. Ich habe nicht relativ 
wenig Erfahrung mit C.

#ifdef SPC3_FLAT
  #define SPC3_PTR_ATTR
#else
  #define SPC3_PTR_ATTR FAR
#endif

typedef unsigned char SPC3_PTR_ATTR * SPC3_PTR;

Habe mich jetzt mit den Präprozessor-Anweisungen bekannt gemacht und 
meine den oberen Abschnitt zu verstehen. Nicht klar ist mir die 
Typdefinition-Zeile unten. Wenn dieses "SPC3_PTR_ATTR" aus der 
define-Anweisung weiter oben nicht da wäre, so würde ich sagen, hier 
wird ein Typ namens "SPC3_PTR" definiert, der ein Zeiger auf ein 
unsigned char ist. Aber so wie es da steht, ist es mir ganz unklar. Ein 
erfahrenen C-Programmiere sieht hier evtl. gleich, was Sache ist. Darum 
möchte ich euch mal um Hilfe bitte.

Besten Dank im Voraus!!!!

Autor: noips (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Korrektur:

Wollte schreiben: Ich habe relativ wenig Erfahrung in C.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn nichts hinter dem Define steht, wird es eben durch nichts ersetzt.
Der Ausdruck expandiert also zu:

typedef unsigned char* SPC3_PTR;
oder

typedef unsigned char FAR* SPC3_PTR;


Peter

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

Bewertung
0 lesenswert
nicht lesenswert
noips schrieb:

> define-Anweisung weiter oben nicht da wäre, so würde ich sagen, hier
> wird ein Typ namens "SPC3_PTR" definiert, der ein Zeiger auf ein
> unsigned char ist.

Soweit gut analysiert.

> Aber so wie es da steht, ist es mir ganz unklar.

Ist zusätzlich das Makro SPC3_FLAT definiert (sowas wird meistens 
Projektweit zb beim Aufruf des Compilers definiert), dann wird jedes 
vorkommen des Textes SPC3_PTR_ATTR durch nichts (ein Leerzeichen) 
ersetzt. Ist hingegen SPC3_FLAT nicht definiert, so wird selbiges 
SPC3_PTR_ATTR durch den Text FAR ersetzt.

Zusammengenommen läuft es also darauf hinaus:
Ist beim das Makro SPC3_FLAT nicht vorhanden, so wird der Datentyp 
SPC3_PTR als typedef

typedef unsigned char FAR * SPC3_PTR;

ist hingegen SPC3_FLAT definiert, so lautet der typedef

typedef unsigned char * SPC3_PTR;

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

Bewertung
0 lesenswert
nicht lesenswert
Wenn SPC3_FLAT nicht definiert ist, dann

  typedef unsigned char * SPC3_PTR;

andernfalls

  typedef unsigned char FAR * SPC3_PTR;


FAR dürfte hier eine compilerspezifische Erweiterung sein, die Pointer 
mit größeren Adressräumen als dem üblichen zulässt; das ist auf 
Architekturen mit Segmentierung wie (16-Bit) x86 und manchen PICs eine 
übliche Vorgehensweise.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Spiel doch einfach selber Preprozessor, und schreib hin, was in beiden 
Fällen rauskommt.

SPC3_FLAT ist definiert: SPC3_PTR_ATTR wird durch  (sprich: nix) 
ersetzt:
typedef unsigned char * SPC3_PTR;

SPC3_FLAT ist nicht definiert: SPC3_PTR_ATTR wird durch FAR ersetzt:
typedef unsigned char FAR * SPC3_PTR;

Oliver

Autor: noips (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
B E S T E N  D A N K  an euch alle!!!

>FAR dürfte hier eine compilerspezifische Erweiterung sein, die Pointer
>mit größeren Adressräumen als dem üblichen zulässt; das ist auf
>Architekturen mit Segmentierung wie (16-Bit) x86 und manchen PICs eine
>übliche Vorgehensweise.

Also wenn FAR wirklich nur so eine Erweiterung ist, die Pointer mit 
größeren Adressräumen zulässt, dann kann ich ja (einfach zum Verstehen 
des Codes) mir diese ja auch "wegdenken" und davon ausgehen, dass 
"SPC3_PTR"  einfach ein Zeiger auf ein unsigned char ist, oder?

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

Bewertung
0 lesenswert
nicht lesenswert
noips schrieb:

> Also wenn FAR wirklich nur so eine Erweiterung ist, die Pointer mit
> größeren Adressräumen zulässt, dann kann ich ja (einfach zum Verstehen
> des Codes) mir diese ja auch "wegdenken" und davon ausgehen, dass
> "SPC3_PTR"  einfach ein Zeiger auf ein unsigned char ist, oder?

Ja.
Dabei handelt es sich einfach nur um eine technische Notwendigkeit auf 
manchen Architekturen. Logisch gesehen ist das irrelevant (auch wenn es 
furchtbar kracht, wenn man da einen Fehler macht).

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.