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: void mergeSort( pierwsza ** arr, int low, int mid, int high ) { int i, m, k, l; 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 ]; } free( temp ); }
|
|
pekfos |
» 2014-10-19 14:48:43 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. Po co chcesz "czyścić pamięć"? |
|
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? |
|
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. |
|
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 :-) |
|
pekfos |
» 2014-10-19 15:14:42 A po co ci ta tymczasowa tablica? |
|
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: void mergeSort( pierwsza ** arr, int low, int mid, int high ) { int i, m, k, l; pierwsza * temp[ 300000 ]; ... }
Jak daje 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... 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. |
|
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.. |
|
1 « 2 » 3 |