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
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.
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
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
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.
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++) |
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
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
1 | #include <array> |
2 | |
3 | int main () { |
4 | std::array<int, 42> myArray; |
5 | // löschen
|
6 | myArray = {}; |
7 | }
|
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
Mark Brandis schrieb: > in welcher Sprache und für welche Zielplattform sie > programmieren... Immer das Optimum annehmen, C++11 auf ARMv7M! **duck**
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; |
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. ;-)
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
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
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.