• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Naruszenie dostępu do odczytu SFML

Object Storage Arubacloud
0 głosów
444 wizyt
pytanie zadane 22 stycznia 2021 w C i C++ przez nanautzin Obywatel (1,510 p.)

Witam

Mam pewien problem z którym męczę się już kilka dobrych dni

Dwie klasy których prawdopodobnie dotyczy problem

#pragma once
#include <SFML/Graphics.hpp>
#include "Singe_option_esc_menu.hpp"

class Menu_esc_in_game
{
public:
	Menu_esc_in_game(sf::View& window, uint8_t type_menu);

	uint8_t system(sf::View& window);
	void objects_ini();
	void draw(sf::RenderWindow& window);

private:
	sf::RectangleShape all_panel_top;
	sf::Font font_menu;
	bool menu_visible{ false };
	std::vector<Singe_option_esc_menu>single_option;
	uint8_t no_of_option_menu{ 5 };
};

#include "Menu_esc_in_game.hpp"

Menu_esc_in_game::Menu_esc_in_game(sf::View& window, uint8_t type_menu)
{
	this->font_menu.loadFromFile("Game/Fonts/butler.ttf");
	this->all_panel_top.setSize(sf::Vector2f(window.getSize().x / 3, window.getSize().y / 3));
	this->all_panel_top.setPosition(window.getCenter().x - all_panel_top.getGlobalBounds().width / 2, window.getCenter().y - all_panel_top.getGlobalBounds().height / 2);
	this->all_panel_top.setFillColor(sf::Color(255, 0, 0, 111));
	this->objects_ini();
}

uint8_t Menu_esc_in_game::system(sf::View& window)
{
	if (menu_visible == false)
	{
		return 0;
	}
	else
	{
		return 1;
	}
	
}

void Menu_esc_in_game::objects_ini()
{
	single_option.push_back(Singe_option_esc_menu(&font_menu, sf::Vector2f(all_panel_top.getPosition().x, all_panel_top.getPosition().y),
		sf::Vector2f(all_panel_top.getGlobalBounds().width, all_panel_top.getGlobalBounds().height / no_of_option_menu), "Resume"));
}

void Menu_esc_in_game::draw(sf::RenderWindow& window)
{ 
	window.draw(all_panel_top);
	for (uint8_t i = 0; i < single_option.size(); i++)
	{
		single_option[i].draw(window);
	}
	//for (auto i : single_option)
	//	i.draw(window);

}

 

 

 

 

#pragma once
#include <SFML/Graphics.hpp>

class Singe_option_esc_menu
{
public:
	Singe_option_esc_menu(sf::Font* font_text, sf::Vector2f pos, sf::Vector2f size, std::string name);

	uint8_t system(sf::View& window, bool mark_on);
	void draw(sf::RenderWindow& window);

private:
	sf::RectangleShape esc_option;
	sf::RectangleShape mark_option;
	bool mark_visible{ false };
	sf::Text text_menu;
};
#include "Singe_option_esc_menu.hpp"

Singe_option_esc_menu::Singe_option_esc_menu(sf::Font* font_text, sf::Vector2f pos, sf::Vector2f size, std::string name)
{
	this->esc_option.setSize(sf::Vector2f(size.x, size.y));
	this->esc_option.setPosition(pos.x, pos.y);
	this->esc_option.setFillColor(sf::Color(0, 255, 0, 111));
	this->mark_option.setSize(sf::Vector2f(size.x, size.y));
	this->mark_option.setPosition(pos.x, pos.y);
	this->mark_option.setFillColor(sf::Color(0, 0, 0, 111));
	this->mark_option.setScale(sf::Vector2f(0, 0));

	this->text_menu.setString(name);
	this->text_menu.setFont(*font_text);
	this->text_menu.setCharacterSize(size.y);
	this->text_menu.setFillColor(sf::Color(111, 222, 55, 255));

	this->text_menu.setPosition(esc_option.getPosition().x + esc_option.getGlobalBounds().width / 2 - text_menu.getGlobalBounds().width / 2,
		esc_option.getPosition().y + esc_option.getGlobalBounds().height / 2 - text_menu.getGlobalBounds().height / 2);

}

uint8_t Singe_option_esc_menu::system(sf::View& window, bool mark_on)
{
	this->mark_visible = mark_on;
	if (mark_visible == true)
	{
		this->mark_option.setScale(sf::Vector2f(1.0, 1.0));
	}
	else
	{
		this->mark_option.setScale(sf::Vector2f(0, 0));
	}

	return 0;
}

