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:
int dopisz( int dopisana_liczba, int tablica[], int liczba_elementow ) { tablica[ liczba_elementow ] = dopisana_liczba; liczba_elementow++; return liczba_elementow; }
.
.
.
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:
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!? |
|
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: |
|
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 |
|
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 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: Kurs STC |
|
DejaVu |
» 2012-08-26 13:48:28 W deklaracji funkcji argument jest const, co zapobiega jego kopiowaniu
|
const nie zapobiega kopiowaniu.
#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();
|
|
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 :) |
|
« 1 » |