Wartość zwracana przez funkcję

0

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)

0

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];
0

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.

0

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.

0

Ja zrobilbym to tak:

struct _tab
{
    int tab[10][10];
};

_tab fun(...)
{
  _tab t;
 //jakies funkcje na tablicy
  
    return t; 
}
0

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

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