Struct per Pointerzugriff befüllen

Gast #4368221
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
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
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
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
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.
Gast #4368305
Die (korrigierte) Schleife ist kleiner als memset und passt! 
Optimierungen sind natürlich an. Die Standardfunktionen sind halt nicht 
immer das Optimum.

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.