Przekazywanie tablicy wskaźników dwuwymiarowej do funkcji

2016-01-21 00:19

Rejestracja: 6 lat temu

Ostatnio: 1 rok temu

0

Nie wiem jak prawidłowo przesłać tablicę dwuwymiarową do funkcji poprzez wskaźnik funkcji.

Gdy miałem tablicę jednowymiarową, to było wszystko ok:

#include <iostream>

using namespace std;

int sortowanie(int liczby[], int *ile)
{
    int *wsk;
    int bufor;
    wsk = &bufor;

    cout << "Przed sortowaniem: ";
    for(int i = 0; i < *ile; i++)
    {
        cout << *(liczby+i) << ", ";
    }

    for(int u = 0; u < 2; u++)
    {
        for(int j = 0; j < *ile; j++)
        {
            for(int k = 0; k < *ile; k++)
            {
                if(u == 0)
                {
                    if(*(*(liczby+u)+k) > *(*(liczby+u)+k+1))
                    {
                        *wsk = *(liczby+k+1);
                        *(liczby+k+1) = *(liczby+k);
                        *(liczby+k) = *wsk;
                    }
                }
                else if(u == 1)
                {
                    if(*(*(liczby+u)+k) < *(*(liczby+u)+k+1))
                    {
                        *wsk = *(liczby+k+1);
                        *(liczby+k+1) = *(liczby+k);
                        *(liczby+k) = *wsk;
                    }
                }
            }
        }
    }

    /*cout << "Po sortowaniu od najmniejszej: ";
    for(int q = 0; q < *ile; q++)
    {
        cout << *(liczby+q) << ", ";
    }*/
}

int main()
{
    int ile;

    cout << "Ile liczb chcesz posortowac?: ";
    cin >> ile;

    int **liczby = new int *[2];
    liczby[0] = new int[ile];
    liczby[1] = new int[ile];

    for(int i = 0; i < 2; i++)
    {
        for(int j = 0; j < ile; j++)
        {
            cout << "Podaj " << j+1 << " liczbe: ";
            cin >> *(*(liczby + i) + j);
        }
        break;
    }

    system("pause");

    int (*wsk_fun)(int[], int*);

    wsk_fun = sortowanie;

    wsk_fun(*liczby, &ile);

    delete [] liczby;

    return 0;
}

ale jak zmieniłem tablicę na dwuwymiarową to mam problem z przesłaniem jej jako argument do funkcji i nie wiem jak edytować mój kod.


Pozostało 580 znaków

2016-01-21 00:28

Rejestracja: 14 lat temu

Ostatnio: 1 dzień temu

0
  1. Inkrementacji nie rozumiesz: http://4programmers.net/Forum/1101404
  2. Nie używaj polskiego nazewnictwa, bo o tak to wygląda: http://4programmers.net/Forum/1208091
  3. Po kiego do sortowania przekazujesz wskaźnik na ile?
  4. Po kiego twoje sortowanie smaruje po ekranie? Zrób na to funkcje show() i wywołuj przed sortowaniem i po
  5. Po kiego deklarujesz że funkcja sortowanie() zwraca int'a kiedy i tak nic nie zwracasz?
  6. Dla indeksacji używaj size_t lub przynajmniej unsigned
  7. Sortowanie musi wyglądać tak: void stupidSort(int **matrix,size_t *count)
  8. typedef void SortType(int **matrix,size_t count);
    int **matrix= ...
    size_t count=...
    SortType *fun=&stupidSort;
    fun(matrix,count);

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2016-01-21 01:03

Rejestracja: 6 lat temu

Ostatnio: 1 rok temu

0

Kod wygląda teraz tak:

#include <iostream>

using namespace std;

