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

Tablica char a wywołanie funkcji.

Ostatnio zmodyfikowano 2015-05-12 22:52
Autor Wiadomość
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.
C/C++
#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?
P-132145
Monika90
» 2015-05-12 22:18:50
Taka deklaracja
C/C++
void rekurencja2( char Napis[ 20 ], int n )

jest równoważna takiej
C/C++
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.
P-132151
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":)
P-132153
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.
P-132157
Pawliko
» 2015-05-12 22:37:12
<< removed >>
P-132158
Piastlis
Temat założony przez niniejszego użytkownika
» 2015-05-12 22:48:40
Czyli tablica char to jedyna "niespodzianka" w tym temacie?
P-132161
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.
P-132164
« 1 »
  Strona 1 z 1