[C] Assertion failure

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

  • Xorgye
  • Registratie: Maart 2005
  • Laatst online: 05-10-2024
Pfff, ik ben er weer... een assertion failure waarbij ik geen code kan leveren...

Mijn programma werkte naar behoren, totdat ik besloot dat ik een buffer voor zoekresultaten wilde maken (die gebruik maakte van dynamisch geheugen, anders liep t btje uit de hand). Ik definieerde een typedef struct, maakte een pointer naar die struct, deed een malloc die ik typecaste naar een pointer naar die struct en ik was reuze blij... de compiler gaf geen errors.
Ik gebruikte bij het statische geheugen altijd de syntax resultaat[x].waarde en die kon ik blijkbaar nog hanteren want de compiler gaf geen error toen ik het deed bij dynamisch geheugen...

Totdat ik het programma starte. Hier krijg ik voordat er maar iets gebeurd de melding :
Debug assertion failed
Program: *.exe
File: dbgheap.c
Expression: _CrtIsValidHeapPointer(pUserData)

De debugger zei dit (voordat ie starte):
First-chance exception in v300v400.exe (KERNEL32.DLL): 0xC0000005: Access Violation.

Kan iemand mij uitleggen wat een 'heap' is, zodat ik uit kan zoeken waar ik in de fout ben gegaan?


Hmmm... ik denk dat het toch ff verstandig is wat andere dingetjes er bij te zeggen:
VC++ compiler, ik schrijf voornamelijk c maar vind af en toe c++ wel handig om functies uit die taal er in te proppen. Beetje c/c++ mix dus.

Ik definieer t volgens deze manier:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
typedef struct
{
  int nummer;
  char naam[30];
} onthoudzoeken;

onthoudzoeken *zoek;

int main()
{
  //dynamisch geheugen opvragen:
  zoek = (onthoudzoeken*) malloc(sizeof(onthoudzoeken) * 10);

  //ff wat wijzigen ter demonstratie:
  zoek[9].nummer = 10;

  return 0;
}


Dit was mijn oude manier:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
typedef struct
{
  int nummer;
  char naam[30];
} onthoudzoeken;

onthoudzoeken zoek[10];

int main()
{
  //ff wat wijzigen ter demonstratie:
  zoek[9].nummer = 10;

  return 0;
}



*update*

Het lijkt alsof het mis gaat tijdens het toekennen van de pointer, dus als ik met die zelfgedefineerde struct een pointer 'zoek' toewijs...

[ Voor 12% gewijzigd door Xorgye op 03-04-2006 13:30 . Reden: *update* ]


  • Daos
  • Registratie: Oktober 2004
  • Niet online
Heap is gewoon het geheugen.

Je kan gewoon "(*onthoudzoeken)" weghalen. Of veranderen in "(onthoudzoeken *)".

[ Voor 27% gewijzigd door Daos op 03-04-2006 12:49 ]


  • LazySod
  • Registratie: Augustus 2003
  • Laatst online: 10:00

LazySod

Scumbag with a mission

De melding die je krijgt duidt op een "ongeldige" pointer.

Heb je ergens een free staan en daarna toch nog een keer een dereference van diezelfde pointer? Of schrijf je ergens buiten je gealloceerde array?

Stap er eens doorheen met de debugger en kijk wanneer die melding verschijnt en wat je op dat moment gedaan hebt.

Proof is the idol before whom the pure mathematician tortures himself. (Sir Arthur Eddington)


  • DroogKloot
  • Registratie: Februari 2001
  • Niet online

DroogKloot

depenisvanjezus

zoek = (*onthoudzoeken) malloc(sizeof(onthoudzoeken) * 10);
Maak hier eens...

zoek = (onthoudzoeken*) malloc(sizeof(onthoudzoeken) * 10);

... van. ;)

  • Xorgye
  • Registratie: Maart 2005
  • Laatst online: 05-10-2024
Okeey, gedaan...

Maar t probleem is dat hij gewoon NIET START... erg handig ;)
Niet een bepaalde regel waar ie dus stopt of zow... maar t lijkt alsof ie bij t toewijzen van het geheugen voor de normale variabelen al vast loopt...

Hier dan maar al mijn variabelen (t is btje vies, maja ik ben nog aan t ontwikkelen :+ )
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
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;
       double *plekkorting;
} onthoudorders;

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

       long nummer;
       char naam[50];
       float indicatieprijs;
       float verkoopprijs;
       char omschrijving[450];
} onthoudproducten;

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

       long nummer;
       char firmanaam[50];
       char achternaam[50];
       char aanhef[10];
       char zoeknaam[50];
       char afdeling[20];
       char voorletters[8];
       char postcode[7];
       int huisnummer;
       char straat[50];
       char plaats[50];
       char landcode[4];
       char telefoon[20];
       char fax[20];
       char email[60];
       char bankgiro[12];
       char relatievan[50];
       char soort[20];
       char opmerking[450];
} onthoudklanten;

onthoudorders *order;
onthoudproducten *product;
onthoudklanten *klant;


