[c] meerdere switch cases menustructuur

Pagina: 1
Acties:
  • 105 views sinds 30-01-2008
  • Reageer

  • Daniel304
  • Registratie: December 2000
  • Laatst online: 14-08 14:02
Ik heb een uitgebreide menu structuur nodig van ongeveer 3 schermen diep. ik gebruik een code echter als ik eenmaal een keuze heb gemaakt pakt hij de exit niet meer (exit zou 0 moeten zijn) elke main functie is een nieuw scherm met een nieuw menu.

enig idee wat er fout gaat ?!?

de code
---------
code:
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
int hoofdscherm(void)
{
    int keuze;
    while ((keuze=hoofdscherm_keuze()) != 0)
    {
        switch (keuze)
        {
        case 1:
            admin_main(); //admin menu
            break;
        case 2:
            begeleider_main(); //begeleider menu
            break;
        case 3:
            student_main(); //student menu
            break;
        case 4:
            docent_main(); //docent menu
            break;
        }
    }
}

int hoofdscherm_keuze(void)
{
    int keuze;
    scherm_layout("Main","Uw Keuze:"); //simpel layout filetje
    gotoxy(3,4);   printf("1) Administratie");
    gotoxy(3,5);   printf("2) Studiebegeleiders");
    gotoxy(3,6);   printf("3) Studenten");
    gotoxy(3,7);   printf("4) Docenten");
    gotoxy(13,23);
    scanf("%d",&keuze);
    getchar();
    return keuze;
}

<font color="#f00000">.modbreak: even je code tussen [code]..[/code] tags gezet</font>

  • Avalanchez
  • Registratie: Juni 2002
  • Laatst online: 25-06-2012

Avalanchez

Phr34k

nu kan ik me vergissen... maar moet er geen returnwaarde van het type int aan het einde worden meegegeven?

Computers are stupid, they can only give you answers. -Picasso


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03-09 13:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

hmm ik zie ook niet direct de fout... :?

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.


  • Daniel304
  • Registratie: December 2000
  • Laatst online: 14-08 14:02
thanks .iosyn was'k vergeten ;)
anyways.. de return 0; is niet het probleem

Het probleem is dat ik meerdere menu's achter elkaar moet plakken en dat ik met de 0 een menu terug zou moeten kunnen gaan. dit gaat met de manieren waarop ik het geprobeert heb telkens fout..

bijvoorbeeld zet twee van deze menu's achter elkaar en de tweede zal bij zijn keuzes een error genereren.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22:39
Een mooie manier zou zijn om afhankelijk van het 'scherm' waarin je zit, functiepointers op te slaan in een array.

Op plaats 0 kun je dan de 'draw' functie van je vorige scherm zetten, of een exit functie als je in het hoofdscherm zit.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Daniel304
  • Registratie: December 2000
  • Laatst online: 14-08 14:02
heb je hier misschien een kleine example van !!!
Ik weet hoe ik met C moet omgaan pointers arrays(multidimensionale assosiatieve etc..) maar als je het in taal uitgaat leggen heb ik geen flauw idee waar je het over hebt... :)

Verwijderd

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int hoofdscherm(void)
{
    int keuze;
    while ((keuze=hoofdscherm_keuze()) != 0)
    {
        switch (keuze)
        {
        case 1:
            admin_main(); //admin menu
            break;
        case 2:
            begeleider_main(); //begeleider menu
            break;
        case 3:
            student_main(); //student menu
            break;
        case 4:
            docent_main(); //docent menu
            break;
        }
    }
}

Hier gaat ongeveer alles fout. Nr 1: Gooi je while loop weg, deze is nutteloos.

Wat er bij de while(keuze=hoofdscherm_keuze() != 0) fout gaat:

Wanneer je zegt keuze=functie() dan levert dit altijd true op, want de assignment is gelukt; keuze heeft een waarde gekregen (1 of 2 maar ook 0, het maakt niet uit). Wanneer je een assignment (keuze=functie())gaat evalueren zal dat dus nooit 0 opleveren. Tenzij er iets mis gaat met het assignen zelf, maar dat is hier niet het geval.

