opsporen debug assertion failed error

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • williewonka03
  • Registratie: Augustus 2010
  • Laatst online: 16-06-2024
Hallo allemaal,

Ik ben bezig een game of life game te maken in c++. Ik loop op het moment tegen een debug assertion failed error aan. Probleem is dat ik dit heel moeilijk kan debuggen omdat visual studio ipv breaken in mijn code waar het fout gaat, breaked ergens diep in een buildin library, terwijl ik wel "just my code" heb aanstaan. Weet iemand hoe ik bij dit type error ervoor kan zorgen dat visual studio wel breaked in mijn code? Dan kan ik ook fatsoenlijk naar mijn variablen kijken. Alvast bedankt.

Acties:
  • 0 Henk 'm!

  • HMS
  • Registratie: Januari 2004
  • Laatst online: 21-08 23:06

HMS

Krijg je geen call stack waar je doorheen kan gaan?

Acties:
  • 0 Henk 'm!

  • BoringDay
  • Registratie: Maart 2009
  • Laatst online: 13-05 21:49
Kan je niet de Assert routine afvangen?

Iets van (althans zo kan het in Delphi), bij je main:
AssertErrorProc := MyAssert;

En dan
procedure MyAssert(Const Message:String; const FileName:String; LineNumber:Integer; ErrorAddr:Pointer);
begin
.... doe hier iets
end;

Bij een assert zou je dan eventueel waar mee kunnen geven.

Betere methode is denk ik codesite extention voor visual studio
MSDN: CodeSite extension

[ Voor 31% gewijzigd door BoringDay op 29-03-2014 09:56 ]


Acties:
  • 0 Henk 'm!

  • williewonka03
  • Registratie: Augustus 2010
  • Laatst online: 16-06-2024
de call stack liet ie dus niet zien, maar daar zal ik nog wel ff goed naar zoeken. Die codesite extension is interesant. wel betaald helaas.

Acties:
  • 0 Henk 'm!

  • BoringDay
  • Registratie: Maart 2009
  • Laatst online: 13-05 21:49
Dat is dan een kwestie van afwegen maar het doet wel precies wat je boven omschreven hebt.
AssertErrorProc zou je ook nog het een en andere kunnen doen, door de event af te vangen kan je bijvoorbeeld ipv melding het naar een memo sturen.

Als je je brood ermee moet verdienen dan is CodeSite zeker de moeite waard.

Acties:
  • 0 Henk 'm!

  • Daos
  • Registratie: Oktober 2004
  • Niet online
BoringDay schreef op zaterdag 29 maart 2014 @ 12:23:
Als je je brood ermee moet verdienen dan is CodeSite zeker de moeite waard. vraag of je over mag stappen naar C#.
Fixed That For You ;)

Ik heb vanmorgen ook maar eens GoL gemaakt in C++ en ik gruwelde daar meer van dan ooit tevoren.

De grootste ergernissen van vandaag:
- Bijna 70 regels code (op 173 totaal) had ik nodig voor een dynamisch-alloceerbaar 2d-array met bools waar je later de lengte per dimensie van kan opvragen (wel zo handig voor je loops in andere functies). In C# bestaan die gewoon.
- Simpele dingen als je scherm leegmaken of wachten op een toets is gewoon niet mogelijk.

Bovendien krijg je mooie exceptions in C# en kan je daar wel prima debuggen.

Maar weer ontopic:
Het blijft een beetje gissen, maar
- blijven al je indices wel binnen de grenzen? Naar de buren kijken op de rand van je veld gaat misschien fout. Je kan asserts (def in cassert) toevoegen om te kijken of aannames die je doet ook kloppen.
- gebruik je pointers en doe je daar berekeningen mee?
- doe je iets met recursie (in dit probleem niet nodig) wat dan mislukt en waardoor je een stackoverflow krijgt?
- heb je een eigen assignment operator gemaakt in je klasse?
- doe je iets met memory management zoals new en delete (of oudjes van c: malloc en free)? Heb je als je dat in een klasse doet de Wikipedia: Rule of three (C++ programming) wel geimplementeerd?

Acties:
  • 0 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Nu online
Daos schreef op zaterdag 29 maart 2014 @ 13:43:
[...]
De grootste ergernissen van vandaag:
- Bijna 70 regels code (op 173 totaal) had ik nodig voor een dynamisch-alloceerbaar 2d-array met bools waar je later de lengte per dimensie van kan opvragen (wel zo handig voor je loops in andere functies). In C# bestaan die gewoon.
[...]
Je bedoelt met sizeof(array)/sizeof(bool)?
[...]
- Simpele dingen als je scherm leegmaken of wachten op een toets is gewoon niet mogelijk.
[...]
In console? Voor windows system("cls"); om te clearen, wachten op toets is uiteraard cin.get();
Als je met GUI aan de gang gaat weet ik dat Qt ook het een en ander heeft.

Acties:
  • 0 Henk 'm!

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Caelorum schreef op zaterdag 29 maart 2014 @ 14:06:
[...]

Je bedoelt met sizeof(array)/sizeof(bool)?
sizeof met een array werkt alleen waar je je array maakt en als je dat doet met [] zoals
bool array[] = {true, true, false};

Jouw geval is alleen 1d. Voor 2d-arrays wordt het ietsjes lastiger
bool array[][3] = {{true, true, false},{true, false, false},{false, true, false}};
int dim1 = sizeof(array) / sizeof(array[0]);
int dim2 = sizeof(array[0]) / sizeof(bool);

Maar de problemen met sizeof zijn:
- de dimensies moeten tijdens compile time vaststaan
- je kan sizeof niet gebruiken in functies (als je een array als argument meegeeft)
[...]

