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:
Gdyby ktoś wiedział czemu to nie działa, będę bardzo wdzięczny.
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
Typowy błąd w C.
Zamiast:
powinno być:
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):
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;
}
Strona 1 / 1