Het programma zal dus nooit de while loop verlaten. De variabele keuze heeft ondertussen wel de waarde 0 gekregen. Deze komt niet voor in je switch statement, en dat levert dus de foutmelding op.

beter is:
code:
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
int hoofdscherm(void)
{
    int keuze;
    keuze=hoofdscherm_keuze();
    switch (keuze)
    {
    case 1:
        admin_main(); //admin menu
        hoofdscherm_keuze(); //main menu
        break;
    case 2:
        begeleider_main(); //begeleider menu
        hoofdscherm_keuze(); //main menu
        break;
    case 3:
        student_main(); //student menu
        hoofdscherm_keuze(); //main menu
        break;
    case 4:
        docent_main(); //docent menu
        hoofdscherm_keuze(); //main menu
        break;
    case default:
// doe niets
    }
}

EDIT: nu gaat hij naar het hoofdmenu terug, wat je met de while loop wilde bereiken, had ik niet helemaal door.

Verwijderd

oh wat gezellig! IP-02!

Verwijderd

beste cybertony, wat jij zegt vind ik allemaal heel vaag:
code:
1
while ((keuze=hoofdscherm_keuze()) != 0)

betekend dat keuze de waarde van hoofdscherm_keuze() word. Die kan natuurlijk WEL 0 zijn. Namelijk als de gebruiker 0 in heeft gevoerd. Vervolgens word de waarde van keuze (of hoofdscherm_keuze(), maar die is natuurlijk hetzelfde) gecontroleerd op het het zijn van 0.
zo ja: kap ermee.
zo nee: ga iets doen.

Zijn loop is daarom redelijk handig, namelijk dat je in het menu blijft, totdat je er specifiek om vraag uit te gaan (met die 0).

(sorry Daniel304 dat ik jouw probleem niet echt kan vinden, het lijkt allemaal ok.. moet je ff debuggen, zou ik zeggen)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03-09 13:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op maandag 03 juni 2002 22:52 schreef cybertony klinkklare onzin
zoals unteraarsch al aangaf is je verhaal gewoon onzin.
De returnwaarde van een assignment is niet of het gelukt is of niet (waarom zou dat nou mislukken :?), maar de nieuwe waarde van de variabele die je assignt (en in C++ een reference naar de betreffende variabele)

kijk:
code:
1
2
3
4
5
int var = 0;

printf ("%d\n", var = 1);
printf ("%d\n", var = 5);
printf ("%d\n", var = 0);

geeft als output:
code:
1
2
3
1
5
0

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.


  • Daniel304
  • Registratie: December 2000
  • Laatst online: 14-08 14:02
toch nog een klein dingetje...
je roep vanuit een subroutine een andere aan sluit de vorige dan nee toch ?!?
dus als je vanuit hoofdmenu een ander menu aanroept en vanuit dat menu weer het hoofdmenu.. blijf je toch in een soort van loop zitten waar de stack van het programma steeds hoger/groter wordt ?!? zie ik dat verkeerd ?!?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03-09 13:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

yup, dat zie je helemaal goed :)

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.


  • Daniel304
  • Registratie: December 2000
  • Laatst online: 14-08 14:02
das natuurlijk niet helemaal de bedoeling.. je moet eigenlijk uit de subroutine gaan en terug naar het oohfdemnu.. daar schijnt toch nog ergens een fout te zitten bij mijn programma... hij wil niet uit de laatste loop komen... Ik gaat morgen nog snel de hele code langslopen... kijken of ik nog iets kan vinden thanks anyways !!!

BTW handig om te zeggen dat ik borland c/c++ v5.02 gebruik..

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03-09 13:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

je moet ook niet vanuit de submenu's het hoofdmenu weer aanroepen. Wat je moet doen is, als je vanuit een submenu naar het hoofdmenu wilt gaan, de submenu-functie afsluiten (dus met een return statement ofzo). Dan komt hij weer in de aanroepende functie (het hoofdmenu dus), en als je dan weer 0 toetst dan sluit het programma :)

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

