3 StructWerte auf 0 abfragen?

Gast #4416640
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.
Gast #4416641
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))
{
}
Gast #4416647
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
}
Gast #4416650
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
}
Gast #4416675
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.
Gast #4416771
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!

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 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.