Casten von Poiner - möglich?

Gast #2735654
Hi,

ich kämpfe gerade ein wenig mit C. Ich habe folgende Strukturen und 
Variablen:
1
typedef struct frameLayer_t {
2
  uint8_t LED_1:1;
3
  uint8_t LED_2:1;
4
  uint8_t LED_3:1;
5
  uint8_t LED_4:1;
6
  uint8_t LED_5:1;
7
  uint8_t LED_6:1;
8
  uint8_t LED_7:1;
9
  uint8_t LED_8:1;
10
  uint8_t LED_9:1;
11
} frameLayer;
12

13
typedef struct frame_t {
14
  frameLayer layer1;
15
  frameLayer layer2;
16
  frameLayer layer3;
17
} frame;
18

19
frame frame1;
20
frame frame2;
21
volatile frame *currentFrame = &frame1;
22
volatile frame *nextFrame = &frame2;

Nun möchte ich an einer Stelle im Code jeweils nur auf eine Schicht 
(=Layer) zugreifen. Die Schicht auf welche ich zugreifen möchte ist in 
der Variablen "activeLayer" gespeichert, welche jeweils von null bis 
zwei hochgezählt wird. Das Ganze ist Teil einer ISR zum Multiplexen von 
LEDs. Zur Zeit mache ich das noch so:
1
  frameLayer activeFrameLayer;
2

3
  // Get address of activeLayer of currentFrame
4
  switch (activeLayer) {
5

6
    case 0:
7
      activeFrameLayer = currentFrame->layer1;
8
      break;
9
    case 1:
10
      activeFrameLayer = currentFrame->layer2;
11
      break;
12
    case 2:
13
      activeFrameLayer = currentFrame->layer3;
14
      break;
15

16
  }

Allerdings erscheint mir das unnötig kompliziert. Ist es irgendwie 
möglich auf das switch Konstrukt zu verzichten und einfach mit 
Pointer-Arithmetik (sowie Casting) zu arbeiten? Meine Versuche verliefen 
bisher im Sande, unter anderem habe ich z.B. so etwas versucht:

Bin was C angeht leider kein Profi, aber hier treibt sich sicherlich der 
ein oder andere herum ;).

Vielen Dank!
Persönliche Seite #2735662
C-Fragensteller schrieb:
> Allerdings erscheint mir das unnötig kompliziert. Ist es irgendwie
> möglich auf das switch Konstrukt zu verzichten und einfach mit
> Pointer-Arithmetik (sowie Casting) zu arbeiten?

Das geht viel einfacher:
1
#define LAYERANZ 3
2

3
typedef struct frame_t {
4
  frameLayer layer[LAYERANZ];
5
} frame;
6

7
...
8

9

10
activeFrameLayer = currentFrame->layer[activeLayer];

(Bereichsüberprüfung für "activeLayer" vorausgesetzt)

Wobei Du bei dieser Art des Zugriffs die "frameLayer"-Struktur 
kopierst, dessen bist Du Dir hoffentlich bewusst.
Persönliche Seite #2735682
Marwin schrieb:
> Rufus Τ. Firefly schrieb:
>
>> #define LAYERANZ 3
>
> Woher haben Softwareleute eigentlich diesen grausigen Abkuerzungsfimmel?
> Noch dazu, wo's hier stringent englisch mit "LAYERS" ja auch noch
> kuerzer gegangen waere.

HAHA! Genau das habe ich mich auch vorhin gefragt. Wollte aber keinen 
Post dazu schreiben ;-) So typisch.

Wie wärs mit
#define LAYER_COUNT
oder
#define LAYER_ANZAHL
#2735683
C-Fragensteller schrieb:
> Rufus Τ. Firefly schrieb:
>> Wobei Du bei dieser Art des Zugriffs die "frameLayer"-Struktur
>> kopierst, dessen bist Du Dir hoffentlich bewusst.
> Nein, bzw. ich weiß gerade nicht so recht was du meinst?

  den unterschied zwischen

  int j = 8;
  int i;

   i = j;
   i = 5;

i und j sind 2 verschiedene Variablen. Eine Zuweisung an i ändert j 
nicht. Zwischen i und j gibt es keinen Zusammenhang ausser dem, das i 
irgendwann mal eine Kopie des Wertes in j war.

  int j = 8;
  int *i;

   i = &j;
   *i = 5;

i ist ein Pointer auf j. Eine Zuweisung an *i ändert j

Dein Code sieht so aus, als ob du 2-teres gemeint haben könntest, aber 
ersteres geschrieben hast. Genau kann man es aber nicht sagen. Ist nur 
eine Vermutung.
Gast #2735691
Karl Heinz Buchegger schrieb:
> Eine Zuweisung an i ändert j
> nicht. Zwischen i und j gibt es keinen Zusammenhang ausser dem, das i
> irgendwann mal eine Kopie des Wertes in j war.
Ok, jetzt weiß ich natürlich was du meinst. Lässt sich das denn ändern, 
sodass ich nicht mit einer Kopie, sondern auch mit einer Referenz 
arbeite?
#2735697
C-Fragensteller schrieb:
> Karl Heinz Buchegger schrieb:
>> Eine Zuweisung an i ändert j
>> nicht. Zwischen i und j gibt es keinen Zusammenhang ausser dem, das i
>> irgendwann mal eine Kopie des Wertes in j war.
> Ok, jetzt weiß ich natürlich was du meinst. Lässt sich das denn ändern,
> sodass ich nicht mit einer Kopie, sondern auch mit einer Referenz
> arbeite?

In C gibts keine Referenzen. Aber es gibt Pointer.
1
  frameLayer * activeFrameLayer;
2
  activeFrameLayer = & currentFrame->layer[activeLayer];
3
  activeFrameLayer->LED_1 = 1;

oder gleich direkt
1
   currentFrame->layer[activeLayer].LED_1 = 1;

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.