Skocz do zawartości

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

zizou666

Rozwiązany: C++ i malloc

Polecane posty

Mam pewnien problem, otoz nie wiem jak po stworzeniu tablicy dynamicznej, podczas sortowania tej tablicy (np przez wstawianie) okreslic koniec danych. Kiedy tworzylem zwykle tablice, maksymalny rozmiar wynosil 500 000. Wtedy wystarczylo przypisac taka wartosc do jakiejs zmiennej i potem stworzyc np dane[n], gdzie n = 500000. Kiedy stworze tablice mallociem np:

 int *dane;
    size_t size = 1000000;
    dane = (int*) malloc(size* sizeof(int));

i pozniej przy wstawianiu w petli for drugi warunek mam "i<1000000" to program wogole nie sortuje (dodam, ze dla zwyklych tablic wszystko dzialalo ok). Probowalem wpisac jakos "sizeof dane" czy cos takiego, ale mi sie wysypywal. Wie ktos jak to rozwiazac?

PS: Wydaje mi sie, ze trzeba to zrobic jakos na wskaznikach, jednak nie mam pojecia jak ;)

Link do komentarza
Udostępnij na innych stronach

Alokacja jest zrobiona raczej poprawnie, co najwyżej powinieneś dodać sprawdzenie czy się powiodła.

int *dane = 0; //wstępna inicjalizacja zmiennych
size_t size = 1000000;

dane = (int*) malloc(size* sizeof(int));
if (0 == dane)
{
   //Obsługa błędu
}

Pokaż to sortowanie.

Link do komentarza
Udostępnij na innych stronach

    int x;                                                      //sortowanie przez wstawianie
    for(i=0; i<n; i++)
    {
    x=dane[i];
    j=i-1;
    while(j>=0&&dane[j]>x)
    {
    dane[j+1]=dane[j];
    j--;
    }
    dane[j+1]=x;
    }

Tutaj jeszcze stara wersja z n-em.

Sortowanie chyba jest poprawne, w koncu wczesniej sortowalem dla tablic niedynamicznych i bylo bez problemu. Mysle ze koniec danych mam jakos zle okreslony.

Aha i tak wogole to sortuje roznymi metodami i np w babelkowym (do ktorego mam troche inaczej bo mam w funkcji, wstawianie tez mialem na funkcje zamienic) tablicy dynamicznej nie moge przez wskaznik przekazac do funkcji.

Link do komentarza
Udostępnij na innych stronach

Tak, sa w jednej funkcji. A dalem po n bo mialem tak wczesniej dla zwyklej tablicy, wiem ze tak nie dziala. Ale jesli kombinowalem z i<size dane, to program sie kompilowal, ale po rozpoczeniu sortowania sie wieszal. Wrzucilem w petle system("pause") i nastepuje to przy 3 czy 4 przebiegu petli.

Link do komentarza
Udostępnij na innych stronach

Czas nauczyć się debugować program. Jeżeli korzystasz z Visual Studio, to masz dobry debugger pod ręką. Polecam skorzystać. Jeżeli nie korzystasz z VS, to masz trudniej.

Zamiast korzystać z pauzy, wypisuj sobie stan aplikacji.

    int x;                                                      //sortowanie przez wstawianie

std::cout << "Sort begin" << std::endl;

    for(i=0; i<n; i++)
    {

std::cout << "Pass: " << i;

    x=dane[i];
    j=i-1;

std::cout << " x: " << x << " j: " << j << std::endl;

    while(j>=0&&dane[j]>x)
    {

std::cout << "While loop j:" << j << std::endl;
std::cout << "Data[" << j + 1 << "]:" << dane[j+1] << " Data[" << j << "]:" << dane[j] << std::endl;

    dane[j+1]=dane[j];
    j--;
    }
    dane[j+1]=x;
    }

Przekieruj sobie strumień wyjścia do pliku, to ułatwi Ci analizę wyników.

Wrzuć cały kod, inaczej trudno będzie Ci pomóc.

Link do komentarza
Udostępnij na innych stronach

Tak tez chyba zrobie.

Nie korzystalem wczesniej z Visual Studio, ale mialem od jakegos czasu zmienic srodowisko (mam Deva i Code:Blocksa, z ktorych mi juz tutaj na forum odradzano korzystania). Takze zapoznam sie z Visualem, a jak nie bede mogl dalej znalesc bledu to wkleje tutaj caly kod.

Link do komentarza
Udostępnij na innych stronach

Gość
Temat jest zablokowany i nie można w nim pisać.


  • Kto przegląda   0 użytkowników

    • Brak zalogowanych użytkowników przeglądających tę stronę.
×
×
  • Utwórz nowe...