[C] gealloceerd geheugen werkt niet goed mee

Pagina: 1
Acties:

  • Xorgye
  • Registratie: Maart 2005
  • Laatst online: 05-10-2024
De volgende code is een deel van een ontzettend veel groter geheel, daarom worden er soms vage manieren gebruikt om waarden te onthouden.

Ik zit er mee dat ik geheugen gealloceerd heb, binnen de range van het gealloceerde geheugen blijf, maar toch foute waarden krijg.

Naja, de code hieronder is dus okeey... ik heb dus nix om te 'showen' maar ik werk wel met het opslaan volgens deze constructie. Het probleem zit m er in dat zo lang ik mijn gegevens binnen mijn programma heb er nix mis is, maar als ik ze opsla en laad volgens deze functie (laden staat er neit bij) dan blijkt dat hij de laaste (twee) lussen wel uitgevoerd heeft maar niet de gegevens weggeschreven omdat ze allemaal -832blablabla opleverden....

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
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
99
100
101
102
103
104
105
106
107
#define MAX_ONTHOUD_DATA                                                        5


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct
{
       char directorie[80];
       char bestandsnaam[12];
       FILE *connectie;
} onthouddatabases;

typedef struct
{
       bool ingebruik;
       long plaatsinbestand;
       bool gewijzigt;

       long nummer;
       long klantnummer;
       char klantnaam[50];
       char factuurdatum[30];
       char betaalwijze[30];
       char termijn[30];
       int inlijst;
       long *pleknummer;
       long *plekaantal;
       float *plekkorting;
} onthoudorders;


onthouddatabases data_connectie[3];  
onthoudorders order[MAX_ONTHOUD_DATA];


int main()
{
    int xtrapos;
    long tijdelijkelong;
    float tijdelijkefloat;

    int record = 1;
    
    //maak een record klaar door er gegevens in te stoppen
    order[record].ingebruik = true;
    order[record].gewijzigt = true;
    order[record].plaatsinbestand = 0;
    order[record].nummer = 1;
    strcpy(order[record].klantnaam, "Erik test");
    order[record].klantnummer = 3;
    strcpy(order[record].factuurdatum, "datum");
    strcpy(order[record].betaalwijze, "geen Bwijze");
    strcpy(order[record].termijn, "geen T");
    order[record].inlijst = 3;

    //alloceer geheugen voor de spullen in de lijst
    order[record].pleknummer = (long*) malloc(order[record].inlijst * sizeof(long));
    order[record].plekaantal = (long*) malloc(order[record].inlijst * sizeof(long));
    order[record].plekkorting = (float*) malloc(order[record].inlijst * sizeof(float));

    order[record].pleknummer[0] = 1;
    order[record].plekaantal[0] = 1;
    order[record].plekkorting[0] = 0;

    order[record].pleknummer[1] = 3;
    order[record].plekaantal[1] = 1;
    order[record].plekkorting[1] = 0.5;

    order[record].pleknummer[2] = 2;
    order[record].plekaantal[2] = 4;
    order[record].plekkorting[2] = 30.9;

    //open database
    data_connectie[0].connectie = fopen("data.db", "wb");

    //schrijf gegevens weg
    fwrite(&order[record].nummer, sizeof(long), 1, data_connectie[0].connectie);
    fwrite(&order[record].klantnaam, 1, 50, data_connectie[0].connectie);
    fwrite(&order[record].klantnummer, sizeof(long), 1, data_connectie[0].connectie);
    fwrite(&order[record].factuurdatum, 1, 30, data_connectie[0].connectie);
    fwrite(&order[record].betaalwijze, 1, 30, data_connectie[0].connectie);
    fwrite(&order[record].termijn, 1, 30, data_connectie[0].connectie);
    fwrite(&order[record].inlijst, sizeof(int), 1, data_connectie[0].connectie);
    //binnen deze if gaat het mis met het opvragen van de gealloceerde geheugenruimtes
    if(order[record].inlijst > 0)
    {
        for(xtrapos = 0; xtrapos < order[record].inlijst; xtrapos++)
        {
            tijdelijkelong = order[record].pleknummer[xtrapos];
            fwrite(&tijdelijkelong, sizeof(long), 1, data_connectie[0].connectie);
        }
        for(xtrapos = 0; xtrapos < order[record].inlijst; xtrapos++)
        {
            tijdelijkelong = order[record].plekaantal[xtrapos];
            fwrite(&tijdelijkelong, sizeof(long), 1, data_connectie[0].connectie);
        }
        for(xtrapos = 0; xtrapos < order[record].inlijst; xtrapos++)
        {
            tijdelijkefloat = order[record].plekkorting[xtrapos];
            fwrite(&tijdelijkefloat, sizeof(float), 1, data_connectie[0].connectie);
        }
    }
    
    fclose(data_connectie[0].connectie);
}

