[C] structure doorheen het hele programma gebruiken.

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • matx5
  • Registratie: November 2003
  • Laatst online: 29-06-2024
hey,

Ik zou een programma moeten schrijven waarmee ik data inlees uit een bestand, deze data in een structure zet en ik deze data dan in alle functies kan gebruiken, nu is het probleem dat ik de data uit de strucure wel kan uitlezen in dezelde functie als waar ik ze inlees, maar in andere functies kan ik de strucure niet gebruiken.

illustatie:
dus, wanneer ik in het menu paarden inlezen neem, worden deze ingelezen,in de structure paard gezet en op het scherm getoond. Maar wanneer ik dan terug naar de menu ga en ik kies optie 3 om in te zetten en opnieuw een aantal paarden wil weergeven lukt dit niet. Ik hoop dat de uitleg een beetje duidelijk was en alvast bedankt!

code(ter illustratie):
horserace.c (mainfile)
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
89
90
91
92
93
94
95
96
97
98
******************************************************************
Dit programma toont de basisstructuur voor het werken met een menu.
*******************************************************************/
#include "paard.h"

/******************************************************************
Functieprototypes:
*******************************************************************/

int menu_keuze(void);
void inlezen_paarden(void);
void invoeren_startbedrag(void);
void inzetten(void);
void start_race(void);



/******************************************************************
Het hoofdprogramma blijft in een lus het menu tonen
totdat de gebruiker wil stoppen (keuze 0).
*******************************************************************/
int main(void)
{
    int keuze;
    do {
        keuze = menu_keuze();
        switch(keuze) {
            case 1: inlezen_paarden(); break;
            case 2: invoeren_startbedrag(); break;
            case 3: inzetten(); break;
            case 4: start_race(); break;
        }
    } while(keuze);

    return 0;
}

/******************************************************************
De functie menukeuze maakt het scherm leeg,
toont een menu en leest een keuze in.
*******************************************************************/
int menu_keuze(void)
{
    int keuze;
    clrscr();
    printf(" -------------------------\n");
    printf("| ***    HORSERACE   ***  |\n");
    printf("|-------------------------|\n");
    printf("| 1. Inlezen van paarden  |\n");
    printf("| 2. Invoeren startbedrag |\n");
    printf("| 3. Inzetten             |\n");
    printf("| 4. Start race       |\n");
    printf("|                         |\n");
    printf("| 0. einde                |\n");
    printf(" -------------------------\n");
    printf("\nUw keuze: ");
    scanf("%d%*c", &keuze);
    clrscr();

    return keuze;
}
/******************************************************************
De functies werden niet verder uitgewerkt.
Hier kan eventueel een submenu getoond worden,
of naar onderliggende, meer gedetailleerde functies gesprongen worden
*******************************************************************/
void inlezen_paarden(void)
{
PAARDEN* paarden;
    int aantal=20;
        paarden=calloc(aantal,sizeof(PAARDEN));
        vul_tab(paarden);
        qsort(paarden,aantal,sizeof(PAARDEN),vgl);
        toon_tab(paarden);
        free(paarden);
        }

void invoeren_startbedrag(void)
{



}


void start_race(void)
{
    //...
    printf("\n\nDruk op een toets om terug te keren...");
    getchar();
}

void inzetten(void)
{
    PAARDEN paarden[20];
    gokform1(paarden);

}

functies.c
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
#include "paard.h"

//tabel vullen
void vul_tab(PAARDEN* paarden)
{
    FILE *prd;
    int i=0;

    if ((prd = fopen("paarden.txt","r")) == NULL){
        printf("het bestand bestaat niet");
        exit(1);
    }

        fscanf(prd,"%2d",&paarden[i].kans);
        while(!feof(prd)){
            fscanf(prd,"%[^\n]",paarden[i].paard);
            i++;
            fscanf(prd,"%2d",&paarden[i].kans);
        }
        fclose(prd);
}

//tabel weergeven
void toon_tab(PAARDEN* paarden){
    int i;

        for(i=0;i<20;i++){
        paarden[i].nummer=i+1;
        printf("! %2d %-18s \t\theeft %2d tegen 1 kans om te winnen. !\n",paarden[i].nummer,paarden[i].paard,paarden[i].kans);
        printf("!---------------------------------------------------------------------------!\n");
        }

    printf("\n\nPaarden succesvol ingelezen,druk op een toets om terug te keren...");
    getchar();
}

//vgl voor de qsort
int vgl(const void* p,const void* q){
    PAARDEN a,b;
    a=*(PAARDEN*)p;
    b=*(PAARDEN*)q;
    return a.kans-b.kans;
    }

//inzetten
void gokform1(PAARDEN* paarden){
int i=0;
SPELER speler;
printf("!********************************************************************!\n");
printf("!                      Horse Race : Gokformulier                     !\n");
printf("!********************************************************************!\n");
printf("!                         Voer uw naam in:                                 !\n");
scanf("%s",speler.speler);
printf("!********************************************************************!\n");
printf("!\t\t   Uw naam is: %s     !\n",speler.speler);
printf("!********************************************************************!\n");
printf("!                  Selecteer uw aantal paarden (12-20)               !\n");
scanf("%d",&speler.aantalprd);
printf("!********************************************************************!\n");
                printf("!\t\t   u hebt voor %d paarden gekozen.\t\t     !\n",speler.aantalprd);
                printf("!********************************************************************!\n");
                printf("!\t\t   Op deze paarden kan u gokken:\t\t     !\n");
                printf("!********************************************************************!\n");
                fflush(stdin);
                for(i=0;i<speler.aantalprd;i++){
                paarden[i].nummer=i+1;
                printf("! %2d %s %2d / 1 \n",paarden[i].nummer,paarden[i].paard,paarden[i].kans);
                printf("!********************************************************************!\n");

                }
            printf("\n\nDruk op een toets om terug te keren...");
            fflush(stdin);
    getchar();

                }

