Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Error: 'pom' was not declared in this scope

Ostatnio zmodyfikowano 2013-03-22 22:46
Autor Wiadomość
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:

C/C++
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:)
P-79154
unimator
» 2013-03-22 21:48:23
C/C++
Node *& Node
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.
P-79160
kris
Temat założony przez niniejszego użytkownika
» 2013-03-22 22:11:59
Struktura wygląda tak:
C/C++
struct Node
{
   
    int val;
    Node * Nodenext;
   
};
Zaś log kompilatora:
In function 'void deleteAfter(Node*&)':
55 [Error] 'pom' was not declared in this scope
P-79162
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'.
P-79167
Mrovqa
» 2013-03-22 22:28:20
C/C++
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:
C/C++
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):
C/C++
Node x;
deleteAfter( & x );
P-79170
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...:(
P-79173
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:
C/C++
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.
P-79174
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 ;)
P-79175
« 1 »
  Strona 1 z 1