Forum: Compiler & IDEs C Array auf Inhalt prüfen?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Atamer (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Hallo,

wie kann ich ein Array in C prüfen ob alle Werte darin 0 sind? Also ohne 
eine Schleife zu durchlaufen.

Atamer

von Der Andere (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Gar nicht

von Dussel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Der Andere schrieb:
> Gar nicht
Doch klar.
1
if(Array[0]==0&&Array[1]==0&&Array[2]==0&&  &&Array[n]==0)
2
{
3

4
}

von Genialer Programmierer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Atamer schrieb:
> Also ohne eine Schleife zu durchlaufen.

So:
1
if (elemnt[0] != 0)  err++;
2
if (elemnt[1] != 0)  err++;
3
if (elemnt[2] != 0)  err++;
4
if (elemnt[3] != 0)  err++;
5
if (elemnt[4] != 0)  err++;
6
if (elemnt[5] != 0)  err++;
7
if (elemnt[6] != 0)  err++;
8
9
// usw.

Braucht kaum Speicherplatz und geht ganz ohne Schleife.

von Mugga (Gast)


Bewertung
0 lesenswert
nicht lesenswert
1
...
2
m = 0;
3
m |= a[0];
4
...
5
m |= a[n];
6
...

von Mark B. (markbrandis)


Bewertung
0 lesenswert
nicht lesenswert
Dussel schrieb:
> Der Andere schrieb:
>> Gar nicht
> Doch klar.
>
>
1
if(Array[0]==0&&Array[1]==0&&Array[2]==0&&  &&Array[n]==0)
2
> {
3
> 
4
> }
5
>

Genialer Programmierer schrieb:
> Atamer schrieb:
>> Also ohne eine Schleife zu durchlaufen.
>
> So:
>
>
1
> 
2
> if (elemnt[0] != 0)  err++;
3
> if (elemnt[1] != 0)  err++;
4
> if (elemnt[2] != 0)  err++;
5
> if (elemnt[3] != 0)  err++;
6
> if (elemnt[4] != 0)  err++;
7
> if (elemnt[5] != 0)  err++;
8
> if (elemnt[6] != 0)  err++;
9
> 
10
> // usw.
11
> 
12
>
>
> Braucht kaum Speicherplatz und geht ganz ohne Schleife.

Der 1. April war doch schon. ;-)

Was wenn das Array z.B. 256 Elemente hat? 256 Zeilen Code hinschreiben 
oder wie? Das macht doch kein normaler Mensch.

: Bearbeitet durch User
von Mark B. (markbrandis)


Bewertung
0 lesenswert
nicht lesenswert
Atamer schrieb:
> Hallo,
>
> wie kann ich ein Array in C prüfen ob alle Werte darin 0 sind? Also ohne
> eine Schleife zu durchlaufen.

Warum sollte es ein sinnvoller Ansatz sein, keine Schleife zu verwenden? 
Das ist genau die Standardlösung, die immer und ohne Probleme 
funktioniert. Da braucht man schon einen guten Grund um davon 
abzuweichen.

von Der Andere (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Wie kann ich ein Auto bauen das keine Räder hat.

Und jetzt nicht kommen mit: Ich bau eins das fliegt, wenn es fliegt ist 
es ein Flugzeug, kein Auto, wenn es schwimmt ist es ein Boot, ...

Trollfrage halt und ihr fallt darauf rein.

von Genialer Programmierer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Mark B. schrieb:
> Das macht doch kein normaler Mensch.

Du glaubst aber auch jeden Scheiss.

von Dirk B. (dirkb2)


Bewertung
0 lesenswert
nicht lesenswert
Mark B. schrieb:
> Warum sollte es ein sinnvoller Ansatz sein, keine Schleife zu verwenden?

Damit man was fertiges benutzen kann.

Selber schreiben oder denken geht heute nicht mehr.
"Ist ja umständlich. In Programmiersprache XY geht das ganz einfach"

von Genialer Programmierer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Dirk B. schrieb:
> Selber schreiben oder denken geht heute nicht mehr.

Bei solchem Aufwand eine Schleife zu schreiben lohnt es sich
schon mal im Internet zu suchen ob es da nicht was besseres gibt.

von Dirk B. (dirkb2)


Bewertung
0 lesenswert
nicht lesenswert
Ohne (eigene) Schleife:

Neues Array anlegen und mit 0 initialisieren oder mit memset auf 0 
setzen.
oder ausreichend Speicher mit calloc besorgen.

Dann mit memcmp vergleichen.

: Bearbeitet durch User
von Dussel (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Mark B. schrieb:
> Was wenn das Array z.B. 256 Elemente hat? 256 Zeilen Code hinschreiben
> oder wie? Das macht doch kein normaler Mensch.
Die Frage war 'wie'. Die Antwort war 'Geht nicht'. Das ist in C falsch 
und ich habe gezeigt, dass es geht. Ob es sinnvoll ist, war nicht die 
Frage. Vielleicht entwickelt der Fragesteller ja gerade seinen eigenen 
C-Compiler und hat Schleifen noch nicht implementiert. ;-)

von Daniel A. (daniel-a)


Bewertung
0 lesenswert
nicht lesenswert
Vielleicht sowas in die richtung?
1
struct int_array {
2
  size_t set_count;
3
  int* data;
4
};
5
6
int array_data[10]={0};
7
struct int_array array={0,array_data};
8
9
void int_array_setValue( struct int_array* a, size_t i, int x ){
10
  int y = a->data[i];
11
  if( x && !y ) a->set_count++;
12
  if( y && !x ) a->set_count--;
13
  a->data[i] = x;
14
}
15
16
bool int_array_isNoneSet( struct int_array* a ){
17
  return !a->set_count;
18
}

: Bearbeitet durch User
von Sebastian V. (sebi_s)


Bewertung
0 lesenswert
nicht lesenswert
Oder mit Rekursion:
1
bool allZero(const int* data, size_t count)
2
{
3
    if(count == 0)
4
        return true;
5
    else
6
        return data[0] == 0 && allZero(data+1, count-1);
7
}

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Man könnte das ganze auch rekursiv lösen, z.B. indem man das Problem für 
ein Array der Größe N auf das der Größe N-1 zurückführt oder z.B. einen 
Binärbaum aufbaut. Im ersten Fall skaliert der Speicherverbrauch auf dem 
Stack linear mit der Größe des Arrays und im zweiten logarithmisch.

Im konkreten Fall mag solch ein Vorgehen unglaublich ineffizient sein, 
aber bei manchen andere Fragestellungen durchaus sinnlos und effizient.

Nachtrag:
Mist, zu spät... ;-)

: Bearbeitet durch User
von tictactoe (Gast)


Bewertung
0 lesenswert
nicht lesenswert
1
if (std::all_of(begin(a), end(a), [](auto x) { return x == 0; }))
2
   ...

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Bewertung
1 lesenswert
nicht lesenswert
tictactoe schrieb:
1
 if (std::all_of(begin(a), end(a), [](auto x) { return x == 0; }))

Das ist kein C, sondern C++.

: Bearbeitet durch User
von Markus F. (mfro)


Bewertung
0 lesenswert
nicht lesenswert
1
int tst(int *arr, int size) __attribute__((optimize("-funroll-loops")));
2
3
int tst(int arr[], int size)
4
{
5
    int i;
6
7
8
    for (i = 0; i < size; i++)
9
        if (arr[i] != 0)
10
            return 1;
11
    return 0;
12
}

von Heinz (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ausdrucken, dem Lehrling in die Hand drücken und alle Nullen 
unterstreichen lassen. Geht super und ohne Schleife. Es sei denn der 
Lehrling hat eine an.

von A. S. (achs)


Bewertung
0 lesenswert
nicht lesenswert
Markus F. schrieb:
> ((optimize("-funroll-loops")));

naja, das geht ja nur bei festen Werten. Für eine optimal Laufzeit mit 
z.B. 100 oder 1000 Elementen sollte man Duffs Device (entsprechend) 
verwenden ;-)

https://de.wikipedia.org/wiki/Duff%E2%80%99s_Device

von Mac (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Dirk B. schrieb:
> Ohne (eigene) Schleife:
>
> Neues Array anlegen und mit 0 initialisieren oder mit memset auf 0
> setzen.
> oder ausreichend Speicher mit calloc besorgen.
>
> Dann mit memcmp vergleichen.

Zweites Array ist nicht nötig. Alle Elemente sind 0, wenn das erste 
Element 0 ist und jedes Element gleich dem Nachfolger ist:
1
(a[0]==0) && (memcmp(a,a+1,sizeof(*a)*(a_len-1))==0) // a_len: Anzahl der Elemente in a. Der Typ von *a muss bitvergleichbar sein.

;)

von Mark B. (markbrandis)


Bewertung
0 lesenswert
nicht lesenswert
Vielleicht war hier tatsächlich eine rekursive Lösung gesucht anstatt 
einer iterativen. Dann klingt das Ganze ziemlich nach Hausaufgaben 
machen.

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]
  • [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.