mikrocontroller.net

Forum: Compiler & IDEs Array zurücksetzen auf default


Autor: Quacks (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

eine Frage, wie kann ich möglichst schnell ein komplettes Array 
"löschen"(d.h. Speicherzelleln auf 0x00 setzen)?

bei der Initialisierung/Deklarierung funktioniert das ja so,

volatile unsigned char data_array[7] ={0,0,0,0,0,0,0};

aber danach?

ist dies die einzige Möglichkeit?

for(i=7;i;i--)
   data_array[i-1] =0;


Danke und Grüße

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So:
memset(data_array, 0, sizeof (data_array));
(wenn data_array wirklich als Array deklariert und kein Zeiger ist)

oder so:
memset(data_array, 0, sizeof (unsigned char) * 7);

(dann kann data_array ein Pointer sein, aber das ist wegen der nun 
erforderlichen Angabe der Anzahl der Arrayelemente unelegant und eine 
potentielle Fehlerquelle)

Autor: Quacks (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Rufus,

ich hab mir mal beide Versionen in ASM angesehen, und denke, dass meine 
zugegebener Maßen unelegantere Schneller ist und dazu auch noch ca. 1/3 
kürzer. Das Verhältnis ändert sich natürlich zu meinen Ungunsten, wenn 
ich viele verschiedene Arrays mit verschiedenen Größen und dazu dann 
noch oft rücksetzen möchte.

Gruß

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das dürfte stark von der Implementierung von memset abhängen.

Ansonsten könnte Deine Schleife, wenn sie
for (i = 0; i < 7; i++)
  data_array[i] = 0;
formuliert ist, möglichweise etwas schneller werden, da beim 
Arrayzugriff in der Schleife keine Subtraktion mehr erforderlich ist.

Kann natürlich sein, daß das ein optimierender Compiler selber 
hinbekommt.

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei AVRs ist es manchmal besser mit Pointern zu arbeiten, denn *mem++=0 
kann der Compiler in st Z+, r24 umsetzen und mem[i]=0 wird worst case zu 
einer Addition von Arrayadresse und Offset und anschließenden st Z+, 
r24.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So sollte es eigentlich von vornherein memset machen ...

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> So sollte es eigentlich von vornherein memset machen ...

Ich habs zwar (noch) nicht geprüft, aber das
der Compiler bei memset schlechteren Code als
mit einer popeligen Schleife generiert mag ich
kaum glauben.

Ev. Optimizer nicht eingeschaltet?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.