Ok, helemaal fout wat ik daarzo zei. Was in de war met wat anders. Heb het nog even geprobeerd, dat while statement, hij zou er inderdaad uit moeten vallen als keuze=0. Excuses.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22:39
Om even een voorbeeld te geven van hoe het met functiepointers kan. ( Controle op invoer en alle andere zaken die crashes veroorzaken ontbreken :) )
code:
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <stdlib.h>
#include <stdio.h>

#define MAX_NUM_OPTIONS 10
#define MAX_NUM_SCREENS 10

typedef void (* p_menufunc) ( void );
typedef void (* p_drawfunc) ( void );

p_menufunc screen_0_handlers[MAX_NUM_OPTIONS];
p_menufunc screen_1_handlers[MAX_NUM_OPTIONS];
p_drawfunc draw_handlers[MAX_NUM_SCREENS];

p_menufunc * current_handler;
p_drawfunc current_draw_func;


void screen_0_draw( void )
{
    printf("Druk 0 voor exit\n");
    printf("Druk 1 voor scherm 1\n");
}

void screen_0_handler_key_0( void )
{
    exit( 0 );
}

void screen_0_handler_key_1( void )
{
    current_draw_func = draw_handlers[1];
    current_handler = screen_1_handlers;
}

void screen_0_handler_key_2( void )
{
}

void screen_1_draw( void )
{
    printf("Druk 0 voor scherm 0\n");
}

void screen_1_handler_key_0( void )
{
    current_draw_func = draw_handlers[0];
    current_handler = screen_0_handlers;
}

void screen_1_handler_key_1( void )
{
}

void screen_1_handler_key_2( void )
{
}


void init_menus( )
{
    draw_handlers[0] = screen_0_draw;
    draw_handlers[1] = screen_1_draw;

    screen_0_handlers[0] = &screen_0_handler_key_0;
    screen_0_handlers[1] = &screen_0_handler_key_1;
    screen_0_handlers[2] = &screen_0_handler_key_2;

    screen_1_handlers[0] = &screen_1_handler_key_0;
    screen_1_handlers[1] = &screen_1_handler_key_1;
    screen_1_handlers[2] = &screen_1_handler_key_2;

    current_draw_func = screen_0_draw ;
    current_handler = screen_0_handlers;
}

void main()
{
    init_menus();

    int keuze = 0;
    
    do
    {
        current_draw_func();
        scanf("%d",&keuze);
        current_handler[keuze]();
    } while(true);
}

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Daniel304
  • Registratie: December 2000
  • Laatst online: 14-08 14:02
haha ziet er leuk uit maar hij werkt nu bij mij... Bedankt in iedergeval... er zaten wat kleine dingetjes in de uiteindelijke code voor een menu is geworden
code:
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
int admin_keuze()
{
     scherm_layout("Administratie","Uw Keuze:");

     int keuze;
     gotoxy(3,4);   printf("1) Toevoegen");
     gotoxy(3,5);   printf("2) Wijzigen");
     gotoxy(3,6);   printf("3) Verwijderen");
     gotoxy(13,23); scanf("%d",&keuze);
     return keuze;
}

int admin_main(void)
{
    int keuze;
    while((keuze = admin_keuze()) != 0)
   {
    switch (keuze)
    {
        case 0:
        hoofdscherm();
        break;
       case 1:
        admin_toev();
        break;
       case 2:
        admin_wijz();
        break;
       case 3:
        admin_verw();
        break;
       default:
        break;;
    }
   }
}

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22:39
Ik vind de mijne mooier ;)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03-09 13:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op dinsdag 04 juni 2002 18:40 schreef farlane het volgende:
Ik vind de mijne mooier ;)
dan ga ik ook vertellen hoe ik het gedaan zou hebben :P

een boomstructuur van menuitems, waarvan de bladeren idd pointers naar functies zijn.
En er is een functie die een specifieke node op het scherm zet en de toetsen afhandelt

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.


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22:39
Op dinsdag 04 juni 2002 18:54 schreef .oisyn :

[..]

... een boomstructuur ...menuitems ... de bladeren ...
Smaken verschillen :9

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1