Problem mit bsearch Funktion



  • Hallo User,
    ich habe ein totales Verständnisproblem mit der bsearch Funktion.
    Ich wollte ein kleines Internetbeispiel testen aber es funktioniert nicht. hier ist der von mir verwendete Code:

    /* TEST  bsearch*/
    			int compareints (const void * a, const void * b)
    			{
    			  return ( *(int*)a - *(int*)b );
    			}
    			int c [1];
    			int d [5];
    
    			c [0] = 3;
    
    			d [0] = 13;
    			d [1] = 45;
    			d [2] = 23;
    			d [3] = 3;
    			d [4] = 5;
    
    			  int * pItem;
    
    			   pItem = (int*) bsearch (&c, d, 5, sizeof (int), compareints);
    			  if (pItem!=NULL)
    			    printf ("%d is in the array.\n",*pItem);
    			  else
    			    printf ("%d is not in the array.\n",c);
    

    Das Ergebnis sieht wie folgt aus, es wird eine beliebige Zahl aus Ergenis aufgeführt.

    -757400336 is not in the array.
    

    Kann mir jemand bei diesem wirklich einfachen Problem helfen?!?
    Vielen Dank im Voraus.



  • Da c ein Array ist, muss das & vor dem c weg.

    Oder du machst c als einfachen Typ (kein Array).



  • Vielen Dank für die schnelle Antwort!

    Wenn ich c als einfachen int definiere erhalte ich als Antwort:

    3 is not in the array.
    

    Aber eigentlich müsste das Programm doch erkennen, dass an Position 3 des Arrays d eine 3 steht, also müsste die Antwort lauten:

    3 is in the array
    

    Oder?!?

    Da ich aber später mit array arbeiten möchte, würde mich dennoch interessieren, wie ich mit int c [1] arbeiten kann. Wenn ich & vor dem c entferne, erhalte ich immernoch eine Zufallszahl?!?

    Danke!



  • Es ist aus deinem zusammengewürfelten Beispiel nicht ersichtlich, aber das array das du bsearch() zum durchsuchen gibst muss sortiert sein. Ist dein Array sortiert? Kannst du mal ein komplettes aber minimales Beispiel geben? Eines das auch kompiliert und die Arrays initialisiert?

    PS: return ( *(int*)a - *(int*)b ) funktioniert nur für integer die halb so groß sind wie es der Wertebereich zulässt.



  • Du musst auch den richtigen Wert ausgeben. Wenn c ein Array ist, ist bei

    printf ("%d is not in the array.\n",c);
    

    etwas im Argen.
    Das sollte dir auch der Compiler mit einer Warnung melden.



  • /*Global header files */
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h>
    #include <time.h>
    
    /*Start the main program */
    int main(void){
    /* TEST  bsearch*/
    			int compareints (const void * a, const void * b)
    			{
    			  return ( *(int*)a - *(int*)b );
    			}
    			int c [1];
    			int d [5];
    
    			c[1]= 3;
    
    			d [0] = 1;
    			d [1] = 2;
    			d [2] = 3;
    			d [3] = 4;
    			d [4] = 5;
    
    			  int * pItem;
    
    			   pItem = (int*) bsearch (c, d, 5, sizeof (int), compareints);
    			  if (pItem!=NULL)
    			    printf ("%d is in the array.\n",*pItem);
    			  else
    			    printf ("%d is not in the array.\n",c);
    }
    

    Meinst du etwa so?!? In meinem Originalcode ist sehr viel mehr geschrieben. Der restliche Code ist für diesen Abschnitt "meineserachtens" ohne Bedeutung.

    Zum genauen Problem:
    Ich möchte eigentlich nur prüfen, ob der Inhalt eines Arrays (im Bsp. c[1]= 3) in einem großen Array (d[5]=...) enthalten ist.
    Wenn ich das einfache Beispiel verstanden habe, würde ich das erweitern...

    In dem jetzt aufgeführten Beispiel sind die Werte sortiert. Das endgültige Array wird auch sortiert sein.

    Kann mir einer helfen?!? 😞



  • Und was geht jetzt nicht?

    Die Definition von compareints() muss aus der main() raus.

    c[1]= 3; ist Blödsinn, das Elemnt gibt es nicht.

    printf ("%d is not in the array.\n",c); bringt auch nichts, denn c ist ein Array (in diesem Fall wie ein Pointer) %d erwartet aber ein int.



  • Eventuell mal deine Zeilen des letzten Quelltextes mit dem Original vergleichen?
    Wo stehen deine Zeilen 10 bis 14 im Original und was hat das für Auswirkungen?

    MfG f.-th.



  • Stimmt! Die Zeilen 10 bis 14 müssen aus der main() raus, dann funktioniert es.
    Natürlich nur mit c[0]= 3;

    Vielen Dank, ich teste jetzt mal weiter und bedanke mich jetzt erst einmal bei allen!!


Anmelden zum Antworten