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
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;
Gast
#3498629
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.
Gast
#3498633
Max H. schrieb: > for(i=0;i<10;i++) > array[i]=0; for ( i = 0; i < sizeof ( array ), i++ ) ...
Gast
#3498636
Grübel schrieb: > sizeof ( array ) ne, Mist, das geht natürlich nicht bei > 8 Bit
Grübel schrieb: > ne, Mist, das geht natürlich nicht bei > 8 Bit Auch dafür gibt es eine Lösung:
1 | |
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 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
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.
Gast
#3498693
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
Gast
#3498714
zum nullen kann man auch bzero statt memset bemühen: http://linux.die.net/man/3/bzero
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
Gast
#3498738
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 | |
2 | |
3 | |
4 | |
5 | |
Gast
#3498748
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. ;-)
Gast
#3499134
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()."
Gast
#3499173
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. ;-)
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 :-)
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.