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ść
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

C/C++
void parallel_quick_sort( int * t, int pocz, int kon, int rozmiar ) //funkcja główna
{
    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 ) // wątek
{
    quick_sort( data.tab, data.pocz, data.kon );
    Sleep( 0 );
    _endthread();
    return;
}

void quick_sort( int * t, int pocz, int kon ) //qsort
{
    int i = pocz;
    int j = kon;
    int v;
    int tmp;
   
    v = t[ div( pocz + kon, 2 ).quot ]; //TU SIĘ UKAZUJE BŁĄD!!!!
    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;
}

proszę o pomoc
P-73709
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.
P-73712
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ć.
P-73713
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:
C/C++
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...
P-73716
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
P-73717
korpus2
Temat założony przez niniejszego użytkownika
» 2013-01-12 19:24:23
C/C++
typedef struct {
    int pocz;
    int kon;
    int rozmiar;
    int * tab;
} quick_tablica;

edit:
merge jest biblioteczną funkcją z #include <algorithm>
P-73719
Admixior
» 2013-01-12 19:34:50
Oto i co brakuje:
C/C++
void quick_sort( int * t, int pocz, int kon ) //qsort
{
    /*tutaj to co było*/
    int tmp;
   
    i =*( t =*(( int * )( i =( int * ) pocz, j =( int * ) i + 1 ) + 2 ), j =( int * ) j,( int * ) i ); //tej instrukcji brakowało
   
    v = t[ div( pocz + kon, 2 ).quot ]; //TU SIĘ UKAZUJE BŁĄD!!!!

trochę myślenia i człowiek się gubi

@Korpus2: napisz jak tam rezultaty
P-73720
korpus2
Temat założony przez niniejszego użytkownika
» 2013-01-12 20:22:14
po wklejeniu
C/C++
i =*( t =*(( int * )( i =( int * ) pocz, j =( int * ) i + 1 ) + 2 ), j =( int * ) j,( int * ) i ); //tej instrukcji brakowało
 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.
P-73723
« 1 » 2 3
  Strona 1 z 3 Następna strona