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

[ANSI C] Czyszczenie tablicy wskaźnikowej

Ostatnio zmodyfikowano 2014-10-19 16:52
Autor Wiadomość
wiktor12348
Temat założony przez niniejszego użytkownika
» 2014-10-19 14:42:28
Jak przyrównuje tablice do wskaźnika wywala błąd operatora. W sumie dziwnie porównywać tablice wskaźników. Może trochę kodu:

C/C++
void mergeSort( pierwsza ** arr, int low, int mid, int high ) {
   
    int i, m, k, l;
    //pierwsza** temp=(pierwsza**) malloc(sizeof(pierwsza*)*400000); // działa
    //pierwsza temp[400000]; //nie działa
    l = low;
    i = low;
    m = mid + 1;
   
    while(( l <= mid ) &&( m <= high ) ) {
       
        if( arr[ l ]->a <= arr[ m ]->a ) {
            temp[ i ] = arr[ l ];
            l++;
        }
        else {
            temp[ i ] = arr[ m ];
            m++;
        }
        i++;
    }
   
    if( l > mid ) {
        for( k = m; k <= high; k++ ) {
            temp[ i ] = arr[ k ];
            i++;
        }
    }
    else
    {
        for( k = l; k <= mid; k++ ) {
            temp[ i ] = arr[ k ];
            i++;
        }
    }
   
    for( k = low; k <= high; k++ ) {
        arr[ k ] = temp[ k ];
    }
    //czysc(temp,400000); //poleci parę pętli i się gubi. zapewne zakres tablicy za duży
    free( temp ); //działa
}
P-118894
pekfos
» 2014-10-19 14:48:43
C/C++
//pierwsza temp[400000]; //nie działa
Bo to miała być tablica wskaźników, a nie struktur. 400k wskaźników to może być trochę za dużo dla tablicy lokalnej, najlepiej przenieś to do zakresu globalnego.

C/C++
//czysc(temp,400000); //poleci parę pętli i się gubi. zapewne zakres tablicy za duży
Po co chcesz "czyścić pamięć"?
P-118896
wiktor12348
Temat założony przez niniejszego użytkownika
» 2014-10-19 14:58:30
Po co chcesz "czyścić pamięć"?

Gdy jakaś funkcja zostanie zakończona, pamięć jaką zajmowały jej zmienne lokalne jest czyszczona?


Bo to miała być tablica wskaźników, a nie struktur. 400k wskaźników to może być trochę za dużo dla tablicy lokalnej, najlepiej przenieś to do zakresu globalnego.
 
pierwsza * temp[ 400000 ];

Wywala błąd stosu, więc potwierdzam. Jak tam jest tworzone 400k komórek pod tablice i dam ją jako globalną nie będzie nadpisu, jeśli tam jest rekurencja?

P-118897
pekfos
» 2014-10-19 15:03:21
Gdy jakaś funkcja zostanie zakończona, pamięć jaką zajmowały jej zmienne lokalne jest czyszczona?
Zmienne lokalne są usuwane automatycznie. Nie możesz ich ręcznie usuwać.

dam ją jako globalną nie będzie nadpisu, jeśli tam jest rekurencja?
Wtedy te rozwiązanie się nie sprawdzi. Zostanie tylko ręczne alokowanie. Chyba, że nie potrzebujesz aż tylu elementów i znasz rozmiar, lub w ogóle nie potrzebujesz tej dodatkowej pamięci. Na twoim miejscu skłaniałbym się ku tej ostatniej opcji. Coś masz poważnie nie tak z pomysłem na program, jeśli chcesz w algorytmie rekurencyjnym, na każdym etapie, alokować pamięć na cały zbiór elementów.
P-118898
wiktor12348
Temat założony przez niniejszego użytkownika
» 2014-10-19 15:08:29
Generalnie mam do posortowania 350 tys. liczb w zakresie od 1 do 1 miliona.

Jak i gdzie twoim zdaniem powinienem deklarować tymczasową tablice struktur? Chodzi mi tutaj już o konkret, nie o naprowadzenie, jak wcześniej :-)
P-118899
pekfos
» 2014-10-19 15:14:42
A po co ci ta tymczasowa tablica?
P-118903
wiktor12348
Temat założony przez niniejszego użytkownika
» 2014-10-19 15:25:23
Do algorytmu mergeSort, brałem ten: http://www.cquestions.com/2011/07/merge-sort-program-in-c.html

Też w funkcji używam takiej tablicy:
C/C++
void mergeSort( pierwsza ** arr, int low, int mid, int high ) {
   
    int i, m, k, l;
    pierwsza * temp[ 300000 ];
    ...
}

Jak daje
C/C++
pierwsza * temp[ 100000 ];
A sortuje 30K - nie ma problemu, sortuje w mniej niż 1s.
Zwiększyłem ilość liczba do 350K, to mam błąd:

Stack around the variable 'temp' was corrupted.
Podejrzewam że tablica jest za mała...

C/C++
pierwsza * temp[ 350000 ];
Zmieniłem jak wyżej i dalej sortuje 350K liczb. Widzę:
Unhandled exception at 0x00A21587 in SDiZOLAB1.exe: 0xC00000FD: Stack overflow (parameters: 0x00000000, 0x002A2000).

Podejrzewam że wina architektury i "stos jest za mały", bo to algorytm rekurencyjny.
P-118904
pekfos
» 2014-10-19 16:31:26
brałem ten: http://www.cquestions.com/2011/07/merge-sort-program-in-c.html
Szkoda prądu na taką implementację, przy tej ilości elementów..
P-118923
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona