Prüfen: Wert existiert in Array

Gast #960492
Guten Abend,

wie prüft man, ob ein Wert in einem Array ist?

irgendwie so?

bool inarray(liste,wert)
{
while(zeigeraufliste)

if(zeigeraufliste==wert)
  return true;

zeigeraufliste++;
}

liste[3+1] = {128,12,19,0};
wert = 19

if(inarray(liste,wert))
  beep();


-> BEEP!

Blöd ist aber, dass wert auch 0 sein kann!
#960509
@ Gnu (Gast)

>wie prüft man, ob ein Wert in einem Array ist?

Das geht im Prinzip schon so.

>Blöd ist aber, dass wert auch 0 sein kann!

Das geht prinzipiell nicht. Du musst einen Wert als "Leer" definieren, 
das kann jeder X-beliebige sein. GGf. grössere Variablen nehmen, 16 
statt 8 Bit.

MFG
Falk
Gast #960513
Ah sehr gut - du hast nicht zufällig einen passenden Code-Ausschnitt 
(evtl. hier im Forum) parat?
Zeiger bringen mich immer komplett durcheinander..da brauche ich 
Stunden.
Admin Persönliche Seite #960522
C uebergibt nur einen Zeiger auf das erste Element des Arrays an die 
Funktion, die Funktion hat keine Moeglichkeit festzustellen wie lange 
das Array ist in dem du suchen willst. Du musst also die Laenge als 
Parameter mit uebergeben:
1
inarray(liste, wert, sizeof liste);

Den Rest duerftest du alleine hinbekommen.
Gast #960560
Mhh, ich peil Zeiger einfach nicht.

#include <stdbool.h>

const uint8_t codearray[16] = {0,1,2,3,4,5,6,7,8,9,12,13,16,17,32,33};

bool inarray(uint8_t *array, uint8_t value, uint8_t size_of_array)
{

  uint8_t i = 0;

  for(i=0;i<=size_of_array;i++)
  {
    if(value == *array + i)
      return true;
  }
  return false;
}


uint8_t code = 13;

if(inarray(codearray,code,sizeof codearray))


> warning: passing argument 1 of 'inarray' discards qualifiers from pointer target 
type
Gast #960697
*array + i    ist   array[0] + i
*(array + i)  ist   array[i]

Du möchtest letzteres. Von den beiden Alternativen ist array[i] die
lesbarere und weniger fehlerträchtige Schreibweise.

> warning: passing argument 1 of 'inarray' discards qualifiers from
> pointer target type

Du übergibst eine const-Variable (blöder Begriff, ich weiß) als
nicht-const-Argument. Da du gar nicht vor hast, in inarray() die
Arrayelemente zu überschreiben, deklarierst du die Funktion besser so:
1
bool inarray(const uint8_t *array, uint8_t value, uint8_t size_of_array)
Gast #960717
Kann man aus dem Stegreif eigentlich sagen, was schneller/kleiner ist?
1
if(inarray(codearray,code,sizeof codearray))
2
   beep();
3
else
4
   error();
oder
1
switch(code)
2
{
3

4
case 0: case 1: case 2: case 3: case 4:
5
case 5: case 6: case 7: case 8: case 9:
6
case 12: case 13: case 16: case 17: case 32: case 33:
7

8
  beep();
9

10
break;
11

12
default:
13
  error();
14
break;
15

16
}

Lohnt sich die Funktion schon bei 2 verschiedenen Aufrufen? Andererseits 
muss dann ein weiteres codearray deklariert werden..
Ich schätze fast, dass die switch-anweisung kompakter ist. ?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 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.