void Singe_option_esc_menu::draw(sf::RenderWindow& window)
{
	window.draw(esc_option);
	window.draw(mark_option);
	window.draw(text_menu);
}

 

Wyskakuje mi błąd przy kompilacji:

Na tyle na ile pozwalają moje umiejętności uruchomiłem debuger i starałem się znaleźć miejsce gdzie program się zatrzymuje
Błąd wyskakuje dokładnie w momencie wywołania funkcji draw w lini 42 Singe_option_esc_menu.cpp

 

Nie mam pojęcia jak się za to zabrać, może ktoś da jakąś podpowiedz
Cały projekt na: GITHUB
 

1
komentarz 22 stycznia 2021 przez j23 Mędrzec (194,920 p.)

Wyskakuje mi błąd przy kompilacji:

Nie przy kompilacji, tylko w trakcie wykonania programu.

Mały hint: jak Ci się program zatrzyma na wyjątku, użyj podglądu Call stack, by zobaczyć stos wywołań funkcji. Dzięki czemu łatwo zlokalizujesz miejsce i okoliczności wywrotki programu.

komentarz 23 stycznia 2021 przez nanautzin Obywatel (1,510 p.)

Nie przy kompilacji, tylko w trakcie wykonania programu.

Fakt mój błąd

Mały hint: jak Ci się program zatrzyma na wyjątku, użyj podglądu Call stack, by zobaczyć stos wywołań funkcji. Dzięki czemu łatwo zlokalizujesz miejsce i okoliczności wywrotki programu. 

Dzięki na pewno się przyda, w tym przypadku moja wiedza nie pozwala mi dobrze zinterpretować co jest nie tak. 

2 odpowiedzi

+1 głos
odpowiedź 24 stycznia 2021 przez j23 Mędrzec (194,920 p.)
wybrane 25 stycznia 2021 przez nanautzin
 
Najlepsza

Przypomniało mi się, że mam program do analizy kodów źródłowych i znalazłem błąd:

