Array mit einem Befehl löschen?

#3498604
Lesenswert?

Christoph Herzog schrieb:
> Hallo,
> Kann man ein Array(i = 10) mit einem Befehl bzw. in einer Zeile
> löschen/alle werte null setzen?

Mit einem Array kann man fast gar nichts als ganzes machen.

> oder muss man jeden wert einzeln löschen???
> leider habe ich dazu nichts gefunden

du kannst memset() benutzen. Das macht konzeptionell auch eine SChleife, 
wenn es auch im Einzelfall andere Methoden (zb DMA) dafür benutzen kann.
#3498660
Lesenswert?

Christoph Herzog schrieb:
> Kann man ein Array(i = 10) mit einem Befehl bzw. in einer Zeile
> löschen/alle werte null setzen?

Ja. memset und Schleifen wurden bereits genannt. Wenn du das Array in 
eine Struktur packst, funktioniert auch folgende, schmutzige Lösung:
1
typedef struct{
2
  int Array[10];
3
}MyStruct;
4

5

6
int main(void){
7
  MyStruct a;
8

9
  a=(MyStruct){{0}};
10

11
  return 0;
12
}
Moderator #3498687
Lesenswert?

Da wir hier im GCC-Forum sind:

Beim GCC ist memset die zu bevorzugende Methode. Der Compiler wählt dann
je nach Größe des zu löschenden Speicherbereichs eine von mehreren
Alternativen aus:

Für kleine Speicherbereiche: Eine Folge mehrerer Move-Instruktionen wird
generiert, wobei die maximale Wortbreite de Prozessors genutzt wird.

Für größere Speicherbereiche: Eine Schleife wird generiert (beim x86
besteht diese nur aus einer einzigen Instruktion), wobei auch hier die
maximale Wortbreite de Prozessors genutzt wird.

Für große Speicherbereiche: Eine Bibliotheksfunktion wird aufgerufen,
die ggf. prüft, ob der Prozessor über Spezialfeatures (beim x86 bspw.
SSE2) verfügt, und diese bei Vorhandensein zur Beschleunigung einsetzt.

Entsprechend sollte man zum Kopieren von Arrays memcpy benutzen.
Moderator Persönliche Seite #3499156
Lesenswert?

zero schrieb:
> zum nullen kann man auch bzero statt memset bemühen:
> http://linux.die.net/man/3/bzero

Ich persönlich würde memset() immer vorziehen, denn es kommt 
ursprünglich aus der SYSV-Ecke, während bzero() aus der damaligen 
BSD-Welt stammt.

Ersteres ist damit POSIX-kompatibel, zweiteres nicht zwingend. Dass man 
zum Beispiel unter Linux beide Funktionen vorfindet, ist nur der 
Kompatibilität zu beiden damaligen Unix-Zweigen geschuldet.

Siehe auch unter Deinem zitierten Manpage-Link:

"Conforming to 4.3BSD.

This function is deprecated (marked as LEGACY in POSIX.1-2001): use 
memset(3) in new programs. POSIX.1-2008 removes the specification of 
bzero()."
#3499185
Lesenswert?

Quack schrieb:
> Du bist im GCC-Unterforum.

Und weiter? "GCC" allein bedeutet weder eine Aussage über die 
Programmiersprache, noch über die Hardware, noch über das verwendete 
Betriebssystem.

http://en.wikipedia.org/wiki/GNU_Compiler_Collection

Edit: Klar ist C am wahrscheinlichsten, aber wir wollen hier ja nicht 
immer herumraten müssen oder? Könnte ja genau so gut auch C++ sein, und 
da kann man Arrays zwar auch so verwenden wie in C, will man aber eher 
nicht.

Nochmal Edit: Die Zahl der Threads, die hier im falschen Unterforum 
gepostet wird, ist Legion. ;-)
#3500376
Lesenswert?

Anscheinend wollte der OP ein paar Zeilen oder Buchstaben in seinem 
Programm sparen.
Mit der Anzahl an Buchstaben und Zeilen, die hier ver(sch)wendet wurden, 
um zu antworten, hätte dieser die Schleife schon mindesten 10 x 
ausprogrammieren können.

Mehr Buchstabeneffizienz bitte :-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren