Forum: Mikrocontroller und Digitale Elektronik 3 StructWerte auf 0 abfragen?


von Marion (Gast)


Lesenswert?

Hallo,

kann man 3 Struktwerte auch anders auf 0 abfragen?

Mein struct-Array besteht aus 3 uint8_t Werten.

struct cRGB {uint8_t r; uint8_t g; uint8_t b; }
leds[10];

if(leds[0].r == 0 && leds[0].g == 0; leds[0].b == 0) { }

von Jim M. (turboj)


Lesenswert?

1
if (!(leds[0].r | leds[0].g  | leds[0].b)) { }

von Steph M. (stephh)


Lesenswert?

Was willst du damit erreichen? Man könnte beispielsweise die r,g und b 
aufaddieren und das ergebniss auf 0 überprüfen aber was solls bringen?

von Frank (Gast)


Lesenswert?

Die Struct um ein Byte erweitern.
Eine Union darüber legen mit der Struct und einem uint32.

Dann kannst du nur auf das uint32 == 0 abprüfen.

von Jakob (Gast)


Lesenswert?

Meintest du (3 Werte gleichen Typs auf NULL abfragen) das?

if(leds[0].r == 0 && leds[0].g == 0 && leds[0].b == 0) { }

Dann probier dies:

if ( (leds[0].r | leds[0].g | leds[0].b) == 0 ) { }

oder das:

if ( ! (leds[0].r | leds[0].g | leds[0].b) ) { }

Falls es der Compiler nicht schon selbst optimiert, spart
man einige Verzweigungen.

von Darius (Gast)


Lesenswert?

struct _tagRGB
{
#ifdef (ALIGNMENT == INTEL)
   UINT8 R;
   UINT8 G;
   UINT8 B;
   UINT8 dummy;
#elif (ALIGNMENT == MOTOROLA)
   UINT8 dummy;
   UINT8 B;
   UINT8 G;
   UINT8 R;
#endif

} T_STRUCTRGB;

union RGB
{
   T_STRUCTRGB  asUINT8;
   UINT32       asUINT32;
} T_UNIONRGB;



T_UNIONRGB color;


if ( color.asUINT32 == 0 )

oder

if (   (color.asUINT8.R == 0)
    && (color.asUINT8.G == 0)
    && (color.asUINT8.B == 0))
{
}

von Frank (Gast)


Lesenswert?

1
struct cRGB {uint8_t r; uint8_t g; uint8_t b; };
2
union ucRGB{uint32_t u32all; cRGB tRGB;};
3
4
ucRGB LEDs[10];
5
6
...
7
8
if( LEDs[i].u32all == 0 )
9
{
10
 ...
11
}

von Tom (Gast)


Lesenswert?

Marion schrieb:
> kann man 3 Struktwerte auch anders auf 0 abfragen?

Warum? Damit es schwieriger zu lesen ist und die albernen 13373n Tricks 
irgendwann Bugs verursachen? So schlau wie die Heldenvorschläge hier ist 
der Compiler selbst...
1
bool is_black (const struct cRGB* p)
2
{
3
    return p->r == 0 && p->g == 0 && p->b == 0;
4
}
5
6
7
if (is_black(&leds[0])
8
{
9
10
}

von Elke (Gast)


Lesenswert?

Tom schrieb:
> So schlau wie die Heldenvorschläge hier ist
> der Compiler selbst...

Was genau meinst du?

von Tom (Gast)


Lesenswert?

Elke schrieb:
> Was genau meinst du?

Dass halbwegs aktuelle Compiler so gut optimieren können, dass man bei 
einer simplen Abfrage genau das hinschreiben kann, was man meint, und 
das Bitschubsen dem Compiler überlässt. Wenn man so programmiert, kann 
man das auch in einem Jahr noch lesen.

von Jakob (Gast)


Lesenswert?

Da muss ich dem Tom zustimmen!

Mein Vorschlag kam, weil ich Hardware-Naher ASM-Bitfummler bin,
um GENAU zu wissen, wie viele Takte irgend eine Operation
braucht. In zeitlich eng begrenzten Anwendungen kann man damit
genau sagen, ob es noch SICHER funktioniert, oder eben MANCHMAL
nicht, wenn zufällig eine Interruptroutine mit ihre maximalen
Dauer dazwischenfunkt.

Ansonsten war ich auch schon erstaunt, wie gut mittelmäßiger
C-Code (selbst wenn er nicht so gut lesbar war, dass man nach
einem halben Jahr SOFORT sieht, worauf es ankommt) von guten
Compilern zeitlich optimiert wurde.

Ehrlich gesagt: Ich habe beim Lesen des ASM-Codes von
C-Funktionen schon einige Tricks gelernt, auf die ich nicht
so schnell selbst gekommen wäre!

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.