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

Access violation reading location

Ostatnio zmodyfikowano 2013-01-18 10:02
Autor Wiadomość
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.
P-73771
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.
P-73777
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
P-73802
korpus2
Temat założony przez niniejszego użytkownika
» 2013-01-18 10:02:55
Udało się, jakby ktoś potrzebował to się dzielę:

C/C++
#include <stdlib.h>
#include <algorithm>
#include <process.h>

typedef struct {
    int pocz;
    int kon;
    int rozmiar;
    int * tab;
} quick_tablica;

/* Tę funkcje wywołujemy, reszta działa w tle */
/* Dzielimy tablicę na 2 części, w dwóch wątkach sortujemy, potem scalamy */
/* Dla 1000000 elementów przyspieszenie około 40% */
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;
}


/* obsługa wątku */
void __cdecl p_quick_sort( quick_tablica & data )
{
    quick_sort( data.tab, data.pocz, data.kon );
    Sleep( 0 );
    _endthread();
    return;
}


/* sortowanie właściwe */
/* można też wywołać samą funkcję, wtedy sortujemy na jednym wątku */
void quick_sort( int * t, int pocz, int kon ) //szybkie sortowanie
{
    int i = pocz;
    int j = kon;
    int v;
    int tmp;
   
    v = t[ div( pocz + kon, 2 ).quot ]; //wyznaczenie elementu osiowego
    do
    {
        while( t[ i ] < v ) //jeśli element mniejsz od osiowego
             i++;
       
        while( v < t[ j ] ) //jeśli element większy od osiowego
             j--;
       
        if( i <= j )
        {
            tmp = t[ i ]; //zamiana
            t[ i ] = t[ j ];
            t[ j ] = tmp;
            i++;
            j--;
        }
    }
    while( i <= j );
   
    //to samo dla odpowiednich kawałków tablicy
    if( pocz < j )
         quick_sort( t, pocz, j );
   
    if( i < kon )
         quick_sort( t, i, kon );
   
    return;
}
P-74263
1 2 « 3 »
Poprzednia strona Strona 3 z 3