Forum: Compiler & IDEs Array mit einem Befehl löschen?


von Christoph H. (obbedair)


Lesenswert?

Hallo,
Kann man ein Array(i = 10) mit einem Befehl bzw. in einer Zeile 
löschen/alle werte null setzen?
oder muss man jeden wert einzeln löschen???
leider habe ich dazu nichts gefunden

mfG   Christoph

: Verschoben durch User
von Karl H. (kbuchegg)


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.

von Christoph H. (obbedair)


Lesenswert?

vielen dank für die Antwort
ich denke das Array dann per "hand" zu löschen geht am schnellsten. bei 
10 Werten noch recht überschaubar

von Max H. (hartl192)


Lesenswert?

Christoph Herzog schrieb:
> oder muss man jeden wert einzeln löschen???
Ich würde das in einer Schleife machen:

for(i=0;i<10;i++)
  array[i]=0;

: Bearbeitet durch User
von Grübel (Gast)


Lesenswert?

Christoph Herzog schrieb:
> ich denke das Array dann per "hand" zu löschen geht am schnellsten

hmmm, das ist vom Datentyp und der Plattform abhängig.

von Grübel (Gast)


Lesenswert?

Max H. schrieb:
> for(i=0;i<10;i++)
>   array[i]=0;

for ( i = 0; i < sizeof ( array ), i++ )
...

von Grübel (Gast)


Lesenswert?

Grübel schrieb:
> sizeof ( array )

ne, Mist, das geht natürlich nicht bei > 8 Bit

von B. S. (bestucki)


Lesenswert?

Grübel schrieb:
> ne, Mist, das geht natürlich nicht bei > 8 Bit

Auch dafür gibt es eine Lösung:
1
for(i=0; i<sizeof(array)/sizeof(*array); i++)

von B. S. (bestucki)


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
}

: Bearbeitet durch User
von Yalu X. (yalu) (Moderator)


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.

: Bearbeitet durch Moderator
von Dr. Sommer (Gast)


Lesenswert?

1
#include <array>
2
3
int main () {
4
  std::array<int, 42> myArray;
5
  // löschen
6
  myArray = {};
7
}

von zero (Gast)


Lesenswert?

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

von Mark B. (markbrandis)


Lesenswert?

Yalu X. schrieb:
> Da wir hier im GCC-Forum sind:
>
> Beim GCC ist memset die zu bevorzugende Methode.

Echt jetzt? Auch für Fortran und Ada? ;-)

Hach, ich liebe Themenersteller die nicht dazu in der Lage sind zu 
sagen, in welcher Sprache und für welche Zielplattform sie 
programmieren... man könnte sagen, ich finde sie zum Schießen!
peng peng

: Bearbeitet durch User
von Dr. Sommer (Gast)


Lesenswert?

Mark Brandis schrieb:
> in welcher Sprache und für welche Zielplattform sie
> programmieren...
Immer das Optimum annehmen, C++11 auf ARMv7M! **duck**

von Mark B. (markbrandis)


Lesenswert?

Dr. Sommer schrieb:
> Immer das Optimum annehmen, C++11 auf ARMv7M! **duck**

Na klar! Der Themenersteller wollte das Array ja mit einem Befehl 
löschen, was in C++ ganz hervorragend funktioniert:

1
int *my_array = new int[5];
2
3
do_something();
4
5
delete [] my_array;

von Dr. Sommer (Gast)


Lesenswert?

Mark Brandis schrieb:
> Na klar! Der Themenersteller wollte das Array ja mit einem Befehl
> löschen, was in C++ ganz hervorragend funktioniert:
ja so kann man "löschen" natürlich auch interpretieren ;-) "löschen" as 
in "mit 0en überschreiben" s.o. ;-)

von Oliver (Gast)


Lesenswert?

Mark Brandis schrieb:
> Yalu X. schrieb:
>> Da wir hier im GCC-Forum sind:
>>
>> Beim GCC ist memset die zu bevorzugende Methode.
>
> Echt jetzt? Auch für Fortran und Ada? ;-)

Klar doch. ZUmindest für alle die, die Fortran und Ada-Programme mit gcc 
übersetzen, und daher iher Fragen in gcc-Forum posten ;)

Oliver

von Frank M. (ukw) (Moderator) Benutzerseite


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()."

: Bearbeitet durch Moderator
von Quack (Gast)


Lesenswert?

Mark Brandis schrieb:
> Hach, ich liebe Themenersteller die nicht dazu in der Lage sind zu
> sagen, in welcher Sprache und für welche Zielplattform sie
> programmieren...

Du bist im GCC-Unterforum.

von Mark B. (markbrandis)


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. ;-)

: Bearbeitet durch User
von Stefan R. (srand)


Lesenswert?

Quack schrieb:
> Mark Brandis schrieb:
>> Hach, ich liebe Themenersteller die nicht dazu in der Lage sind zu
>> sagen, in welcher Sprache und für welche Zielplattform sie
>> programmieren...
>
> Du bist im GCC-Unterforum.

Wo Ada und Fortran und MMIX(!) ontopic sind, solange es um den GCC geht.

von Klaus F. (kfalser)


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 :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.