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


von Atamer (Gast)


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)


Lesenswert?

Gar nicht

von Dussel (Gast)


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)


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)


Lesenswert?

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

von Mark B. (markbrandis)


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)


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)


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)


Lesenswert?

Mark B. schrieb:
> Das macht doch kein normaler Mensch.

Du glaubst aber auch jeden Scheiss.

von Dirk B. (dirkb2)


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)


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)


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)


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)


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)


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


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)


Lesenswert?

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

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


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)


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)


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


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)


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)


Lesenswert?

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

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.