Access violation reading location

Access violation reading location
PT
  • Rejestracja:prawie 14 lat
  • Ostatnio:ponad 11 lat
  • Postów:12
0

Witam.

Piszę program który za zadanie ma stworzyć drzewo o dowolnej liczbie wierzchołków na danym poziomie. Do tego posługuję się listą jednokierunkową która przechowuje wskaźniki do wierzchołków. Do nowego wierzchołka przypisuję sobie ID wcześniej jednak sprawdzam czy podane ID czasem nie istnieje już na liście. I napotkałem pewien problem. Tworzę sobie roota (on też przechowuje listę ze wskaźnikami). Następnie dodaję wierzchołek prowadzony od roota. Później dodaję kolejny i wyrzuca mi właśnie ten błąd "Access violation reading location" w tym miejscu:

Kopiuj
 node_list_element *node_list::get_head()
{
	return head;
}

metoda ta wywoływana jest przez funkcję która przeszukuje drzewo w poszukiwaniu czy podane przez użytkownika ID czasem nie zostało wcześniej wprowadzone:

Kopiuj
 node *root::find_element(node_list_element *ptr, int node_id)
{
	node_list_element *temp = ptr;
	while(temp != NULL)
	{
		
		if(temp -> get_key() -> get_id() == node_id)
		{
			return temp -> get_key();
		}
		
		else
		{
			node *temp_node = find_element(temp -> get_key() -> get_list() -> get_head(), node_id);
			if(temp_node)
			{
				return temp_node;
			}
		}

		temp = temp -> get_next();
	}

	return NULL;
}

całego kodu wklejać nie będę bo sporo tego jakby coś wg Was było potrzebne to pisać.

Kopiuj
class root
{
	private:

		node_list *list;
		int is_root;

	public:

		root()
		{
			is_root = 0;
			list = new(node_list);
		}

		void set_list(node_list *temp_list);
		node_list *get_list();
		void set_id();
		int get_id();
		node *find_element(node_list_element *ptr, int node_id);
}; 
Kopiuj
 
edytowany 3x, ostatnio: piotrekTSW
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0
  1. Użyj debuggera
  2. Domyślam się że sprawdzasz tylko czy temp!=NULL a potem robisz odwołanie
Kopiuj
temp -> get_key() -> get_list() -> get_head()

i nigdzie nie sprawdzasz czy temp->get_key() -> get_list() nie jest jakimś NULLem...


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
PT
  • Rejestracja:prawie 14 lat
  • Ostatnio:ponad 11 lat
  • Postów:12
0
Kopiuj
node *temp_node = find_element(temp -> get_key() -> get_list() -> get_head(), node_id); 

w tym miejscu zdaje się jest problem ponieważ po tym breakpoincie program się sypie przy dodaniu drugiego wierzchołka od root'a.
Nadal jednak nie wiem jak poradzić sobie z moim problem. Dzięki za odpowiedź :)

edytowany 1x, ostatnio: piotrekTSW
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

No to wstaw breakpointy wewnątrz tych metod które wywołujesz, tzn get_key(), get_list(), get_head() u sprawdź w której z nich robisz błędne odwołanie do pamięci.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
PT
  • Rejestracja:prawie 14 lat
  • Ostatnio:ponad 11 lat
  • Postów:12
0

- this 0xcdcdcdcd {head=??? } node_list * const

Bardzo często taki komunikat się pojawia przy debuggowaniu. head gdy tworzę nową listę ustawiam na NULL w konstruktorze.

edit

OK działa. Co zmieniłem aby zadziało? nie mam pojecia właśnie... póki co dzięki za pomoc Shalom :)

edit_2

hm niestety problem mój się nie kończy. Teraz mam problem tego typu że dodaję wierzchołek (root) od niego prowadzę kolejny np. 5 i od tej 5 prowadzę kolejny np 7. I w tym momencie jest źle ponieważ gdy próbuję dodać kolejny wierzchołek (niezależnie od którego wierzchołka) to program się sypie tym razem

Stack overflow

dodam że sypie się to niestety przy tej rekurencji (działa w nieskończoność). Proszę o pomoc :) pozdrawiam.

edytowany 4x, ostatnio: piotrekTSW
PT
  • Rejestracja:prawie 14 lat
  • Ostatnio:ponad 11 lat
  • Postów:12
0

Przepraszam że post pod postem ale nowego tematu zakładać nie będę a pasuje mi dowiedzieć się jedną rzecz. Mianowicie

Kopiuj
node()
		{
			my_list = new node_list;
		} 

mam następujący konstruktor jest on bezargumentowy. Przy kompilacji kompilator wywala błąd

error C2512: 'node_list' : no appropriate default constructor available

w klasie node_list mam konstruktor również bez argumentowy

Kopiuj
node_list()
{
	head = NULL;
} 

czyli zwykle głowa na NULL i teraz pytanie co jest nie tak? Dlaczego ten błąd? Szukając po googlach rozwiązaniem jest że konstruktor musi nie przyjmować argumentów. U mnie nie przyjmuje a jednak błąd wywala.

Nie wiem czy może to pomóc ale mam inną klasę root wyglada ona podobnie co node lecz nie zastosowałem dziedziczenia. W root konstruktor wygląda identycznie jak w node

Kopiuj
root()
		{
			is_root = 0;
			list = new(node_list);
		}
edytowany 2x, ostatnio: piotrekTSW
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0
Kopiuj
my_list = new node_list();

poza tym jeśli dziedziczysz z klasy która nie ma konstruktora bezargumentowego to musisz jakiś konstruktor wywołać z listy inicjalizacyjnej w konstruktorze klasy pochodnej.
A tego rekurencyjnego finda nie rozumiem. Tzn nie wiem po co w ogóle masz tam rekurencje...


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 2x, ostatnio: Shalom
PT
  • Rejestracja:prawie 14 lat
  • Ostatnio:ponad 11 lat
  • Postów:12
0

find to funkcja która przeszukuje drzewo w poszukiwaniu wierzchołka. Dodając nowy wierzchołek podaję mu ID(poza rootem który ma ID ustalone na 1). Find ma znaleźć czy podane ID czasem nie zostało wcześniej podane. Służy również do tego by znaleźć wierzchołek do którego chcę podpiąć nowy.

Co do tego konstruktora to ja chcę stworzyć wskaźnik na obiekt typu node_list więc nawiasy tutaj chyba są zbędne? czy czegoś po prostu nie zrozumiałem?

edit

poradziłem sobie z problemem ;) ten konstruktor wpisałem w pliku c++ a nie nagłókowym tak jak wcześniej i działa. Co do rekurencji to również napisana jest poprawnie, problem był w czymś innym jednak by to zrozumieć musiałbym chyba wkleić cały kod a pewnie i tak nikomu się to nie przyda :) dzięki za pomoc :)

edytowany 1x, ostatnio: piotrekTSW

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.