korpus2 Temat założony przez niniejszego użytkownika |
Access violation reading location » 2013-01-12 18:13:37 Chce prosto zrównoleglić qsorta. Podzielić na 2 tablice i każdej wywołać qsort oddzielnie potem scalić wyniki. Otrzymuje Access violation reading location w linii v = t[ div( pocz + kon, 2 ).quot ]; //TU SIĘ UKAZUJE BŁĄD!!!! w funkcji quick_sort void parallel_quick_sort( int * t, int pocz, int kon, int rozmiar ) { int rozmiar1; int rozmiar2; quick_tablica sort1; quick_tablica sort2; rozmiar1 = rozmiar / 2; rozmiar2 = rozmiar - rozmiar1; sort1.rozmiar = rozmiar1; sort2.rozmiar = rozmiar2; sort1.tab =( int * ) malloc( sort1.rozmiar * sizeof( int * ) ); sort2.tab =( int * ) malloc( sort2.rozmiar * sizeof( int * ) ); for( int i = 0; i < rozmiar1; i++ ) { sort1.tab[ i ] = t[ i ]; } sort1.pocz = 0; sort1.kon = rozmiar1 - 1; if( rozmiar % 2 == 0 ) { for( int i = 0; i < rozmiar2; i++ ) { sort2.tab[ i ] = t[ rozmiar2 + i ]; } } else { for( int i = 0; i < rozmiar2; i++ ) { sort2.tab[ i ] = t[ rozmiar2 + i - 1 ]; } } sort2.pocz = 0; sort2.kon = rozmiar2 - 1; HANDLE thread1 =( HANDLE ) _beginthread(( void( * )( void * ) ) p_quick_sort, NULL,( void * ) & sort1 ); HANDLE thread2 =( HANDLE ) _beginthread(( void( * )( void * ) ) p_quick_sort, NULL,( void * ) & sort2 ); WaitForSingleObject( thread1, INFINITE ); WaitForSingleObject( thread2, INFINITE ); merge( sort1.tab,( sort1.tab + sort1.rozmiar ), sort2.tab,( sort2.tab + sort2.rozmiar ), t ); free( sort1.tab ); free( sort2.tab ); return; }
void __cdecl p_quick_sort( quick_tablica data ) { quick_sort( data.tab, data.pocz, data.kon ); Sleep( 0 ); _endthread(); return; }
void quick_sort( int * t, int pocz, int kon ) { int i = pocz; int j = kon; int v; int tmp; v = t[ div( pocz + kon, 2 ).quot ]; do { while( t[ i ] < v ) i++; while( v < t[ j ] ) j--; if( i <= j ) { tmp = t[ i ]; t[ i ] = t[ j ]; t[ j ] = tmp; i++; j--; } } while( i <= j ); if( pocz < j ) quick_sort( t, pocz, j ); if( i < kon ) quick_sort( t, i, kon ); return; }
proszę o pomoc |
|
kubawal |
» 2013-01-12 18:26:56 Podaj liczby, które podaje komunikat. Jeśli jest tam 0x000000000 (ileś zer), oznacza to problem ze wskaźnikiem zerowym.
Prawdopodobnie wyjście poza zakres tablicy. |
|
korpus2 Temat założony przez niniejszego użytkownika |
» 2013-01-12 18:32:29 Pełna treść komunikatu:
Unhandled exception at 0x00403c72 in KodC.exe: 0xC0000005: Access violation reading location 0x514add58.
mógłby ktoś poszukać gdzie ewentualnie mogę wyjechać poza tablice? bo jakoś nie widzę gdzie mogłoby to być. |
|
DejaVu |
» 2013-01-12 18:49:04 Brzydki kod - bleee :P Może źle zrobiłeś merga? :) Wykomentuj jeden fragment kodu - sprawdź - drugi fragment kodu - sprawdź - albo odpal debuggera - i sprawdź :) /edit: if( rozmiar % 2 == 0 ) { for( int i = 0; i < rozmiar2; i++ ) { sort2.tab[ i ] = t[ rozmiar2 + i ]; } } else { for( int i = 0; i < rozmiar2; i++ ) { sort2.tab[ i ] = t[ rozmiar2 + i - 1 ]; } }
ten kod wygląda co najmniej dziwnie... |
|
Admixior |
» 2013-01-12 18:50:24 Zapewne nie rozwiąże to problemu ale malloc( sort1.rozmiar * sizeof( int * ) ); rezerwujesz inty a nie wskaźniki do intów //edit: Pokaż definicje klasy quick_tablica |
|
korpus2 Temat założony przez niniejszego użytkownika |
» 2013-01-12 19:24:23 typedef struct { int pocz; int kon; int rozmiar; int * tab; } quick_tablica;
edit: merge jest biblioteczną funkcją z #include <algorithm> |
|
Admixior |
» 2013-01-12 19:34:50 Oto i co brakuje: void quick_sort( int * t, int pocz, int kon ) { int tmp; i =*( t =*(( int * )( i =( int * ) pocz, j =( int * ) i + 1 ) + 2 ), j =( int * ) j,( int * ) i ); v = t[ div( pocz + kon, 2 ).quot ];
trochę myślenia i człowiek się gubi @Korpus2: napisz jak tam rezultaty |
|
korpus2 Temat założony przez niniejszego użytkownika |
» 2013-01-12 20:22:14 po wklejeniu i =*( t =*(( int * )( i =( int * ) pocz, j =( int * ) i + 1 ) + 2 ), j =( int * ) j,( int * ) i );
nie kompiluje się, podkreśla mi błędy przy "=" i wystawia błąd cannot convert from int* to int edit: tak na marginesie to co ta linijka miałby robić? Wydaje mi się ona lekko bezsensowna. |
|
« 1 » 2 3 |