Forum: Mikrocontroller und Digitale Elektronik Casten von Poiner - möglich?


von C-Fragensteller (Gast)


Lesenswert?

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!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von C-Fragensteller (Gast)


Lesenswert?

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?

von Marwin (Gast)


Lesenswert?

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.

von Simon K. (simon) Benutzerseite


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

Marwin schrieb:
> Noch dazu, wo's hier stringent englisch mit "LAYERS" ja auch noch
> kuerzer gegangen waere.

Wat denn? Der korrekte Ansatz wäre

#define N 3
;-)

von (prx) A. K. (prx)


Lesenswert?

Marwin schrieb:
> Woher haben Softwareleute eigentlich diesen grausigen Abkuerzungsfimmel?

Haben sie gar nicht. Nur diejenigen, die in C programmieren. 
COBOL-Programmierer sind von Natur aus geschwätziger:
http://groups.engin.umd.umich.edu/CIS/course.des/cis400/cobol/hworld.html

von C-Fragensteller (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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;

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.