C++ :: Problem z pojemnikiem typu lista

Witam wszystkich.
W ramach ćwiczeń chciałem napisać sobie program w c++ zawierający pojemnik typu lista (łączona podwójnie, czy jak wolą niektórzy dwukierunkowa). Stworzyłem pojemnik oraz funkcję wstawiającą do niego obiekt i chciałem sprawdzić czy narazie wszystko gra. Program sie zkompilował, lecz gdy go odpaliłem, wyskakuje błąd:
AppName: cpp1.exe AppVer: 0.0.0.0 ModName: cpp1.exe
ModVer: 0.0.0.0 Offset: 0000138c
itd itd.

W debugerze wygląda on tak (w komentarzu oznaczenie, która linijka powoduje błąd):
Loaded 'ntdll.dll', no matching symbolic information found.
Loaded 'G:\WINDOWS\system32\kernel32.dll', no matching symbolic information found.
First–chance exception in Cpp1.exe: 0xC0000005: Access Violation.

Załączam kod źródłowy:

#include
#include

template
class lista {
struct element {
typa* obiekt;
element* poprzedni;
element* nastepny;
element() : obiekt(NULL), poprzedni(NULL), nastepny(NULL) { }
};
element * pierwszy;
element * ostatni;
element * ktory;
int ileelementow;
public:
lista() : pierwszy(NULL), ostatni(NULL), ktory(NULL) {
ileelementow=0;
}

void wstaw(typa & cel, int pozycja=0) {
element * pomocniczy = new element;
pomocniczy–>obiekt=&cel;
element * dodatkowy = new element;
if(ileelementow=0) {
ostatni=pomocniczy;
pierwszy=pomocniczy;
} else {
if((pozycjaileelementow)) {
ostatni–>nastepny=pomocniczy; // Ta linijka powoduje błąd
pomocniczy–>poprzedni=ostatni;
ostatni=pomocniczy; }
else {
dodatkowy = pierwszy;
for(int i=1; i
dodatkowy = dodatkowy–>nastepny;
}
pomocniczy–>nastepny=dodatkowy;
pomocniczy–>poprzedni=dodatkowy–>poprzedni;
(pomocniczy–>poprzedni)–>nastepny=pomocniczy;
(pomocniczy–>nastepny)–>poprzedni=pomocniczy; }
}
ileelementow++;
}

friend ostream & operator< &) ;
};

template
ostream & operator< & obiekt) {
lista::element * wsk;
wsk=obiekt.pierwszy;
for(int i=1; i
strumien<<< wsk=wsk–>nastepny;
}
strumien<
return strumien;
}

int main( ) {
lista pojlista;
float obiekt1=2.5, obiekt2=9.75, obiekt3=19.625, obiekt4=0.125;

cout<<
cout<
cout<<
pojlista.wstaw(obiekt1);
pojlista.wstaw(obiekt2); // Ta linijka powoduje błąd
cout<
cout<<
pojlista.wstaw(obiekt3, 2);
cout<
cout<<
pojlista.wstaw(obiekt4, 6);
cout<
cout<<<
getch();
return 0;
}


Gdyby ktoś wiedział czemu to nie działa, będę bardzo wdzięczny.

Odpowiedzi: 2

cptnemo:
Typowy błąd w C.
Zamiast:
if( ileelementow = 0 )

powinno być:
if( ileelementow == 0 )

Nie wiem czemu gcc nie wypisało mi warningów jak to kompilowało, a powinno, bo sam się ciągle na tym przejeźdźam mimo, źe pisałem juź kilo kodu w C/C++.


Faktycznie, niezauwaźyłem tego błędu. (Kompilator nie protestuje, bo takie operacje w języku C++ są legalne – najpierw zosdtaje wykonane przypisanie, a następnie sprawdzenie warunku, które w tym wypadku zawsze będzie dawało rezultat 0, czyli fałsz.


W kaźdym razie dzięki
MetaVirus
Dodano
24.07.2005 22:04:50
Typowy błąd w C.
Zamiast:
if( ileelementow = 0 )

powinno być:
if( ileelementow == 0 )

Nie wiem czemu gcc nie wypisało mi warningów jak to kompilowało, a powinno, bo sam się ciągle na tym przejeźdźam mimo, źe pisałem juź kilo kodu w C/C++. Swoją drogą polecam włączenie wszystkich sensownych ostrzeń oraz uźywanie lint'a.

Zwróć jeszcze uwagę na takie rzeczy:
* #include –– to są nowe nagłówki biblioteki standardowej
* kiedy deklarujesz przyjaciół dodaj dodatkowego template'a
(z innym argumentem niź w otaczającym)
To wszystko są elementy, wywodzące się ze starego c++ i są błędne (lub odradzane) wg. normy ISO C++

Po wszystkich poprawkach kod wygląda tak (raczej ok):


#include
using namespace std;


template
class lista {
struct element {
typa* obiekt;
element* poprzedni;
element* nastepny;
element() : obiekt(NULL), poprzedni(NULL), nastepny(NULL) { }
};
element * pierwszy;
element * ostatni;
element * ktory;
int ileelementow;
public:
lista() : pierwszy(NULL), ostatni(NULL), ktory(NULL) {
ileelementow=0;
}

void wstaw(typa & cel, int pozycja=0) {
element * pomocniczy = new element;
pomocniczy–>obiekt=&cel;
element * dodatkowy = new element;
if(ileelementow==0) {
ostatni=pomocniczy;
pierwszy=pomocniczy;
} else {
if((pozycjaileelementow)) {
ostatni–>nastepny=pomocniczy; // Ta linijka powoduje błąd
pomocniczy–>poprzedni=ostatni;
ostatni=pomocniczy; }
else {
dodatkowy = pierwszy;
for(int i=1; i
dodatkowy = dodatkowy–>nastepny;
}
pomocniczy–>nastepny=dodatkowy;
pomocniczy–>poprzedni=dodatkowy–>poprzedni;
(pomocniczy–>poprzedni)–>nastepny=pomocniczy;
(pomocniczy–>nastepny)–>poprzedni=pomocniczy; }
}
ileelementow++;
}

template
friend ostream & operator< &) ;
};

template
ostream & operator< & obiekt) {
typename lista::element * wsk;
wsk=obiekt.pierwszy;
for(int i=1; i
strumien<<< wsk=wsk–>nastepny;
}
strumien<
return strumien;
}

int main( ) {
lista pojlista;
float obiekt1=2.5, obiekt2=9.75, obiekt3=19.625, obiekt4=0.125;

cout<<
cout<
cout<<
pojlista.wstaw(obiekt1);
pojlista.wstaw(obiekt2); // Ta linijka powoduje błąd
cout<
cout<<
pojlista.wstaw(obiekt3, 2);
cout<
cout<<
pojlista.wstaw(obiekt4, 6);
cout<
cout<<<
return 0;
}
cptnemo
Dodano
23.07.2005 23:23:07
MetaVirus
Dodano:
16.07.2005 03:54:58
Komentarzy:
2
Strona 1 / 1