Prüfen: Wert existiert in Array

Gast #960492
Lesenswert?

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
Lesenswert?

@ 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 #960560
Lesenswert?

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
Lesenswert?

*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
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren