CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Tablica jako argument funkcji
Strona 1 z 1

Tablica jako argument funkcji

Nowy postNapisane: niedziela, 5 kwietnia 2015, 02:16
przez Pitek
Cześć, mam jak dla mnie dziwny problem. Otóż mam sobie funkcje która użyta jako ciągły fragment kodu działa poprawnie ale jako funkcja w programie już nie.
KOD cpp:     UKRYJ  
int *temp = new int[rozmiar + 1];
temp[0] = 10;
for(int i=1;i<rozmiar+1;i++)
{
        temp[i] = tab[i-1];
}
tab = new int[rozmiar+1];
for(int i=0;i<rozmiar+1;i++)
{
        tab[i] = temp[i];
}
delete[] temp;
rozmiar++;
Nie trudno zauważyć że jest to funkcja dodająca liczbę 10 na początek tablicy. Tablica tab jest tak samo deklarowana jak ta temp w funkcji, też jest dynamiczna. Jak wrzucam to do funkcji :
KOD cpp:     UKRYJ  
void dodajWartosc(int *tab);
to po kilku dodaniach zaczyna się wykrzaczać... Wrzuca jakieś śmieciowe wartości na koniec, na początek... Nie rozumiem tego, nigdzie nie wychodze tutaj poza zakres, najlepsze jest to ze jak mam to w ciągłym kodzie to działa jak powinno. Pomocy :o
P.S. Wesołych Świąt wszystkim ;)

Re: Tablica jako argument funkcji

Nowy postNapisane: niedziela, 5 kwietnia 2015, 10:43
przez polymorphism
Może pokaż, jak wygląda funkcja dodajWartosc i jak jej używasz, bo z tego co napisałeś trudno coś sensownego wywnioskować.

Re: Tablica jako argument funkcji

Nowy postNapisane: niedziela, 5 kwietnia 2015, 12:27
przez Pitek
No opisałem... Wygląda tak samo ja to co jest kodem.
KOD cpp:     UKRYJ  
void dodajWartosc(int *tab)
{
int *temp = new int[rozmiar + 1];
temp[0] = 10;
for(int i=1;i<rozmiar+1;i++)
{
        temp[i] = tab[i-1];
}
tab = new int[rozmiar+1];
for(int i=0;i<rozmiar+1;i++)
{
        tab[i] = temp[i];
}
delete[] temp;
rozmiar++;
}
no i mam sobie tablice
KOD cpp:     UKRYJ  
int *tablica = new int[rozmiar];

a wywołuje tak:
KOD cpp:     UKRYJ  
dodajWartosc(tablica);
rozmiar jest zmienną globalną i działa dobrze.

Re: Tablica jako argument funkcji

Nowy postNapisane: poniedziałek, 6 kwietnia 2015, 10:45
przez polymorphism
No opisałem... Wygląda tak samo ja to co jest kodem.

Ok, tylko zabrakło części odpowiedzialnej za błąd. Podejrzewałem, że o to chodzi, ale...

KOD cpp:     UKRYJ  
void dodajWartosc(int *tab)
{
        tab = new int[rozmiar+1];
        ...
}

tab wewnątrz funkcji jest zmienną lokalną, zatem to co do niej przypiszesz będzie miało znaczenie tylko wewnątrz funkcji, nie wpłynie na wartość wskaźnika, który podałeś jako argument przy wywołaniu dodajWartosc. Opcje są dwie: tab powinien być wskaźnikiem na wskaźnik int** lub referencją na wskaźnik int* &. Opcja druga lepsza, bo nie trzeba nic zmieniać w kodzie i jest nieco bezpieczniejsza.

Re: Tablica jako argument funkcji

Nowy postNapisane: poniedziałek, 6 kwietnia 2015, 11:10
przez Pitek
Dzięki ;) No oczywiście, przecież nie chodzi mi tylko o pobranie danych do funkcji ale również o to żeby funkcja zadziałała na jakieś zewnętrzne dane. Całkowite zamroczenie :P

Re: Tablica jako argument funkcji

Nowy postNapisane: wtorek, 7 kwietnia 2015, 09:49
przez polymorphism
Jest jeszcze jeden błąd! Przeoczyłem go.

KOD cpp:     UKRYJ  
int *tablica = new int[rozmiar];

dodajWartosc(tablica);
...


void dodajWartosc(int* &tab)
{
        ...

        tab = new int[rozmiar+1]; // <--- !!!
        ...

}

Nadpisujesz wskaźnik, przez co "gubisz" pamięć przydzieloną na zewnątrz funkcji, czyli masz wyciek pamięci. W sumie nie wiem, po co przydzielasz nową pamięć tab, jeśli temp to jest już gotowa pamięć, która jest wynikiem działania funkcji i może być wyrzucona na zewnątrz.

No i tak na koniec: do kopiowanie pamięci masz funkkcję memcpy lub std::copy, a do przenoszenia memmove i std::move.