Access violation reading location

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:

 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:

 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ć.

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);
}; 
 
0
  1. Użyj debuggera
  2. Domyślam się że sprawdzasz tylko czy temp!=NULL a potem robisz odwołanie
temp -> get_key() -> get_list() -> get_head()

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

0
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ź :)

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.

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.

0

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

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

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

root()
		{
			is_root = 0;
			list = new(node_list);
		}
0
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...

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 :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1