Access violation reading location
Ostatnio zmodyfikowano 2013-01-18 10:02
Admixior |
» 2013-01-13 02:46:54 Nie jest bez sensu bo zanim zwróci i to wykona się przypisanie do i później przypisanie do j i na końcu przypisanie do t; wartości będą się przypisywać względem adresu który jest w zmiennej "pocz". Przypisuje bo każda z tych wartości jest błędna. A wszystko dlatego że miejsce w pamięci (stos) traktuje jako obiekt. Więc w pierwszej zmiennej "pocz" jest adres właściwego obiektu, w drugiej "kon" jest adres powrotu a dalej są null-e.
@korpus2: Powinieneś przyjąć argument do funkcji jako referencje lub wskaźnik. |
|
ison |
» 2013-01-13 11:22:39 Dlaczego zakładasz, że pocz to adres a nie index? Przechowywanie adresu w zmiennej int nie jest bezpieczne. |
|
korpus2 Temat założony przez niniejszego użytkownika |
» 2013-01-13 15:19:09 pocz i kon to indeksy w jakich granicach ma działać qsort |
|
korpus2 Temat założony przez niniejszego użytkownika |
» 2013-01-18 10:02:55 Udało się, jakby ktoś potrzebował to się dzielę: #include <stdlib.h> #include <algorithm> #include <process.h>
typedef struct { int pocz; int kon; int rozmiar; int * tab; } quick_tablica;
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; }
|
|
1 2 « 3 » |