Welcome, Guest. Please login or register. Did you miss your activation email?

Author Topic: Help me fix this project, please  (Read 3887 times)

0 Members and 1 Guest are viewing this topic.

osisi

  • Newbie
  • *
  • Posts: 1
    • View Profile
Help me fix this project, please
« on: November 08, 2021, 01:15:52 pm »
I got a code on github. After I debug it, it gives me an error as shown belowI got a code on github. After I debug it, it gives me an error as shown: Exception thrown at 0x7767FF05 (ntdll.dll) in Demo.exe: 0xC0000005: Access violation writing location 0x00000004.

https://imgur.com/y8QG7vk




Here is my code

#include <iostream>
#include <math.h>
#include <algorithm>
#include <SFML/Graphics.hpp>

#define SFML_NO_DEPRECATED_WARNINGS

#pragma warning(suppress : 4996)
#define _CRT_SECURE_NO_WARNINGS
using namespace std;
using namespace sf;

const int window_w = 1920;
const int window_h = 1080;
float wid = 1920;
int hei = 1080;
float wid_n = 1920;
float hei_n = 1080;
const int l_size = 80;
const int r_size = 30;
const int h_size = 100;
float speed = 50;
float del = 0;
const int scale = 1;
RenderWindow window(VideoMode(window_w, window_h), "AVL Tree");
Font font;
View view;

struct Node {
        int c;
        Node* l, * r;
        int h;
        Node(int cc) :c(cc), h(1), l(NULL), r(NULL) {}
};
typedef Node* Tree;

int get_h(Tree t) {
        if (!t)return 0;
        return t->h;
}

int balancefact(Tree t) {
        if (!t)return 0;
        return get_h(t->r) - get_h(t->l);
}

void update(Tree t) {
        if (!t)return;
        t->h = max(get_h(t->l), get_h(t->r)) + 1;
}

Tree rot_right(Tree t) {
        Tree q = t->l;
        t->l = q->r;
        q->r = t;
        update(t);
        update(q);
        return q;
}

Tree rot_left(Tree t) {
        Tree q = t->r;
        t->r = q->l;
        q->l = t;
        update(t);
        update(q);
        return q;
}

Tree balance(Tree t) {
        if (!t)return t;
        update(t);
        if (balancefact(t) == 2) {
                if (balancefact(t->r) < 0)
                        t->r = rot_right(t->r);
                return rot_left(t);
        }
        if (balancefact(t) == -2) {
                if (balancefact(t->l) > 0)
                        t->l = rot_left(t->l);
                return rot_right(t);
        }
        return t;
}

Tree add(int c, Tree t) {
        if (!t) {
                t = new Node(c);
                return t;
        }
        if (t->c == c)return t;
        if (t->c > c) {
                t->r = add(c, t->r);
        }
        else {
                t->l = add(c, t->l);
        }
        return balance(t);
}

Tree get_min(Tree t) {
        if (!t->l)return t;
        return get_min(t->l);
}

Tree erase(int c, Tree t) {
        if (!t)return t;
        if (t->c > c) {
                t->r = erase(c, t->r);
        }
        else if (t->c < c) {
                t->l = erase(c, t->l);
        }
        else if (t->l && t->r) {
                t->c = get_min(t->r)->c;
                t->r = erase(t->c, t->r);
        }
        else if (t->l)
                t = t->l;
        else
                t = t->r;
        return balance(t);
}

void draw(int x, int y, int c) {
        CircleShape cir;
        Text text;
        text.setFont(font);
        cir.setOrigin(Vector2f(r_size, r_size));
        cir.setRadius(r_size);
        cir.setOutlineColor(Color::Blue);
        cir.setOutlineThickness(3);
        text.setCharacterSize(144);
        text.setString(to_string(c));
        text.setOrigin(text.getLocalBounds().left + text.getLocalBounds().width / 2,
                text.getLocalBounds().top + text.getLocalBounds().height / 2);
        float min_size = min((r_size * 1.5f) / text.getLocalBounds().width, (r_size * 1.5f / 2) / text.getLocalBounds().height);
        text.setScale(Vector2f(min_size, min_size));
        cir.setPosition(x, y);
        text.setPosition(Vector2f(x, y));
        text.setFillColor(Color::Black);

        window.draw(cir);
        window.draw(text);
}

void draw_edg(int x1, int y1, int x2, int y2) {
        if (x1 == 0 && y1 == 0)return;
        RectangleShape line(Vector2f(sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)), 6));
        line.setFillColor(Color::Cyan);
        line.setPosition(Vector2f(x1, y1));
        line.rotate(atan2(y2 - y1, x2 - x1) * 180.0 / atan2(0, -1));
        window.draw(line);
}

int get(Tree t, int l, int h) {
        if (!t)return 0;
        int r = l;
        if (t->l)
                r = get(t->l, l, h - 1);
        else
                r += l_size * scale;
        if (t->r)
                r = get(t->r, r, h - 1);
        else
                r += l_size * scale;
        if (!t->l && !t->r)
                r += l_size;
        int x_cor = l + (r - l) / 2;
        int y_cor = h * h_size;
        draw(x_cor, y_cor, t->c);
        return r;
}

