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

Tablica jako argument funkcji

dział ogólny

Tablica jako argument funkcji

Nowy postprzez Pitek » niedziela, 5 kwietnia 2015, 02:16

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 ;)
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
https://www.pg-elektronika.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows 7Chrome

Re: Tablica jako argument funkcji

Nowy postprzez polymorphism » niedziela, 5 kwietnia 2015, 10:43

Może pokaż, jak wygląda funkcja dodajWartosc i jak jej używasz, bo z tego co napisałeś trudno coś sensownego wywnioskować.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2278
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 213
System operacyjny: Windows 8.1
Windows 10
Linux Mint 20
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Tablica jako argument funkcji

Nowy postprzez Pitek » niedziela, 5 kwietnia 2015, 12:27

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.
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
https://www.pg-elektronika.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows 7Chrome

Re: Tablica jako argument funkcji

Nowy postprzez polymorphism » poniedziałek, 6 kwietnia 2015, 10:45

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.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2278
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 213
System operacyjny: Windows 8.1
Windows 10
Linux Mint 20
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Tablica jako argument funkcji

Nowy postprzez Pitek » poniedziałek, 6 kwietnia 2015, 11:10

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
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
https://www.pg-elektronika.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows 7Chrome

Re: Tablica jako argument funkcji

Nowy postprzez polymorphism » wtorek, 7 kwietnia 2015, 09:49

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.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2278
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 213
System operacyjny: Windows 8.1
Windows 10
Linux Mint 20
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 11 gości

cron