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

Problem z łączeniem tabel

Ostatnio zmodyfikowano 2012-11-10 20:35
Autor Wiadomość
korpus2
Temat założony przez niniejszego użytkownika
Problem z łączeniem tabel
» 2012-11-10 20:10:42
Mam do napisania algorytm, który dzieli dużą tablice, rozbija ją na dwie małe a następnie każdą z nich sortuje bąbelkowo w osobnych wątkach. Mam problem z połączeniem tablic tablic w procedurze parallel_bubble_sort. Oto mój kod:

C/C++
typedef struct {
    int rozmiar;
    int * tab;
} tablica;

void __cdecl p_bubble( tablica * t )
{
    int i;
    int j;
    int tmp; //zmienna pomocnicza przy zamianie 2 elementów, zapisujemy tam drugi element
   
    for( i = 0; i < t->rozmiar; i++ )
    {
        for( j = 0; j < t->rozmiar - 1; j++ )
        {
            if( t->tab[ j ] > t->tab[ j + 1 ] ) //jeśli wcześniejszy > następny to następuje zamiana elementów
            {
                tmp = t->tab[ j + 1 ]; //zamiana elementów
                t->tab[ j + 1 ] = t->tab[ j ];
                t->tab[ j ] = tmp;
            } //jeśli wcześniejszy <= następny to nic nie zamieniamy
        }
    }
    Sleep( 0 );
    _endthread();
    return;
}


void parallel_bubble_sort( int * t, int rozmiar )
{
    int rozmiar1;
    int rozmiar2;
   
    tablica sort1;
    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 ];
    }
   
    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 ];
        }
    }
   
    HANDLE thread1 =( HANDLE ) _beginthread(( void( * )( void * ) ) p_bubble, NULL,( void * ) & sort1 );
   
    HANDLE thread2 =( HANDLE ) _beginthread(( void( * )( void * ) ) p_bubble, NULL,( void * ) & sort2 );
   
    WaitForSingleObject( thread1, INFINITE );
    WaitForSingleObject( thread2, INFINITE );
   
    int i = 0;
    int j = 0;
    int k = 0; //iterator głównej tablicy wynikowej
    do
    {
        if( sort1.tab[ i ] <= sort2.tab[ j ] ) // <-- TU POWSTAJE BŁĄD "Access violation reading location"
        {
            t[ k ] = sort1.tab[ i ];
            i++;
        } else
        {
            t[ k ] = sort2.tab[ j ];
            j++;
        }
        k++;
    } while(( i != sort1.rozmiar ) ||( j != sort2.rozmiar ) );
   
   
}

nie dokończyłem jeszcze tej procedury, ale jak na razie się nie da nawet porównać elementów. Co z tym fantem zrobić?
Pozdrawiam,
Krzysiek
P-68949
DejaVu
» 2012-11-10 20:17:51
P-68951
korpus2
Temat założony przez niniejszego użytkownika
» 2012-11-10 20:29:13
dzięki bardzo, działa.
Tylko dlaczego mój sposób nie działał i jak to można zrobić na piechotę, bez używania funkcji bibliotecznej?
P-68952
DejaVu
» 2012-11-10 20:35:01
Frazy, które należy wpisać w wyszukiwarkę google:
P-68953
« 1 »
  Strona 1 z 1