mikrocontroller.net

Forum: Compiler & IDEs Prüfen: Wert existiert in Array


Autor: Gnu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gnu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
inarray(liste, wert, sizeof liste);

Den Rest duerftest du alleine hinbekommen.

Autor: Gnu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gnu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
darf anscheinend keine const sein.. ?

Autor: Gnu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
besser ist auch

if(value == array[i])

sonst kommt er nur bis zum wert 16

keine ahnung wieso :-(

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
*array + i wird vom Compiler als (*array) + i interpretiert, das dürfte 
der Grund sein.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
bool inarray(const uint8_t *array, uint8_t value, uint8_t size_of_array)

Autor: Gnu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Erklärung! Ist ja eigentlich ganz einfach, man muss nur 
dran denken. Hoffentlich vergesse ich das nicht so schnell wieder ;-)

Autor: Gnu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann man aus dem Stegreif eigentlich sagen, was schneller/kleiner ist?
if(inarray(codearray,code,sizeof codearray))
   beep();
else
   error();
oder
switch(code)
{

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

  beep();

break;

default:
  error();
break;

}

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
 for(i=0;i<=size_of_array;i++)
Das gibt einen Bufferoverflow. Ändere das zu
 for(i=0;i<size_of_array;i++)

Autor: Gnu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, hab ich gemacht.

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.