dmx81 Temat założony przez niniejszego użytkownika |
zarzadzanie pamiecia new i delete » 2010-08-05 23:33:56 witam, ponizej wklejam kod, jest to program, ktory sortuje punkty x,y w zaleznosci od odleglosci od srodka ukl.wsp. #include <iostream> #include <vector> #include <math.h> using namespace std; struct punkt { int x, y, odl; char nazwa[ 11 ]; };
int licz_odleglosc( punkt * s_punkt ) { return pow(( pow( s_punkt->x, 2 ) + pow( s_punkt->y, 2 ) ), 0.5 ); }
int main() { int t, n; vector < punkt *> V_punkty; punkt * wskaznik; int * tab; cin >> t; tab = new int[ t ]; if( t > 0 ) { for( int i = 0; i < t; i++ ) { cin >> n; tab[ i ] = n; if( n > 0 && n < 1001 ) { for( int j = 0; j < n; j++ ) { wskaznik = new punkt; cin >> wskaznik->nazwa >> wskaznik->x >> wskaznik->y; if( wskaznik->x >=- 1000 && wskaznik->y <= 1000 ) { wskaznik->odl = licz_odleglosc( wskaznik ); V_punkty.push_back( wskaznik ); } else return 0; } } cout << "\n"; } } for( int i = 0; i < V_punkty.size() - 1; i++ ) { for( int j = 0; j < V_punkty.size() - 1; j++ ) { if( V_punkty[ j ]->odl > V_punkty[ j + 1 ]->odl ) swap( V_punkty[ j ], V_punkty[ j + 1 ] ); } } int q = 0; for( int k = 0; k < t; k++ ) { for( int l = 0; l < tab[ k ]; l++ ) { cout << V_punkty[ q ]->nazwa << " " << V_punkty[ q ]->x << " " << V_punkty[ q ]->y << "\n"; q++; } cout << "\n"; } for( int i = V_punkty.size() - 1; i >= 0; i-- ) { wskaznik = V_punkty[ i ]; V_punkty.erase( V_punkty.end() - 1 ); delete wskaznik; } delete[] tab; return 0; }
jesli ktos chcialby sprawdzic i mi pomoc, podaje kroki wykonania: (poniewaz brak instrukcji wyswietlanych na ekranie) 1.wcisnij jakas niska liczbe testow (np 2 testy) 2.wcisnij, ile liczb podac w tescie nr 1 3.podaj nazwe (np a) spacja lub enter podaj x, spacja lub enter podaj y, enter 4.jesli testow wiecej niz 1, powtorz kroki 2,3 |
|
DejaVu |
» 2010-08-06 03:57:12 Mógłbyś podać problem jaki masz... /edit: BTW: while( !V_punkty.empty() ) { delete *( V_punkty.rbegin() ); V_punkty.erase( V_punkty.rbegin() ); }
|
|
dmx81 Temat założony przez niniejszego użytkownika |
» 2010-08-06 13:23:12 a przepraszam, wklejajac wiadomosc, chyba obcialem jej sens, a wiec problem. w C::B kompiluje sie bez bledu, program dziala jak nalezy, ale jesli sprawdzam kod online (na stronce do sprawdzania kodow), wyskakuje blad cos z bad::alloc czy jakos tak, wiec jakis blad przy alokowaniu pamieci - i chcialem poprosic, aby wylapac ten blad, w google wiekszosc odpowiedzi byla, ze cos zle przy "new", ja sam od siebie wlasnie dorobilem taki twor, ktory Pan Piotr poprawil - ale przy nim teraz wyskakuje blad : main.cpp|70|error: no matching function for call to `std::vector<punkt*, std::allocator<punkt*> >::erase(std::reverse_iterator<__gnu_cxx::__normal_iterator<punkt**, std::vector<punkt*, std::allocator<punkt*> > > >)'| C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\vector.tcc|108|note: candidates are: typename std::vector<_Tp, _Alloc>::iterator std::vector<_Tp, _Alloc>::erase(__gnu_cxx::__normal_iterator<typename _Alloc::pointer, std::vector<_Tp, _Alloc> >) [with _Tp = punkt*, _Alloc = std::allocator<punkt*>]| C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\vector.tcc|120|note: typename std::vector<_Tp, _Alloc>::iterator std::vector<_Tp, _Alloc>::erase(__gnu_cxx::__normal_iterator<typename _Alloc::pointer, std::vector<_Tp, _Alloc> >, __gnu_cxx::__normal_iterator<typename _Alloc::pointer, std::vector<_Tp, _Alloc> >) [with _Tp = punkt*, _Alloc = std::allocator<punkt*>]| ||=== Build finished: 1 errors, 1 warnings ===|
|
|
DejaVu |
» 2010-08-06 14:27:24 Cóż, skoro rbegin'a nie można usuwać to: while( !V_punkty.empty() ) { delete V_punkty.back(); V_punkty.pop_back(); } |
|
« 1 » |