Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Funckje - kiedy jest potrzebnie "return"?

Ostatnio zmodyfikowano 2012-08-26 13:58
Autor Wiadomość
Raziel
Temat założony przez niniejszego użytkownika
Funckje - kiedy jest potrzebnie "return"?
» 2012-08-26 11:50:50
Modyfikowalem program z lekcji 20 i zrobilem cos takiego:

C/C++
int dopisz( int dopisana_liczba, int tablica[], int liczba_elementow )
{
    tablica[ liczba_elementow ] = dopisana_liczba;
    liczba_elementow++;
    return liczba_elementow;
}
.
.
.

C/C++
if( wybor_z_menu == 1 )
{
    std::cout << "podaj liczbe: ";
    std::cin >> dopisana_liczba;
    dopisz( dopisana_liczba, tablica, liczba_elementow );
}
I dzialalem tylko na jednej i tej samej zmiennej "tablica[0]", tzn liczba elementów ciagle byla rowna 0 (tak ja wczesniej przyrownalem)

Blad jest w drugiej czesci kodu, powinna wyglada tak:

C/C++
if( wybor_z_menu == 1 )
{
    std::cout << "podaj liczbe: ";
    std::cin >> dopisana_liczba;
    liczba_elementow = dopisz( dopisana_liczba, tablica, liczba_elementow );
}

I tutaj moje pytanie, dlaczego pierwsza werrsja nie dziala? Ze druga bedzie dzialała to rozumiem, ale wedlug mojego rozumowania ta pierwsza tez powinna dzialac.
Funkcja "dopisz" przypisala wartosc "dopisana_liczba" do zmiennej "tablica[0]" i po zakonczeniu funkcji "dopisz", "tablica [0]" ciagle ma wartosc "dopisana_liczba".
Ta sama funkcja, zaraz po przypisanu wartosci do zmiennej "tablica[0]", zmienia wartosc zmiennej "liczba_elementów". Jednak po zakonczeniu funkcji, zmienna "liczba_elementow" nie ma wartosci, jaka nadano jej w funkcji.
Dlaczego!?
P-63627
m4tx
» 2012-08-26 11:57:20
Jednak po zakonczeniu funkcji, zmienna "liczba_elementow" nie ma wartosci, jaka nadano jej w funkcji.
Dlaczego!?
Bo jak wykonujesz funkcję, przekazując jej jakiś argument, argument ten jest kopiowany, chyba że:
  • Przekazujesz wskaźnik (wskaźnik wtedy jest co prawda też kopiowany, ale ciągle wskazuje na ten sam obiekt)
  • W deklaracji funkcji argument jest
    const
    , co zapobiega jego kopiowaniu
P-63628
Raziel
Temat założony przez niniejszego użytkownika
» 2012-08-26 12:13:20
Jak wspomniales o kopiowaniu to przypomnialo mi sie, ze cos takiego bylo opisane w kursie. Znalazlem to:

[quote]Tablice przekazywane do funkcji nigdy nie są kopiowane. Oznacza to, że w funkcji masz bezpośredni dostęp do danych, które znajdują się w tablicy. Modyfikacja danych jest globalna, bowiem pracujesz na oryginalnych danych tablicy, która została przekazana do funkcji.[/quote]
Heh przydala by sie lepsza pamiec.

Innymi slowy, jezeli cokolwiek zmieniam w funkcji to zmiana ta jest TYLKO wewnatrz funkcji i zeby ta zmiana byla widoczba poza funkcja potrzebne jest "return". Wyjatkiem sa tablice, zmiana wartosci zmiennej w tablicy wewnatrz funkcji, zmienia jej wartosc rozniez poza funkcja (no i te dwa przyklady, ktore wypisales).

Dzieki za wyjasnienie :)


ps
chyba przeczytam caly kurs jeszcze raz, za pierwszym razem nie wszystko jest jasne.

//edit: jak tu sie wstawia cytaty? Ogolnie troche trudne w oblsudze to forum XD

//edit 2: chociaz chyba nadal nie rozumiem, na dzis chyba juz za duzo xd
P-63630
m4tx
» 2012-08-26 12:17:34
Innymi slowy, jezeli cokolwiek zmieniam w funkcji to zmiana ta jest TYLKO wewnatrz funkcji i zeby ta zmiana byla widoczba poza funkcja potrzebne jest "return".
Albo wskaźniki :P

Wyjatkiem sa tablice
Tak, ale tylko dlatego, bo coś takiego jak
tablica
 to tylko wskaźnik na jej pierwszy element.

//edit: jak tu sie wstawia cytaty? Ogolnie troche trudne w oblsudze to forum XD
W końcu to forum programistyczne :P Tutaj masz wszystko: » KursyKurs STC kurs
P-63631
DejaVu
» 2012-08-26 13:48:28
W deklaracji funkcji argument jest const, co zapobiega jego kopiowaniu
const nie zapobiega kopiowaniu.

C/C++
#include <cstdio>

struct A
{
    A() { printf( "A();\n" ); }
    A( const A & a ) { printf( "A(a);\n" ); }
    ~A() { printf( "~A();\n" ); }
};

void funkcja( const A a )
{
}

int main()
{
    A a;
    funkcja( a );
    return 0;
}
Standardowe wyjście programu:
A();
A(a);
~A();
~A();
P-63651
m4tx
» 2012-08-26 13:58:01
const nie zapobiega kopiowaniu.
Hm, faktycznie. Chyba za długo w C++ nie pisałem... :P

Anyway - można też użyć
void funkcja( A & a )
 - wtedy nie tylko nie trzeba mieć wskaźnika do a, ale również możemy dostać się do a w "normalny" sposób, tj. bez gwiazdek i
->
. A samo a też nie jest kopiowane :)
P-63654
« 1 »
  Strona 1 z 1