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

zarzadzanie pamiecia new i delete

Ostatnio zmodyfikowano 2010-08-06 14:27
Autor Wiadomość
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.

C/C++
#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; // ile testow wykonac //
    tab = new int[ t ]; // ile testow - tyle miejsc na liczby w tablicy - kazda liczba okresli ilosc pkt w tescie //
    if( t > 0 )
    {
        for( int i = 0; i < t; i++ )
        {
            cin >> n; // punktow w tescie //
            tab[ i ] = n; // liczba pubktow zapisana do tablicy //
            if( n > 0 && n < 1001 )
            {
                for( int j = 0; j < n; j++ )
                {
                    wskaznik = new punkt; //wskaznik wskazuje na nowy punkt //
                   
                    cin >> wskaznik->nazwa >> wskaznik->x >> wskaznik->y; // wpisanie nazwy, wspolrzednych x i y//
                    if( wskaznik->x >=- 1000 && wskaznik->y <= 1000 ) // sprawdzanie warunku zadania //
                    {
                        wskaznik->odl = licz_odleglosc( wskaznik ); //liczenie odleglosci //
                        V_punkty.push_back( wskaznik ); // dodanie do wektora //
                    }
                    else
                         return 0;
                   
                }
            }
            cout << "\n"; // znak nowej linii po kazdym tescie//
        }
    }
    for( int i = 0; i < V_punkty.size() - 1; i++ ) // sortowanie wektora wg odleglosci pkt od srodka UW//
    {
        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++ ) // k - ilosc testow, q - znacznik, w ktorym miejscu wektora odczytac, poczatek od 0//
    {
        for( int l = 0; l < tab[ k ]; l++ ) //l - ilosc przejsc, q- rosnie po kazdym przejsciu //
        {
            cout << V_punkty[ q ]->nazwa << " " << V_punkty[ q ]->x << " " << V_punkty[ q ]->y << "\n";
            q++;
        }
        cout << "\n"; // nowa linia po kazdej petli - tescie //
    }
    for( int i = V_punkty.size() - 1; i >= 0; i-- ) // czyszczenie wektora z adresow, oraz adresow - od konca//
    {
        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

P-20475
DejaVu
» 2010-08-06 03:57:12
Mógłbyś podać problem jaki masz...

/edit:
BTW:
C/C++
while( !V_punkty.empty() )
{
    delete *( V_punkty.rbegin() );
    V_punkty.erase( V_punkty.rbegin() );
}
P-20491
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 ===|
P-20508
DejaVu
» 2010-08-06 14:27:24
Cóż, skoro rbegin'a nie można usuwać to:
C/C++
while( !V_punkty.empty() )
{
    delete V_punkty.back();
    V_punkty.pop_back();
}
P-20511
« 1 »
  Strona 1 z 1