In console? Voor windows system("cls"); om te clearen, wachten op toets is uiteraard cin.get();
Als je met GUI aan de gang gaat weet ik dat Qt ook het een en ander heeft.
Ik was system effe vergeten. Vroeger gebruikte ik system("pause"); om te wachten op een toets. Het is weliswaar geldige c++, maar portal niet.

Acties:
  • 0 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Nu online
Daos schreef op zaterdag 29 maart 2014 @ 14:23:
[...]
Maar de problemen met sizeof zijn:
- de dimensies moeten tijdens compile time vaststaan
- je kan sizeof niet gebruiken in functies (als je een array als argument meegeeft)
[...]
Owja stomme pointers ook telkens |:( Maar dan nog hoef je het wiel niet opnieuw uit te vinden. Je kan altijd een std::vector van std::vectors maken bijv.
[...]
Ik was system effe vergeten. Vroeger gebruikte ik system("pause"); om te wachten op een toets. Het is weliswaar geldige c++, maar portal niet.
Nee, maar std::cin.get() werkt wel.
Bedoel, C# is een stuk eenvoudiger, maar het is niet alsof je alles opnieuw hoeft uit te vinden in c++. De standard library is al vrij uitgebreid en als je daar nog boost tegenaan gooit zit je wat betreft containers enzo wel goed.

Maar we kapen het topic nu een beetje ^^
williewonka03 schreef op zaterdag 29 maart 2014 @ 11:32:
de call stack liet ie dus niet zien, [...]
Even een domme vraag, maar je weet dat het een window is van VS toch?

[ Voor 28% gewijzigd door Caelorum op 29-03-2014 15:14 ]


Acties:
  • 0 Henk 'm!

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Caelorum schreef op zaterdag 29 maart 2014 @ 15:10:
Maar we kapen het topic nu een beetje ^^
Valt wel mee. Het gaat over dingen die hij nodig heeft om Game of Life te maken.

Mijn Field in C++
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
class Field {
    int width;
    int height;
    bool *data;

public:
    Field(const int width, const int height): width(width), height(height) {
        assert(width >= 0);
        assert(height >= 0);
        data = new bool[width * height]();
    }

    // see http://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming)
    ~Field() {
        delete data;
    }

    Field(const Field &other): width(other.width), height(other.height) {
        int size = width * height;
        data = new bool[size];
        std::copy(other.data, other.data + size, data);
    }

    Field &operator= (const Field &other) {
        if (this != &other) // protect against invalid self-assignment
        {
            // 1: allocate new memory and copy the elements
            int size = other.width * other.height;
            bool *new_data = new bool[size];
            std::copy(other.data, other.data + size, new_data);

            // 2: deallocate old memory
            delete[] data;

            // 3: assign the new memory to the object
            data = new_data;
            width = other.width;
            height = other.height;
        }
        // by convention, always return *this
        return *this;
    }

    int getHeight() const {
        return height;
    }

    int getWidth() const {
        return width;
    }

    // out of range is false
    bool getItem(const int x, const int y) const {
        if (0 <= x && x < width && 0 <= y && y < height) {
            return data[width * y + x];
        }

        return false;
    }

    void setItem(const int x, const int y, const bool value) {
        if (0 <= x && x < width && 0 <= y && y < height) {
            data[width * y + x] = value;
        }
    }
};

en
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
class Field {
    private bool[,] data;

    public Field(int width, int height) {
        data = new bool[width, height];
    }

    public Field(Field other) {
        data = (bool[,])other.data.Clone();
    }

    public int Height {
        get {
            return data.GetLength(1);
        }
    }

    public int Width {
        get {
            return data.GetLength(0);
        }
    }

    // out of range is false
    public bool getItem(int x, int y) {
        if (0 <= x && x < Width && 0 <= y && y < Height) {
            return data[x, y];
        }

        return false;
    }

    public void setItem(int x, int y, bool value) {
        if (0 <= x && x < Width && 0 <= y && y < Height) {
            data[x, y] = value;
        }
    }
}


Een wereld van verschil als je mij vraagt. Met vectoren in C++ zal het inderdaad waarschijnlijk begrijpelijker en fout-ongevoeliger worden, maar zo mooi als C# gaat niet lukken.

-- begin edit
Ik neem mijn woorden terug. Met vector lijkt het veel op C#:
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
class Field {
    std::vector<std::vector<bool> > data;

public:
    Field(const int width, const int height) {
        data = std::vector<std::vector<bool> >(width, std::vector<bool>(height, false));
    }

    Field(const Field &other) {
        data = other.data;
    }

    int getHeight() const {
        return data[0].size();
    }

    int getWidth() const {
        return data.size();
    }

    // out of range is false
    bool getItem(const int x, const int y) const {
        if (0 <= x && x < getWidth() && 0 <= y && y < getHeight()) {
            return data[x][y];
        }

        return false;
    }

    void setItem(const int x, const int y, const bool value) {
        if (0 <= x && x < getWidth() && 0 <= y && y < getHeight()) {
            data[x][y] = value;
        }
    }
};

-- end edit

En weer over het debuggen: bij veel problemen in C++ kan je niet achteraf zien waar het misgegaan is. Je kan wel breakpoints zetten voordat het misgaat en daar vandaan regel voor regel stappen en je variabelen bekijken. Heb je veel data, dan kan je ook proberen met minder data uit te voeren; dat debugt makkelijker.

[ Voor 12% gewijzigd door Daos op 29-03-2014 15:59 ]


Acties:
  • 0 Henk 'm!

  • BoringDay
  • Registratie: Maart 2009
  • Laatst online: 13-05 21:49
"maar zo mooi als C# gaat niet lukken."

Jawel, Objective Pascal :)
Pagina: 1