kris Temat założony przez niniejszego użytkownika |
[C++] Error: 'pom' was not declared in this scope » 2013-03-22 20:57:43 Witam, napisałem sobie program, który tworzy listę jednostronną i wykonuje na niej różne funkcje. Wszystkie stworzone funkcje jak do tej pory działały prawidłowo, niestety gdy stworzyłem funkcję deleteAfter wyskoczył błąd powiadamiający, iż wskaźnik pomocniczy pom jest nie zdeklarowany.Nie rozumiem dlaczego wystąpił taki błąd bo jak na moje skromne oko powinno być to w porządku zwłaszcza że takim wskaźnikiem posługiwałem się już we wcześniejszych funkcjach wielokrotnie, a one działają.A oto kod funkcji: void deleteAfter( Node *& Node ) { Node * pom; pom = Node->Nodenext; Node->Nodenext = Node->Nodenext->Nodenext; delete pom; } Za wszelkie rady i pomoce z góry dziękuje:) |
|
unimator |
» 2013-03-22 21:48:23 Ciekawe... pomijam fakt, że *& to jakieś (zapewne niepotrzebne) dziwadło. Wiesz, z samej funkcji ciężko cokolwiek wywnioskować. Najlepiej by było jakbyś dolepił nam jeszcze deklarację struktury oraz log kompilatora. |
|
kris Temat założony przez niniejszego użytkownika |
» 2013-03-22 22:11:59 Struktura wygląda tak: struct Node { int val; Node * Nodenext; };
Zaś log kompilatora: In function 'void deleteAfter(Node*&)': 55 [Error] 'pom' was not declared in this scope
|
|
unimator |
» 2013-03-22 22:21:32 A zauważasz, że próbujesz stworzyć zmienną o takiej samej nazwie jak typ struktury? To tak jakbyś próbował stworzyć zmienną o nazwie int typu int (int int). Nigdy nie próbowałem takich praktyk więc nie wiem jak reaguje na to kompilator, ale to na pewno nie jest poprawne.
BTW, z tego co wiem to kompilator potraktuje każde wystąpienie 'Node' jako odwołanie do zmiennej. Próbujesz więc utworzyć wskaźnik 'pom' typu zmienna 'Node' a nie wskaźnik do klasy 'Node'. |
|
Mrovqa |
» 2013-03-22 22:28:20 void deleteAfter( Node *& Node ) { Node * pom; pom = Node->Nodenext; Node->Nodenext = Node->Nodenext->Nodenext; delete pom; } Chyba nie wiesz co ten kod robi. Dokładnie to samo, tyle, że zoptymalizowane: void deleteAfter( Node *& Node ) { delete Node->Nodenext; } /edit: już nie wspominając o tym, że przed odczytaniem informacji ze wskaźnika powinno się sprawdzić, czy zawiera prawidłowy adres. Argument - po co Ci referencja do wskaźnika? I tak go nie modyfikujesz, a za to blokujesz sobie możliwość czegoś takiego (przynajmniej w starym standardzie - nowego w pełni nie ogarnąłem jeszcze): Node x; deleteAfter( & x ); |
|
kris Temat założony przez niniejszego użytkownika |
» 2013-03-22 22:33:31 No chyba nie do końca to co to co napisałeś jako zoptymalizowane, bo ten kod w moim mniemaniu najpierw tworzy wskaźnik ustawia go na Nodenext potem do Nodenext przypisuje Nodenext next czyli to co pokazuje już na następnik a dopiero potem usuwa wskaźnik pomocniczy który już jest nam do niczego nie potrzebny. A pomijając ten fakt nie rozumiem dlaczego wyskakuje ten błąd z deklaracją skoro jest ona wykonana a czy używam ten wskaźnik czy też nie zawsze mam go prawo stworzyć i powinno działać, nieprawdaż?? A jeśli próbuje Node przekazać w jakikolwiek inny sposób niż mój to wyskakują kolejne błędy w tej funkcji nazwane tak: [Error] base operand of '->' has non-pointer type 'Node' Więc wnioskuję, że to moje "niepotrzebne dziwadło" jednak troszkę jest potrzebne;) Dałoby się tak tak (Node *Node) ale to nie zmienia faktu że ze wskaźnikiem dalej jest to samo...:( |
|
unimator |
» 2013-03-22 22:44:18 Mrovqa, to Twoje urwie głowę od reszty ciała :] Tzn. pierwszy element od reszty. Kris, spróbuj skompilować to: void deleteAfter( Node *& nodeArg ) { Node * pom; pom = nodeArg->Nodenext; nodeArg->Nodenext = nodeArg->Nodenext->Nodenext; delete pom; }
A pomijając ten fakt nie rozumiem dlaczego wyskakuje ten błąd z deklaracją skoro jest ona wykonana (...)
|
A ja strzelam, że ta deklaracja nie jest wykonywana. Wyjaśniłem w poście wyżej dlaczego. |
|
kris Temat założony przez niniejszego użytkownika |
» 2013-03-22 22:46:41 Ok już próbuję:) Działa, unimator dziękuje bardzo za pomoc i wyrozumiałość.Nie zdawałem sobie sprawy z tego, że takie coś może powodować takie błędy ;) |
|
« 1 » |