Array durchsuchen

Gast #1664711
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:
1
 for (i=SIZE ; i-- ;)
2
 {
3
  if(SUCHWERT == Array[i])
4
    break;
5
  if (i == 0)
6
    ErrorFkt();
7
 }
8
}


Kann man das noch vielleicht optimaler machen? :)
#1664715
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!
1
  for( i = 0; i < SIZE; ++i ) {
2
    if( Array[i] == Suchwert )
3
      break;
4
  }
5

6
  if( i == SIZE )
7
    // nicht gefunden
8
  else
9
    // gefunden
Gast #1664758
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.
Gast #1664759
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:
1
i = SIZE;
2
while (i-- && SUCHWERT != Array[i])
3
    ;
4

5
if (i < 0)
6
    ErrorFkt();
Gast #1664779
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.
Gast #1664791
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.
Gast #1671529
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:
1
SIZE = 2;
2
uint Array[SIZE] =
3
{
4
  0xAB,
5
  0xCD
6
};

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.
Gast #1672028
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.
Gast #1672037
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

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