Czy w C/C++ można zrobić funkcję która zwracała by do programu tablice dwuwymiarową??? :
int t[10][10] funkcja(int a,int b)
(oczywiście składnia niepoprawna)
Czy w C/C++ można zrobić funkcję która zwracała by do programu tablice dwuwymiarową??? :
int t[10][10] funkcja(int a,int b)
(oczywiście składnia niepoprawna)
Sprawa jest prosta, ale dość errorogenna:)
int ** funkcja()
{
int **a = new int* [10];
for(int i=0; i<10; i++)
a[i] = new int [10];
a[0][5]=10;
return a;
}
wywołuje się to tak:
int **tab = funkcja();
cout << tab[0][5];
for(int i=9; i>=0; i--)
delete [i]tab;
delete tab; //nie mam pewności, że to nalezy tak usunąć, jednak wyszedłem z założenia, że zwolni to pamieć na którą wskazuje tab
Ale lepszym rozwiązaniem byłoby:
przkazanie gotowej tablicy, chociażby tak:
void funkcja(int **tab)
{
tab[0][5]=10;
}
i wywyołanie:
int **tab = new int* [10];
for(int i=0; i<10; i++)
tab[i] = new int [10];
funkcja(tab);
cout << tab[0][5];
//i zwalniamy pamięc:
for(int i=9; i>=0; i--)
delete [i]tab;
delete tab;
<font color="blue">[</span><font color="red">ADD</span><font color="blue">]</span>
Sposobów jest naprawdę bardzo dużo... no bo można nawet tak *choć to już chyba lekkie nadużycie:) ):
template<class T>
void funkcja(T tab)
{
tab[0][5]=10;
}
i wywołanie:
int tab[10][10];
funkcja(tab);
cout<<tab[0][5];
Ja bym zrobil inaczej. Zrobil bym funkcje ktora zwraca void(czyli nic nie zwraca) a w argumencie funkcji zrobil wskaznik na tablice. W wywolaniu funkcji argument powinien zostac przeslany przez referencje(&nazwa, jesli nie wiesz o co chodzi to chodzi o to ze nie jest przesylana "kopia" tablicy tylko jej miejsce w pamieci :) ). W samym ciele funkcji modyfikowal bys sobie wedle zyczenia ta tablice.
Ja tylko ostrzegam przed jedna rzecza !!!
NIE ZMIENIAC ROZMIAROW PAMIECI PRZYDZIELONEJ WSKAZNIKOWI W FUNKCJI !!!!
Przez to wlasnie musialem parser 4 razy pisac,, dopiero za 4 razem przyczailem ze tak nie mozna bo powstaje wylew pamieci.
Ja zrobilbym to tak:
struct _tab
{
int tab[10][10];
};
_tab fun(...)
{
_tab t;
//jakies funkcje na tablicy
return t;
}
int x,y;
int **create_t()
{
int *tab = NULL;
int i = 0;
if(!(tab = (int **)malloc(y * sizeof(int *))))
return NULL;
memset(tab,0,y * sizeof(int *));
for(i = 0; i < y; i++)
{
if(!(tab[i] = (int *)malloc(x * sizeof(int))))
{
destroy_t(tab);
return NULL;
}
memset(tab[i],0,x * sizeof(int));
}
return tab;
}
void destroy_t(int **tab)
{
int i = 0;
if(tab)
{
for(i = 0; i < y; i++)
free(tab[i]);
free(tab);
}
tab = NULL;
}
nie sprawdzalem ale powinno dzialac