Przekazywanie tablicy wskaźników dwuwymiarowej do funkcji

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.

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)
typedef void SortType(int **matrix,size_t count);
int **matrix= ...
size_t count=...
SortType *fun=&stupidSort;
fun(matrix,count);
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.

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;
  }

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