C Array auf Inhalt prüfen?

Gast #4965802
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.
#4965829
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.
#4965835
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.
Gast #4965840
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.
Gast #4965894
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. ;-)
#4965951
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
}
(Firma: Schweigstill IT) Persönliche Seite #4965983
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... ;-)
Gast #4966235
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.
Gast #4966381
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.

;)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.