Struct per Pointerzugriff befüllen

Gast #4368221
Lesenswert?
• ▲
▼
Hi, ich möchte in einem Struct alle Bits setzen. Es sollen also nachher 
alle uint8_t auf 255 und uint16_t auf 65535 stehen. Mehr Datentypen 
gibt's da auch nicht. Also keine Gefahr wegen Vorzeichen, etc.
Jetzt könnte ich die Variablen natürlich alle einzeln setzen. Ich muss 
aber Platz sparen. Leider ist memset auch zu groß. Deswegen habe ich 
folgendes geschrieben:

for (i = 0; i < sizeof(Data); i++) *(uint8_t *)(&Data+i) = 255;

Ist das korrekt so??? Die Größe wäre ok! Geht's "noch" schöner? Ist ein 
attiny.
Gast #4368255
Lesenswert?
• ▲
▼
Ben Banane schrieb:

> Leider ist memset auch zu groß.

In dem Fall würde ich ein eigenes memset() bauen, also deine Schleife in 
eine Funktion packen -- rein zwecks der Schönheit. Als Bonus spart das 
auch Platz, sobald du es mehr als einmal brauchst.
Persönliche Seite #4368259
Lesenswert?
• ▲
▼
Peter II schrieb:
> memset( &Data, 255, sizeof( sizeof(Data) );

Ein sizeof weniger.
1
struct irgendwas
2
{
3
  uint8_t etwas;
4
  uint8_t nochwas;
5
  uint16_t wasanderes;
6
  uint16_t nochwasanderes;
7
} Data;
8

9
memset(&Data, 255, sizeof (Data));

[edit]

memset soll zu groß sein?

Dann so:
1
struct irgendwas
2
{
3
  uint8_t etwas;
4
  uint8_t nochwas;
5
  uint16_t wasanderes;
6
  uint16_t nochwasanderes;
7
} Data;
8

9
uint16_t i;
10

11
for (i = 0; i < sizeof (Data); i++)
12
  ((uint8_t *) &Data)[i] = 255;

Das entspricht fast dem Vorschlag des Threadstarters, bis auf das 
Detail, daß der Index erst nach dem Typecast auf uint8_t* angewandt 
wird. Und das ist wichtig.
Gast #4368264
Lesenswert?
• ▲
▼
Wie gesagt, memset scheidet aus.

Also ist meine Schleife so korrekt? Ich könnte mit der Größe leben, 
störe mich momentan eigentlich nur an der Operation "+i", die Zweifel 
weckt, ob es noch kleiner ginge.
#4368280
Lesenswert?
• ▲
▼
Ben Banane schrieb:
> Ich könnte mit der Größe leben,
> störe mich momentan eigentlich nur an der Operation "+i", die Zweifel
> weckt, ob es noch kleiner ginge.

Schon mal geschaut, was der Compiler daraus macht?

Anderer Vorschlag:
1
uint8_t * Actual = (uint8_t *)&Data;
2
const uint8_t * const End = (const uint8_t *)(&Data + 1); // zeigt auf die erste Speicherstelle hinter Data
3
while(Actual != End){
4
  *Actual = 0xFF;
5
  Actual++;
6
}


Um zu prüfen, welche Variante weniger Speicher belegt, muss du das 
ASM-Listing anschauen. Rechne damit, dass es bei der nächsten 
Compilerversion wieder anders sein kann.

Antwort schreiben

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.

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.