Piastlis Temat założony przez niniejszego użytkownika |
Tablica char a wywołanie funkcji. » 2015-05-12 21:37:58 C++ nie jest moim pierwszym językiem programowania jaki znam.Rozumiem różnicę między tym że parametrem funkcji jest wartość i zmienna.Stąd moje zaskoczenie. #include <iostream> #include <string> using namespace std; char tablica[ 20 ] = { ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' }; void rekurencja1( string Napis, int n ) { if( n > 0 ) { Napis += char( n + int( '0' ) ); cout << n << ","; cout << Napis << endl; rekurencja1( Napis, n - 1 ); cout << n << ","; cout << Napis << endl; } } void rekurencja2( char Napis[ 20 ], int n ) { if( n > 0 ) { Napis[ 5 - n ] = char( n + int( '0' ) ); cout << n << ","; cout << Napis << endl; rekurencja2( Napis, n - 1 ); cout << n << ","; cout << Napis << endl; } } int main() { rekurencja1( "", 5 ); cout << "--------" << endl; rekurencja2( tablica, 5 ); return 0; }
O ile program jest prosty to wynik zadziwiający: 5,5 4,54 3,543 2,5432 1,54321 1,54321 2,5432 3,543 4,54 5,5 -------- 5,5 4,54 3,543 2,5432 1,54321 1,54321 2,54321 3,54321 4,54321 5,54321
W przypadku typu string wszystko działa według zasad.Tablica char nie jest przekazywana jako wartość tylko jako zmienna.Taki jest standard czy coś przeoczyłem? |
|
Monika90 |
» 2015-05-12 22:18:50 Taka deklaracja void rekurencja2( char Napis[ 20 ], int n )
jest równoważna takiej void rekurencja2( char * Napis, int n )
czyli Napis to nie tablica, lecz wskaźnik, niestety. Język byłby lepszy gdyby tak nie było i tablica była w takiej sytuacji przekazywana przez wartość. Podobno jest tak z powodu kompatybilności z językiem B. NA dodatek, Twoja tablica nie jest zakończona zerem więc cout << Napis << endl; ma niezdefiniowane zachowanie. |
|
Piastlis Temat założony przez niniejszego użytkownika |
» 2015-05-12 22:30:47 Rozumiem."Nikt nie jest idealny":).Tablicę char nie można przekazać ale string można.A inne typy?Struktury albo zdefiniowane samodzielnie? Jakie są zasady...
Ps.. Wiem wiem.. Ale dodanie 0 nic nie zmienia...A wygląda bardziej "symetrycznie":)
|
|
pekfos |
» 2015-05-12 22:35:45 Tablicę char nie można przekazać ale string można. |
Wszystko można, kwestia znaczenia. Tablice nie są kopiowane, bo prawie nigdy nie jest to pożądane zachowanie. Jak opakujesz tablicę w strukturę, to będziesz przekazywać obiekt, a nie tablicę, więc kompilator zapewni kopiowanie. Oczywiście mowa tu o tablicy jako typie tablicowym. Jak będziesz mieć sobie wskaźnik na zaalokowaną pamięć, to kompilator nie będzie ryzykować domyślania się, co ma z tym zrobić. Wtedy musisz zapewnić własną implementację kopiowania i w zasadzie masz już prostego std::stringa. |
|
Pawliko |
» 2015-05-12 22:37:12 << removed >> |
|
Piastlis Temat założony przez niniejszego użytkownika |
» 2015-05-12 22:48:40 Czyli tablica char to jedyna "niespodzianka" w tym temacie? |
|
pekfos |
» 2015-05-12 22:52:13 Każda tablica, nie tylko char. Zapis tablicy w definicji argumentu jest traktowany jako wskaźnik, a potem już tylko domyślna konwersja tablicy na adres przy przekazaniu do funkcji i wszystko działa. Ale operujesz na oryginale, bo masz tylko ten wskaźnik. |
|
« 1 » |