paard.h
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
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
typedef struct{
    int nummer;
    int kans;
    char paard[30];
    } PAARDEN;

typedef struct{
    char speler[30];
    int totbedr;
    int aantalprd;
    int paard1;
    int paard2;
    int paard3;
    int bedr1;
    int bedr2;
    int bedr3;
    } SPELER;
extern int output(void);
extern int vgl (const void*,const void*);
extern void vul_tab(PAARDEN*);
extern void toon_tab(PAARDEN*);
extern void gokform1(PAARDEN*);

Acties:
  • 0 Henk 'm!

  • MLM
  • Registratie: Juli 2004
  • Laatst online: 12-03-2023

MLM

aka Zolo

ik zie een functie voor het inlezen, en je allocate (met calloc) ruimte voor je paarden daar. Nu wil je waarschijnlijk die pointer paarden uit de functie-scope halen (maak er een global van), en NIET deallocaten aan het eind van de inlees-functie maar aan het eind van het programma (met free).

Dan kan je altijd bij je paarden pointer vanuit elke functie, en kan je dus altijd bij die gegevens.

Voorbeeld:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
PAARDEN *paarden = 0; //global

void inlezen(void)
{
    paarden = calloc(...);
    //inlezen en qsort etc hier
}

void een_andere_functie(void)
{
    //check of de gegevens al zijn ingelezen
    if(!paarden) return;

    //je kan vanuit elke functie nu bij de paarden
    PAARDEN* eerste_paard = paarden[0];    
}

void main(void)
{
    inlezen(void);
    //je programma en verwerken van user-input etc doe je hier
    free(paarden);
}


Of ik begrijp je probleem niet helemaal :)
Maar dit is vrij basis C(++), google eens op variabele scope en dynamisch geheugen etc.

[ Voor 7% gewijzigd door MLM op 26-12-2007 17:17 ]

-niks-


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 12:43

Creepy

Tactical Espionage Splatterer

Nah, z'n functies hebben nu netjes een parameter PAARDEN* , stukken netter dan een globale variabele.


"Het lukt niet" is nogal een vage melding, wat lukt er nu precies niet? Wat doet het nu wel? Krijg je foutmeldingen? Zo ja, welke? Zie ook Programming Beleid - De Quickstart

Je functies inlezen_paarden leest de boel in en free'd het ook gelijk weer dus dat schiet niet op. Ook zou inlezen_paarden() denk ik een pointer moeten teruggegeven die je vanuit je main weer kan gebruiken om aan de andere functies mee te geven.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • matx5
  • Registratie: November 2003
  • Laatst online: 29-06-2024
Ik heb de free zoals jullie me aangeraden hebben naar het einde van men int main(void) verplaatst en een inlezen_paarden() aangepast, maar ik krijg nog steeds als uitput bij void gokform1(PAARDEN*) random tekens die in het geheugen zitten als output. Volgens mij heeft het met gokform1 temaken, maar ik kan de fout echt nergens vinden.

matx5

  • KopjeThee
  • Registratie: Maart 2005
  • Niet online
matx5 schreef op woensdag 26 december 2007 @ 19:27:
Ik heb de free zoals jullie me aangeraden hebben naar het einde van men int main(void) verplaatst en een inlezen_paarden() aangepast, maar ik krijg nog steeds als uitput bij void gokform1(PAARDEN*) random tekens die in het geheugen zitten als output. Volgens mij heeft het met gokform1 temaken, maar ik kan de fout echt nergens vinden.
Je declareert paarden opnieuw in "inzetten". Sowieso begrijp ik die dynamische geheugenallocatie in dit geval niet, aangezien je van te voren weet dat die array 20 groot moet worden. Bekijk de onderstaande code eens, waar paarden in main is gedeclareerd, en dan dmv parameters aan de overige functies wordt doorgegeven. Je hoeft dan ook geen free meer te doen. Ik weet trouwens niet of sommige van de andere functies ook "paarden" als parameter nodig hebben, aangezien niet alle functies uitgeschreven zijn, maar dat moet je zelf maar even bekijken.

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
int main(void)
{
    PAARDEN paarden[20];

    int keuze;
    do {
        keuze = menu_keuze();
        switch(keuze) {
            case 1:    inlezen_paarden(paarden); break;
            case 2:    invoeren_startbedrag(); break;
            case 3:    inzetten(paarden); break;
            case 4:    start_race(); break;
        }
    } while(keuze);

    return 0;
}

void inlezen_paarden(PAARDEN* paarden)
{
        vul_tab(paarden);
        qsort(paarden,20,sizeof(PAARDEN),vgl);
        toon_tab(paarden);
}

void inzetten(PAARDEN* paarden)
{
    gokform1(paarden);
}


Overigens ziet dit er wel erg uit als een soort huiswerkopdracht...

[ Voor 8% gewijzigd door KopjeThee op 27-12-2007 08:50 ]


  • matx5
  • Registratie: November 2003
  • Laatst online: 29-06-2024
Zo doet hij het :D, bedankt ik heb er 2 dagen naar aan het zoeken geweest. Het is inderdaad een project voor school, ik heb dus nog een lange programmeer kerstvakantie voor de boeg :).
Iedereen bedankt voor de replies en prettige feestdagen gewenst.

matx5
Pagina: 1