[ Voor 17% gewijzigd door Xorgye op 27-03-2006 14:45 . Reden: heerlijke stupido typo ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:44

.oisyn

Moderator Devschuur®

Demotivational Speaker

Gebruik een fatsoenlijke debugger die data breakpoints ondersteunt, dan zie je precies wanneer de waarde overschreven wordt (visual studio kan dit bijvoorbeeld)

en het is "gewijzigd" ;)

.edit: duh, kijk eens goed naar de code op de regels 71 t/m 73

[ Voor 29% gewijzigd door .oisyn op 27-03-2006 14:35 ]

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.


  • Xorgye
  • Registratie: Maart 2005
  • Laatst online: 05-10-2024
k had vast btje vage formulering, maar ik bedoelde dat ik die ook heb gebruikt en er achter kwam dat als ik aan het einde van de lus kwam de waarde die in 'tijdelijklong' kwam opeens -863nogwattes was... dat krijg ik ook wanneer ik normaal buiten het berijk van me dynamisch gealloceerde geheugen raak...

En ik kan daar dus nooit buiten zijn gekomen, dat is me probleem!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:44

.oisyn

Moderator Devschuur®

Demotivational Speaker

heb je m'n edit ook gelezen? :)

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.


  • Xorgye
  • Registratie: Maart 2005
  • Laatst online: 05-10-2024
Ai...

Ik heb idd hier een dom foutje in gezet, t was als voorbeeld bedoelt...
Het probleem is dat mijn programma 380kb aan code heeft, en ik daar ongeveer deze constructie gebruik (maar dan nie met dat domme foutje er in :P) en als ik de gegevens gewoon invoer is het okee...
maar zo gauw ik ze opsla en weer laad krijg ik het probleem dat opeens blijkt dat de gegevens uit de laatste 2 lussen helemaal niet weggeschreven was. Ik heb t al paar x opnieuw geschreven maar doe telkens t zelfde fout...

  • Xorgye
  • Registratie: Maart 2005
  • Laatst online: 05-10-2024
Okeey, erg handig... nu heb ik eigenlijk niet iets waar ik om hulp kan vragen...

*denk denk*

Okeey, is mijn manier van dynamisch geheugen alloceren juist? (ja, k weet t maar nooit)
Is de manier om het aan te roepen juist?
En iets anders: kan een double net zoals een float een drijvend kommagetal opslaan?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:44

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ja dat klopt verder wel, hoewel je vroeg of laat natuurlijk in de problemen komt met die harde constanten in je code, zoals bijvoorbeeld die 50 op regel 80. Je zou daar ook sizeof(order[record].klantnaam) kunnen gebruiken, dan weet je dat je altijd voldoende leest/schrijft. Ook zie ik dat je record initialiseer met 1, terwijl een array in C natuurlijk begint met 0, en dat is dus evt. iets waar je potentieel de fout mee in kunt gaan. Verder blijft het gewoon een kwestie van debuggen

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.


  • Xorgye
  • Registratie: Maart 2005
  • Laatst online: 05-10-2024
Nou, ik heb geloof ik een heel aantal fouten in mijn programmastructuur gevonden.

Het probleem is als je informatie uitwisselt en die informatie bevat een pointer, er dus op 2 plekken naar dezelfde geheugenlocatie verwezen word. Als de ene dan geheugen vrij geeft heeft de ander een pointer die verwijst naar 'niet bestaande geheugenruimte'... enzovoorts...

Ofwel: ik deed niks verkeerd qua syntax, maar in mijn programmastructuur was het niet duidelijk wanneer data gekopieerd mocht worden en of dan ook de oude pointer meegenomen mocht worden of dat al het geheugen opnieuw geallocceerd moest worden voor de nieuwe data. En dan natuurlijk de oude data van binnen de oude pointer met memcpy() kopieren :)

Een heel gedoe, vooral omdat pointers naar geheugen voor mij volledig nieuw was. Ik had t gewoon n btje ondoordacht gebruikt. Erg veel memory leaks omdat pointers gewoon vervangen werden door nieuwe zonder de oude vrij te geven en ook gewoon pointers dupliceren zonder dat ik daar rekening mee hield :+

T stomme was dat ik t in het bestand zocht waarin ik mijn data stopte, maar het probleem was de functie die het uitlas. Die stopte de data in een geheugenpositie die hij daarna zelf weer vrij gaf, maar ik was zo slim om diezelfde geheugenpositie te gebruiken voor de data binnen in mijn programma...


[update]
Daarnaast ben ik nu ook de hele bestandsinvoer opnieuw aan het doornemen, en vooral dat 'sizeof()' aan het afhankelijk maken van de struct die ik op dat moment gebruik. Dus niet sizeof(int) maar sizeof(struct.noemer). Daardoor ben ik op nog een aantal fouten gestuit. T valt niet mee, een eigen relatieve bestandsindeling bouwen :S
[/update]

[update]
Na alles grondig te hebben na gekeken met de bovenstaande dingen in mijn achterhoofd werkt alles perfect. Eindelijk :P
[/update]

[ Voor 18% gewijzigd door Xorgye op 11-04-2006 14:49 . Reden: update ]

Pagina: 1