Forum: Compiler & IDEs Array durchsuchen


von Udo (Gast)


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? :)

von Karl H. (kbuchegg)


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

von Philip (Gast)


Lesenswert?

Nur wenn das array sortiert ist.

von Peter (Gast)


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.

von Klaus (Gast)


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.

von Rolf Magnus (Gast)


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();

von Rolf Magnus (Gast)


Lesenswert?

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

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

von Peter (Gast)


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.

von Rolf Magnus (Gast)


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.

von Udo (Gast)


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.

von Rolf Magnus (Gast)


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.

von Harald (Gast)


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!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.