pair<int, pair<int, int>> get_edg(Tree t, int l, int h) {
        if (!t)return make_pair(0, make_pair(0, 0));
        int r = l;
        pair<int, int> left = make_pair(0, 0);
        pair<int, int> right = make_pair(0, 0);
        if (t->l) {
                pair<int, pair<int, int>> res = get_edg(t->l, l, h - 1);
                r = res.first;
                left = res.second;
        }
        else
                r += l_size * scale;
        if (t->r) {
                pair<int, pair<int, int>> res = get_edg(t->r, r, h - 1);
                r = res.first;
                right = res.second;
        }
        else
                r += l_size * scale;
        if (!t->l && !t->r)
                r += l_size;
        int x_cor = l + (r - l) / 2;
        int y_cor = h * h_size;
        draw_edg(left.first, left.second, x_cor, y_cor);
        draw_edg(right.first, right.second, x_cor, y_cor);
        return make_pair(r, make_pair(x_cor, y_cor));
}

int main() {
        view.reset(FloatRect(0, 0, window_w, window_h));
        srand(time(NULL));
        Tree t = 0;
        Clock clock;
        font.loadFromFile("CyrilicOld.TTF");
        bool change = true;
        int tim = 0;
        int kadr = 0;
        while (window.isOpen()) {
                sf::Event event;
                while (window.pollEvent(event) || change) {
                        float del_tim = clock.getElapsedTime().asMicroseconds();
                        del = del_tim / 4e4;
                        clock.restart();
                        tim += del_tim;
                        kadr++;
                        if (tim > 1e6) {
                                tim -= 1e6;
                                //      cout << kadr << endl;
                                kadr = 0;
                        }
                        if (event.type == Event::Closed || Keyboard::isKeyPressed(Keyboard::Escape)) {
                                window.close();
                        }
                        if (Keyboard::isKeyPressed(Keyboard::Dash)) {
                                view.zoom(1.03f);
                                speed = speed * 1.03f;
                                wid = wid * 1.03f;
                                change = true;
                        }
                        if (Keyboard::isKeyPressed(Keyboard::Equal)) {
                                view.zoom(0.97f);
                                speed = speed * 0.97f;
                                wid = wid * 0.97f;
                                change = true;
                        }
                        if (Keyboard::isKeyPressed(Keyboard::Left)) {
                                view.move(Vector2f(-speed * del, 0));
                                wid += speed * del;
                                change = true;
                        }
                        if (Keyboard::isKeyPressed(Keyboard::Down)) {
                                view.move(Vector2f(0, speed * del));
                                change = true;
                        }
                        if (Keyboard::isKeyPressed(Keyboard::Up)) {
                                view.move(Vector2f(0, -speed * del));
                                change = true;
                        }
                        if (Keyboard::isKeyPressed(Keyboard::Right)) {
                                view.move(Vector2f(speed * del, 0));
                                wid += speed * del;
                                change = true;
                        }
                        if (Mouse::isButtonPressed(Mouse::Left)) {
                                for (int i = 0; i < 10; i++) {
                                        int key = rand() - rand();
                                        t = add(key, t);
                                }
                                change = true;
                        }
                        if (Keyboard::isKeyPressed(Keyboard::A)) {
                                int key;
                                cin >> key;
                                t = add(key, t);
                                change = true;
                        }
                        if (Keyboard::isKeyPressed(Keyboard::E)) {
                                int key;
                                cin >> key;
                                t = erase(key, t);
                                change = true;
                        }
                        if (Keyboard::isKeyPressed(Keyboard::N)) {
                                view.zoom(wid_n / wid);
                                speed *= wid_n / wid;
                                wid = wid_n;
                        }
                        if (change) {
                                window.setView(view);
                                window.clear(Color(128, 106, 89));
                                get_edg(t, 0, get_h(t));
                                wid_n = get(t, 0, get_h(t));
                                hei_n = get_h(t) * h_size;
                                //change = false;
                                window.display();
                        }
                }
        }
        return 0;
}
« Last Edit: November 08, 2021, 03:11:03 pm by osisi »

eXpl0it3r

  • SFML Team
  • Hero Member
  • *****
  • Posts: 11034
    • View Profile
    • development blog
    • Email
Re: Help me fix this project, please
« Reply #1 on: November 09, 2021, 09:15:16 am »
You can't have global SFML objects such as RenderWindow or Font, due to how SFML is built internally.
It generally is also not recommended to use global variables.

Additionally, I recommend to not use using namespace sf; or using namespace std; as it will make it harder to read your code overall and pulls all the class/types/etc into the global namespace.
Official FAQ: https://www.sfml-dev.org/faq.php
Official Discord Server: https://discord.gg/nr4X7Fh
——————————————————————
Dev Blog: https://duerrenberger.dev/blog/