www.mikrocontroller.net

Forum: Compiler & IDEs Array durchsuchen


Autor: Udo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich möchte ein Array mit Größe SIZE nach einem bestimmten SUCHWERT 
durchsuchen, und falls es nicht gefunden wird eine Funktion aufrufen.

So dachte ich:
 for (i=SIZE ; i-- ;)
 {
  if(SUCHWERT == Array[i])
    break;
  if (i == 0)
    ErrorFkt();
 }
}


Kann man das noch vielleicht optimaler machen? :)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Udo schrieb:

> Kann man das noch vielleicht optimaler machen? :)

Aber sicher doch.
Frage:
Wenn du in einem Buch nach einem bestimmten Wort suchst, wann kannst du 
frühestens feststellen, dass das Wort nicht im Buch vorkommt?
Doch wohl erst dann, wenn du das Buch komplett durchsucht hast und nicht 
während des Durchsuchens!
  for( i = 0; i < SIZE; ++i ) {
    if( Array[i] == Suchwert )
      break;
  }

  if( i == SIZE )
    // nicht gefunden
  else
    // gefunden

Autor: Philip (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nur wenn das array sortiert ist.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mit strchr. Wenn die lib gut ist, dann kann sie es komplett die CPU 
machen lasse dafür gibt es ja extra upcodes.

Aber viel schneller wird es dadurch auch nicht.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter schrieb:
> Wenn die lib gut ist, dann kann sie es komplett die CPU
> machen lasse dafür gibt es ja extra upcodes.

1) Das macht sowieso komplett die CPU. Wer denn auch sonst.

2) Das Ding heißt Opcode.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Udo schrieb:

> ich möchte ein Array mit Größe SIZE nach einem bestimmten SUCHWERT
> durchsuchen, und falls es nicht gefunden wird eine Funktion aufrufen.
>
> So dachte ich:
>
>  for (i=SIZE ; i-- ;)
>  {
>   if(SUCHWERT == Array[i])

Du fängst hier bei Array[SIZE] an, also ein Element nach Ende des 
Arrays.

>     break;
>   if (i == 0)
>     ErrorFkt();
>  }
> }
>
> Kann man das noch vielleicht optimaler machen? :)

Klar. Statt bei jedem Schleifendurchlauf zu prüfen, ob die 
Error-Funktion aufgerufen werden soll, könntest du das auch ein einziges 
mal nach der Schleife tun:
i = SIZE;
while (i-- && SUCHWERT != Array[i])
    ;

if (i < 0)
    ErrorFkt();

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Du fängst hier bei Array[SIZE] an, also ein Element nach Ende des
> Arrays.

Ok, stimmt natürlich nicht. ignoriere das einfach.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus schrieb:
> 1) Das macht sowieso komplett die CPU. Wer denn auch sonst.

wer die schleife macht ist die Frage, schreibt man die Schleife als 
mehre asm Befehle oder nutzt die die String funktioenen der CPU.

Das geht geht aber eh nur wenn man keine 0 in der array hat. Dafür muss 
am ende eine 0 vorhanden sein.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter schrieb:
> wer die schleife macht ist die Frage, schreibt man die Schleife als
> mehre asm Befehle oder nutzt die die String funktioenen der CPU.
>
> Das geht geht aber eh nur wenn man keine 0 in der array hat. Dafür muss
> am ende eine 0 vorhanden sein.

Ich wüßte gerade keinen Prozessor, der einen asm-Befehl hat, der das 
macht. Der Befehl "repne scas" auf x86 kommt dem am nächsten, aber der 
interessiert sich nicht dafür, ob im Array eine 0 vorkommt.

Autor: Udo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rolf Magnus schrieb:
>> Du fängst hier bei Array[SIZE] an, also ein Element nach Ende des
>> Arrays.
>
> Ok, stimmt natürlich nicht. ignoriere das einfach.

hmm, du hast schon recht. Ich greife ausserhalb des Arrays zu. Das geht 
ja nicht.

Beispiel:
SIZE = 2;
uint Array[SIZE] =
{
  0xAB,
  0xCD
};

Also ich finde auch dass das while eleganter ist:
while (i-- && SUCHWERT != Array[i])

Nur wird es glaube ich nicht funzen, wenn mein i unsigned ist und ich 
mit SIZE die Arraygröße definiere.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> hmm, du hast schon recht. Ich greife ausserhalb des Arrays zu. Das geht
> ja nicht.

Nein, denn bei:

> for (i=SIZE ; i-- ;)

findet die erste Dekrementierung von i am Beginn des ersten 
Schleifendurchlaufs statt, also bevor du auf Array[i] zugreifst. Mit 
anderen Worten: Innerhalb des Schleifenkörpers ist beim ersten Durchlauf 
i == SIZE-1. Ich hab mich anfangs dadurch verwirren lassen, daß das 
Weitzerzählen des Schleifenzählers bei der for-Schleife im zweiten 
Ausdruck statt im dritten gemacht wird.

Autor: Harald (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>wer die schleife macht ist die Frage, schreibt man die Schleife als
>mehre asm Befehle oder nutzt die die String funktioenen der CPU.
>
>Das geht geht aber eh nur wenn man keine 0 in der array hat. Dafür muss
>am ende eine 0 vorhanden sein.

Alter ! Was für ein Quatsch!

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.