void sortowanie(int **liczby, size_t ile)
{
    int *wsk;
    int bufor;
    wsk = &bufor;

    cout << "Przed sortowaniem: ";
    for(int w = 0; w <= 0; ++w)
    {
        for(int e = 0; e < ile; ++e)
            cout << *(*(liczby+w)+e) << ", ";
    }

    for(int u = 0; u < 2; ++u)
    {
        for(int j = 0; j < ile; ++j)
        {
            for(int k = 0; k < ile; ++k)
            {
                if(u == 0)
                {
                    if(*(*(liczby+u)+k) > *(*(liczby+u)+k+1))
                    {
                        *wsk = *(*(liczby+u)+k+1);
                        *(*(liczby+u)+k+1) = *(*(liczby+u)+k);
                        *(*(liczby+u)+k) = *wsk;
                    }
                }
                else if(u == 1)
                {
                    if(*(*(liczby+u)+k) < *(*(liczby+u)+k+1))
                    {
                        *wsk = *(*(liczby+u)+k+1);
                        *(*(liczby+u)+k+1) = *(*(liczby+u)+k);
                        *(*(liczby+u)+k) = *wsk;
                    }
                }
            }
        }
    }

    cout << "Po sortowaniu od najmniejszej: ";
    for(int q = 0; q <= 0; ++q)
    {
        for(int p = 0; p < ile; ++p)
            cout << *(*(liczby+q)+p) << ", ";
    }

    cout << "Po sortowaniu od najwiekszej: ";
    for(int z = 1; z <= 1; ++z)
    {
        for(int x = 0; x < ile; ++x)
            cout << *(*(liczby+z)+x) << ", ";
    }
}

int main()
{
    size_t ile;

    cout << "Ile liczb chcesz posortowac?: ";
    cin >> ile;

    int **liczby = new int *[2];
    liczby[0] = new int[ile];
    liczby[1] = new int[ile];

    for(int i = 0; i < 2; ++i)
    {
        for(int j = 0; j < ile; ++j)
        {
            cout << "Podaj " << j+1 << " liczbe: ";
            cin >> *(*(liczby + i) + j);
        }
        break;
    }

    typedef void (*wsk_fun)(int**, size_t);

    wsk_fun wsk = sortowanie;

    wsk(liczby, ile);

    delete [] liczby;

    return 0;
} 

Nie działa tylko sortowanie od największej liczby.


dla int **liczby = new int *[2]; liczby[0] = new int[ile]; liczby[1] = new int[ile]; samo delete [] liczby; nie wystarczy.... - kaczus 2016-01-21 08:30

Pozostało 580 znaków

2016-01-21 08:53

Rejestracja: 14 lat temu

Ostatnio: 1 dzień temu

2
  1. Nie używaj polskiego nazewnictwa, bo o tak to wygląda: http://4programmers.net/Forum/1208091
  2. Po kiego twoje sortowanie smaruje po ekranie? Zrób na to funkcje show() i wywołuj przed sortowaniem i po
  3. Możesz sobie indeksować wewnątrz funkcji po ludzku liczby[u][k] w main również
  4. Nie potrzebujesz tego wsk=&bufor; wystarczy: bufor=liczby[u][k+1]; ...
  5. Takie sortowanie do niczego się nie przyda, zrób sortowanie tablicy jednowymiarowej i wywołaj go dwa razy.
  6. Wg mnie nie nie zrozumiałeś pomysłu ze wskaźnikiem do funkcji, dopiero teraz widzę kiedy przestało tak razić oczy :) : http://ideone.com/rkPi3j
    
    #include <iostream>
    using namespace std;

typedef bool Cmp(int a,int b);
bool up(int a,int b) { return a<b; }
bool dn(int a,int b) { return a>b; }
void bubleSort(int tb[],size_t size,Cmp *cmp)
{
for(size_t last=0,stop=size;stop>0;stop=last,last=0)
{
for(size_t i=1;i<stop;++i)
{
if(cmp(tb[i-1],tb[i]))
{
int tmp=tb[i-1];
tb[i-1]=tb[i];
tb[i]=tmp;
last=i;
}
}
}
}

void show(int tb[],size_t size)
{
cout<<"{";
for(size_t i=0;i<size;++i) cout<<(", "+!i)<<tb[i];
cout<<" }\n";
}

int main()
{
int tb[]={8,5,9,2,3,1,4,7,6};
show(tb,sizeof(tb)/sizeof(tb));
bubleSort(tb,sizeof(tb)/sizeof(
tb),up);
show(tb,sizeof(tb)/sizeof(tb));
bubleSort(tb,sizeof(tb)/sizeof(
tb),dn);
show(tb,sizeof(tb)/sizeof(*tb));
return 0;
}


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
Jeszcze swap by się przydał, albo standardowy albo samemu napisać. - _13th_Dragon 2016-01-21 08:54

Pozostało 580 znaków

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0