(dat stukje in de beginpost was dus een voorbeeld... dit is een onderdeel uit me echte proggie... en jah, ik hou van globale variabelen :P )


Hij start wel als ik er dit van maak:
(maar dan is t niet dynamisch meer)
C:
1
2
3
onthoudorders order[MAX_ONTHOUD_DATA + MAX_ZOEKRESULTATEN];
onthoudproducten product[MAX_ONTHOUD_DATA + MAX_ZOEKRESULTATEN];
onthoudklanten klant[MAX_ONTHOUD_DATA + MAX_ZOEKRESULTATEN];

[ Voor 81% gewijzigd door Xorgye op 03-04-2006 13:37 . Reden: ff wat overtollige code er af geschraapt ]


  • LazySod
  • Registratie: Augustus 2003
  • Laatst online: 10:00

LazySod

Scumbag with a mission

"hij start niet"?

Ik neem aan dat je in je main() functie (of die functie waar je mee bezig bent) niet meer komt tot het punt waar je wil komen?

Ga eens met een debugger regel voor regel door je code heen, of zet na iedere regel (ook tussen de declaraties van variabelen in je functie) eens een printf-je om aan te geven waar je zit.

Laat de functie die runt eens zien. Dat kijkt makkelijker. Met die structures is op het eerste zicht niets fout (wat een dergelijke crash zou kunnen veroorzaken iig)

Proof is the idol before whom the pure mathematician tortures himself. (Sir Arthur Eddington)


  • InputOutput
  • Registratie: September 2004
  • Laatst online: 23-10-2025
Zet de debugger van visual studio eens uit, kijk dan eens of het compileert/wil draaien. Volgens mij is je probleem dat de debugger van VS al niet wil starten. Toen ik met VS6 werkte, werd ik strontziek van die debugger, daar zitten namelijk bugs in.

Ik zie zo 1-2-3 niets mis met de declaratie/allocatie.

  • InputOutput
  • Registratie: September 2004
  • Laatst online: 23-10-2025
Oh wacht, ik zie net iets: volgens mij is de declaratie van je struct niet goed. Je probeert nu een nieuwe type variabel 'struct' te definieren, in plaats van dat je een nieuwe struct definieert.

Volgens mij moet je je struct & de pointer ernaar als volgt definieren:

code:
1
2
3
4
5
6
struct onthoudzoeken {
      int nummer;
      char naam[30];
}; 

typedef struct onthoudzoeken *zoek;


Maar het kan zijn dat ik me vergis, ik doe dit niet meer dagelijks.

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

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je vergist je idd, daarmee maak je een type 'zoek' dat eigenlijk een 'onthoudzoeken*' is.

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
Ik heb inderdaad het probleem dat gewoon niks start.

Dus je compileerd->geen fouten
Je start de exe->onmiddelijk een fout

Dus je compileerd->geen fouten
Je start de debugger->onmiddelijk een fout (zelfs voordat ie nog maar 1 line behandelt heeft)

Ik werk idd met mijn project in debug status.

Om nou mijn hele project hier naar toe te gooien is ook wel iets te veel gevraagt... gaan ze hiero zeuren dat de mensen met modems de pagina niet meer kunnen bekijken :o (380kb code)

Hij draait ook niet in release versie :'(
Balen...

[ Voor 17% gewijzigd door Xorgye op 03-04-2006 19:13 . Reden: *debug-release getest* ]


  • LazySod
  • Registratie: Augustus 2003
  • Laatst online: 10:00

LazySod

Scumbag with a mission

Je zei in de originele post dat je nogal wat globale variabele gebruikte. Kan het zijn dat er een aantal van die variabelen elkaar nodig hebben?

Wat je nog zou kunnen proberen:
Commentarieer eens een paar stukken code helemaal weg. Op die manier kun je kijken hoeveel van de globale data nog wel geinstantieerd kan worden en wellicht naar de fout toe zoeken. (Persoonlijk gebruik ik in dit soort situaties vaak #if 0 icm #endif om blokken code weg te werken)

Zet anders de volledige code eens in een zipje en mail ze eens door naar lazysod@hetnet.nl, dan kan ik er eens doorheen lezen.

Proof is the idol before whom the pure mathematician tortures himself. (Sir Arthur Eddington)


  • Xorgye
  • Registratie: Maart 2005
  • Laatst online: 05-10-2024
Nou, ik heb dus die 'fout' wel te pakken... maar ik weet dus niet wat ik fout doe!
Kijk naar die hoofdpost... en dan die andere!

Als ik dus in me uiteindelijke programma hetzelfde doe en de regels 'weg commentarieer' die dynamisch geheugen toewijzen en dan gewoon statisch het geheugen toewijs... werkt het weer :S

Tja, ik moet nog ff nadenken of ik me code zip... maar als ik t naar jou zip zet k t hier ook wel online :+
T probleem is dat t een programma voor n bedrijf is... en ik moet r even overheen komen... ik kan nu nog wel zonder dynamisch geheugen maar als t af is ga k t nog s proberen en zal k t hier heen zippen als t echt nie werkt...
Pagina: 1