Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C] bsearch in een 2dimensionele array

Pagina: 1
Acties:

  • Elvis
  • Registratie: Juli 2002
  • Laatst online: 18-11-2017

Elvis

Echo Lima Victor India Sierra

Topicstarter
Hello,

Voor een opdracht voor school moet ik een 2 dimensionele sorteren met de qsort() functie om daarna verschillende waardes uit de array op te vragen met bsearch().
Het is de bedoeling dat de gebruiker het nummer van een boot opgeeft en zo het nummer van de kade te weten komt waar die boot ligt aangemeert.

Dit is het programma:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# include <stdio.h>
# include <stdlib.h>

int vgli(const void*, const void*);

typedef struct
{
    int kadenr;
    int bootnr;
} BOOT;

int main(void)
{
    BOOT boten[] = {
                {4,25},
                {3,20},
                {2,35},
                {1,30}
                };
                
    int  i, a;
    BOOT *p;
    
    qsort(boten, 4, sizeof(BOOT), vgli);
    printf("kadenr\tbootnr\n------\t------\n"); // controleer of qsort juist was
    for(i = 0; i < 4; i++)
    {
        printf("%3d\t%4d \n", boten[i].kadenr, boten[i].bootnr);    
    }

    scanf("%d", &a);  // geef een nummer in
    p = bsearch(&a, boten, 4, sizeof(BOOT), vgli); // zoek nummer
    if(p)  // als nummer gevonden is
    {
        printf("\nBoot:%d KadeNr.:%d", p->bootnr, p->kadenr);  // geef bootnummer & kadenummer
    }
    else
    {
        printf("\nBoot %d werd niet gevonden!", a);    // geef foutbericht
    }
        
    return 0;
}

int vgli(const void *p, const void *q)  // vergelijkfunctie voor qsort en bsearch
{
    BOOT a = *(BOOT*)p;
    BOOT b = *(BOOT*)q;
    
    return a.bootnr - b.bootnr;  // schik op bootnummers
}

de qsort-functie doet zijn werk perfect. Maar als ik een waarde ingeef voor a (maw. één van de bootnummers), returned bsearch altijd NULL... ;(

Ik zit me hier al een uurtje op blind te staren, zonder de fout te zien.
Ik heb al wel geprobeerd om de vgli-functie op kadenummers te laten schikken en dan een kadenummer in te geven. Dan werkt de bsearch-functie wél. Maar het moet nu eenmaal met de bootnummers...

[GoT] TF2 Clan


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11:17

.oisyn

Moderator Devschuur®

Demotivational Speaker

Kijk eens goed naar de parameters die bsearch() verwacht, en wat de vgli functie precies doet.

Overigens zie ik weinig 2 dimensioneels aan de array (tenzij je de members van BOOT ook als array beschouwt).

[ Voor 37% gewijzigd door .oisyn op 13-01-2008 16:39 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Je doet een aantal rare dingen met pointers en dergelijke. Hier een simpelere (imo) implementatie van hetgeen je wilt. Verdere uitleg lijkt me niet nodig, de code spreekt voor zich inclusief extragratis hhgttg-referentie 8)

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <stdlib.h>
#include <stdio.h>

struct boot
{
  int kadenr;
  int bootnr;
};

struct boot boten[]=
{
    {4,25},
    {3,20},
    {2,35},
    {1,30}
};

int count = sizeof (boten) / sizeof (struct boot);

int boot_cmp (const void *b1, const void *b2)
{
    return (((struct boot*)b1)->bootnr - ((struct boot*)b2)->bootnr);
}

void print_boot (const struct boot *b)
{
   printf ("Boot: %d, Kade: %d\n", b->bootnr, b->kadenr);
}

void find_boot (int bootnr)
{
  struct boot target, *result;
  target.bootnr = bootnr;
  result = bsearch (&target, boten, count, sizeof (struct boot), boot_cmp);
  if (result)
    print_boot (result);
  else
    printf ("Kan boot %d niet vinden.\n", bootnr);
}

int main (void)
{
  int i;
  for (i = 0; i < count; i++)
    print_boot (&boten[i]);
  printf ("\n");

  qsort (boten, count, sizeof (struct boot), boot_cmp);

  for (i = 0; i < count; i++)
    print_boot (&boten[i]);
  printf ("\n");

  find_boot (35);

  /* find the boot, the universe and everything */
  find_boot (42);

  return 0;
}

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11:17

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ah, het is weer kant-en-klare-oplossing-dag?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Elvis
  • Registratie: Juli 2002
  • Laatst online: 18-11-2017

Elvis

Echo Lima Victor India Sierra

Topicstarter
.oisyn schreef op zondag 13 januari 2008 @ 16:37:
Kijk eens goed naar de parameters die bsearch() verwacht, en wat de vgli functie precies doet.
Eerst snapte ik niet wat je bedoelde (tot ik Skin's post doornam). Maar ja idd, DOM DOM DOM 8)7
.oisyn schreef op zondag 13 januari 2008 @ 16:37:
Overigens zie ik weinig 2 dimensioneels aan de array (tenzij je de members van BOOT ook als array beschouwt).
Ik bedoelde idd eigenlijk de 2 members van de BOOT struct, ik was gewoon verward omdat het maar niet wou werken... :)


@ Skin
Wat een code zeg! _/-\o_ Als ik die ga gebruiken, ruikt mijn leerkracht onraad :P
Maar toch bedankt, door jou code door te nemen begreep ik wat ik verkeerd deed.
Ik wou via bsearch een int (a) vergelijken met een BOOT 8)7

PS: Het werkt nu *O*

[GoT] TF2 Clan


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11:17

.oisyn

Moderator Devschuur®

Demotivational Speaker

Btw, je hoeft niet per se een BOOT te maken om mee te geven als eerste parameter aan bsearch(). De pointer naar int, zoals je 'm eerst had, was ook prima geweest, alleen had je ene andere compare functie moeten maken die de eerste parameter interpreteert als int* en de tweede als BOOT*, en dan het bootnr van de int aftrekt.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Elvis
  • Registratie: Juli 2002
  • Laatst online: 18-11-2017

Elvis

Echo Lima Victor India Sierra

Topicstarter
Dat had inderdaad ook gewerkt, maar de opdracht bestond eruit dat het met dezelfde vergelijkingsfunctie zou werken...

[GoT] TF2 Clan


Verwijderd

.oisyn schreef op zondag 13 januari 2008 @ 17:51:
Ah, het is weer kant-en-klare-oplossing-dag?
Ja sorry hoor, was voor mij even het snelst, ik probeerde eerst zijn code te fixen maar ik vond het zo onduidelijk dat ik maar even van scratch ben begonnen. Zoals gezegd is het natuurlijk niet de bedoeling dat TS de code 1-op-1 overneemt maar dat is zijn verantwoordelijkheid imo.
Pagina: 1