void Menu_esc_in_game::objects_ini(sf::View& window)
{
	single_option.push_back(Singe_option_esc_menu(&font_menu, ...);
}

Sprawa wygląda tak, że obiekty klasy Singe_option_esc_menu dostają wskaźnik na fonta, który jest polem klasy Menu_esc_in_game, której obiekt jest kopiowany w:

uint8_t Game_ini::system(sf::RenderWindow& window, sf::Vector2i mouse)
{
        ...
        menu_esc.push_back(Menu_esc_in_game(view_game, 0));
}	

Problem w tym, że kopie obiektów z single_option zawierają wskaźniki do fonta z obiektu tymczasowego, czyli w trakcie wywołania draw nieistniejącego.

Opcje są dwie:

  1. Musisz zaimplementować Menu_esc_in_game konstruktor kopiujący, który zadba o to, by obiekty z single_option dostały poprawny wskaźnik.
  2. Możesz też użyć std::shared_ptr<sf::Font> w Menu_esc_in_game, by wskaźnik na fonta był cały czas taki sam.
komentarz 25 stycznia 2021 przez nanautzin Obywatel (1,510 p.)
Super, dzięki wielkie, to rzeczywiście było problemem, zastosowałem jeszcze inne rozwiązanie, umieściłem czcionkę w klasie Game_ini i wskaźnikiem do Menu_esc_in_game i do Single_option_esc_menu

Dziękuję ci za poświęcony czas
+1 głos
odpowiedź 22 stycznia 2021 przez tangarr Mędrzec (154,780 p.)

Sprawdź, czy dostajesz prawidłowy wynik z funkcji

    this->font_menu.loadFromFile("Game/Fonts/butler.ttf");

 

komentarz 24 stycznia 2021 przez nanautzin Obywatel (1,510 p.)

Pogubiłem się. To w końcu sprawdziłeś to tak, jak pisałem, czy nie?

Nie nie sprawdziłem, tak jak pisałeś, bo nie rozumiem jak mam to zrobić
I tak jak pisałem wywołałem go przy przed wywołaniem funkcji draw i mogę odczytać jego parametry, wiec w mojej logice jest nie usunięty.

Jak już wcześniej wspomniałem, użyj podglądu Call stack, by prześledzić, skąd i przy jakich parametrach strzela wyjątek.

Nic mi nie mówi ten podgląd funkcja draw jest wywoływana od maina przez wszystkie klasy tak jak powinna być wywoływana i w pewnym momencie wyskakuję wyjątek

Nikt za Ciebie nie będzie analizował (na sucho) projektu z kilkunastoma plikami źródłowymi.

Dzięki za dotychczasową pomoc. Będę musiał to jakoś ogarnąć.

komentarz 24 stycznia 2021 przez j23 Mędrzec (194,920 p.)

(...) bo nie rozumiem jak mam to zrobić

Nie wiesz, jak ustawić breakpointa w VC++? Proszz -> link Radzę nauczyć się obsługi debuggera, bo to bardzo pomocne narzędzie w rozwiązywaniu takich problemów.

Zakładam, że wiesz jak zrobić destruktor. W końcu trochę tego kodu napisałeś.

Nic mi nie mówi ten podgląd (...)

Jeśli dobrze pamiętam, w VC++ jak będziesz przechodził do kolejnych funkcji powinieneś mieć możliwość podejrzenia wartości zmiennych. Wystarczy sprawdzić, czy wartości są prawidłowe, czy nie ma gdzieś wskaźników o niespodziewanej wartości 0xCCCC..., 0xFFFF... lub 0x0. Trzeba kombinować...

 

komentarz 24 stycznia 2021 przez nanautzin Obywatel (1,510 p.)

Nie wiesz, jak ustawić breakpointa w VC++? Proszz -> link Radzę nauczyć się obsługi debuggera, bo to bardzo pomocne narzędzie w rozwiązywaniu takich problemów.

Wiem jak to zrobić 

Zakładam, że wiesz jak zrobić destruktor. W końcu trochę tego kodu napisałeś.

To również wiem

Ustawiłem breakpoint w destruktorze, tylko problemem jest to że nie umiem do końca interpretować danych które się pojawiają  przy każdym kroku, tzn. wartości zmiennych, funkcji, klas, etc, które ja stworzyłem nie mam problemu(w większości przypadków), ale dane z bibliotek/klas których ja nie stworzyłem jest już trudniejsze.

Jeśli dobrze pamiętam, w VC++ jak będziesz przechodził do kolejnych funkcji powinieneś mieć możliwość podejrzenia wartości zmiennych. Wystarczy sprawdzić, czy wartości są prawidłowe, czy nie ma gdzieś wskaźników o niespodziewanej wartości 0xCCCC..., 0xFFFF... lub 0x0. Trzeba kombinować...

Przeglądam oczywiście, ale w większości przypadków nic mi te dane nie mówią, co to znaczy prawidłowe? Niespodziewane wartości wskaźników? Ja nie wiem jakie są niespodziewane wartości

komentarz 24 stycznia 2021 przez j23 Mędrzec (194,920 p.)

Ustawiłem breakpoint w destruktorze, tylko problemem jest to że nie umiem do końca interpretować danych które się pojawiają  przy każdym kroku,

Akurat z breakpointem w destruktorze chodziło mi o wykrycie, czy obiekt jest niszczony przed wywołaniem metody draw. Obiekt fonta generuje błąd, choć plik został załadowany, zatem wygląda to trochę, jakby coś było z nim nie tak (lub jego właścicielem - obiektem klasy Menu_esc_in_game). Dlatego pierwsze, co trzeba sprawdzić, to czy obiekt menu nie jest za wcześnie niszczony (i później używany).

(...) co to znaczy prawidłowe? Niespodziewane wartości wskaźników?

Niespodziewane wartości to takie, których być nie powinno w danej chwili, np. this = 0x0000000000000000 lub 0xFFFFFFFFFFFFFFFF.

ale dane z bibliotek/klas których ja nie stworzyłem jest już trudniejsze.

Spójrz na kod generujący wyjątek. Pole m_pages to mapa. Tu nie ma mowy o przekroczeniu zakresu - cokolwiek byś dał w characterSize, będzie działać. Skoro nie działa, to znaczy, że z tą mapą jest coś nie tak. Co może być nie tak? Albo nie została stworzona (np. odwołanie przez niezainicjowany wskaźnik), albo została uszkodzona (np. przekraczasz gdzieś jakąś tablicę i piszesz po pamięci), albo została wcześniej usunięta.

Trzeba kombinować ;)

komentarz 25 stycznia 2021 przez nanautzin Obywatel (1,510 p.)
Wszystkie rady które umieściłeś w tym poście na pewno przydadzą się w przyszłości, dzieki

Podobne pytania

0 głosów
0 odpowiedzi 3,780 wizyt
0 głosów
0 odpowiedzi 145 wizyt
pytanie zadane 11 lutego 2021 w C i C++ przez nanautzin Obywatel (1,510 p.)
0 głosów
1 odpowiedź 793 wizyt
pytanie zadane 4 sierpnia 2019 w C i C++ przez WojtaZio23 Użytkownik (660 p.)

92,539 zapytań

141,382 odpowiedzi

319,477 komentarzy

61,928 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...