Ĺadny brzuch
Witam!
W poniższym programie:
#include <cstdlib> #include <iostream> using namespace std; char *Lancuch(char *lancuch1, char *lancuch2) {   if(strlen(lancuch1) == strlen(lancuch2))   {     cout << "Sa rowne!!! - ";     return lancuch1;   }     else if(strlen(lancuch1) > strlen(lancuch2))   {      return lancuch1;   }     else if(strlen(lancuch1) < strlen(lancuch2))   {      return lancuch2;   }   else   {     cout << "Blad!...\n";   } } int main(int argc, char *argv[]) {   char *znaki1 = "ABC";   char *znaki2 = "ABC";   cout << "1 lancuch: " << znaki1;   cout << "\n" << "2 lancuch: " << znaki2;   cout << "\nDluzszy jest lancuch: ";   cout << Lancuch(znaki1, znaki2);       cout << "\n";   system("PAUSE");   return EXIT_SUCCESS; }
Nie rozumiem jaki powinien być prototyp dla funkcji:
char *Lancuch(char *lancuch1, char *lancuch2)
aby nie można było zmienić danych w zmiennych przekazywanym przez wskaźnik, czyli lancuch1 i lancuch2
Próbowałem dwóch wersji:
char *Lancuch(char *const lancuch1, char  *const lancuch2)
oraz
char *Lancuch(const char *lancuch1, const char *lancuch2)
Dopóki nie sprawdziłem odpowiedzi kompilatora na ten problem, myślałem, że tą właściwą wersją będzie:
char *Lancuch(const char *lancuch1, const char *lancuch2)
(ponieważ jak wyczytałem z pewnej książki jeśli const stoi przed typem stała jest wartość, a jeśli przed nazwą zmiennej - wtedy stały jest wskaźnik.)
Jednak kompilator nie pozwala na zamianę wartości zmiennych lancuch1 i lancuch2 tylko jeśli prototyp wygląda tak:
char *Lancuch(char *const lancuch1, char  *const lancuch2)
dlaczego???
Proszę o pomoc :rolleyes:
Użytkownik comp123 edytował ten post 18 lipiec 2005, 14:26
Jeśli chcesz zamienić DANE pod wskaźnikiem, to nie możesz robić tego na zasadzie wskaznik_1 = wskaznik_2, bo nie zmieniasz wtedy danych, a sam wskaźnik. W wypadku tekstu używasz strcpy, a w wypadku innych rzeczy możesz np. zrobić tak: *wskaznik_1 = *wskaznik_2; wtedy jeśli wskaznik_1 jest T * const wskaznik_1 to wskaznik_1 = wskaznik_2 nie będzie działać, ale dalej wartość POD wskaźnikiem można zmienić.
constT* żeby nie zmienić wartości
T*const żeby nie zmienić miejsca wskazywanego przez wskaźnik
constT* const żeby nie zmienić ani wartości, ani wskazywanego obiektu.
TAPL trwa...
I m. in. koniecznosc kopiowania przez strcpy pointerow na char'y powoduje, ze duzo wygodniej (a takze bezpieczniej) jest uzywac std::string :) Z tego co pamietam to jest tam operator przypisania kopiujacy ciag znakow na inne miejsce
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
W poniższym programie:
#include <cstdlib> #include <iostream> using namespace std; char *Lancuch(char *lancuch1, char *lancuch2) {   if(strlen(lancuch1) == strlen(lancuch2))   {     cout << "Sa rowne!!! - ";     return lancuch1;   }     else if(strlen(lancuch1) > strlen(lancuch2))   {      return lancuch1;   }     else if(strlen(lancuch1) < strlen(lancuch2))   {      return lancuch2;   }   else   {     cout << "Blad!...\n";   } } int main(int argc, char *argv[]) {   char *znaki1 = "ABC";   char *znaki2 = "ABC";   cout << "1 lancuch: " << znaki1;   cout << "\n" << "2 lancuch: " << znaki2;   cout << "\nDluzszy jest lancuch: ";   cout << Lancuch(znaki1, znaki2);       cout << "\n";   system("PAUSE");   return EXIT_SUCCESS; }
Nie rozumiem jaki powinien być prototyp dla funkcji:
char *Lancuch(char *lancuch1, char *lancuch2)
aby nie można było zmienić danych w zmiennych przekazywanym przez wskaźnik, czyli lancuch1 i lancuch2
Próbowałem dwóch wersji:
char *Lancuch(char *const lancuch1, char  *const lancuch2)
oraz
char *Lancuch(const char *lancuch1, const char *lancuch2)
Dopóki nie sprawdziłem odpowiedzi kompilatora na ten problem, myślałem, że tą właściwą wersją będzie:
char *Lancuch(const char *lancuch1, const char *lancuch2)
(ponieważ jak wyczytałem z pewnej książki jeśli const stoi przed typem stała jest wartość, a jeśli przed nazwą zmiennej - wtedy stały jest wskaźnik.)
Jednak kompilator nie pozwala na zamianę wartości zmiennych lancuch1 i lancuch2 tylko jeśli prototyp wygląda tak:
char *Lancuch(char *const lancuch1, char  *const lancuch2)
dlaczego???
Proszę o pomoc :rolleyes:
Użytkownik comp123 edytował ten post 18 lipiec 2005, 14:26
Jeśli chcesz zamienić DANE pod wskaźnikiem, to nie możesz robić tego na zasadzie wskaznik_1 = wskaznik_2, bo nie zmieniasz wtedy danych, a sam wskaźnik. W wypadku tekstu używasz strcpy, a w wypadku innych rzeczy możesz np. zrobić tak: *wskaznik_1 = *wskaznik_2; wtedy jeśli wskaznik_1 jest T * const wskaznik_1 to wskaznik_1 = wskaznik_2 nie będzie działać, ale dalej wartość POD wskaźnikiem można zmienić.
constT* żeby nie zmienić wartości
T*const żeby nie zmienić miejsca wskazywanego przez wskaźnik
constT* const żeby nie zmienić ani wartości, ani wskazywanego obiektu.
TAPL trwa...
I m. in. koniecznosc kopiowania przez strcpy pointerow na char'y powoduje, ze duzo wygodniej (a takze bezpieczniej) jest uzywac std::string :) Z tego co pamietam to jest tam operator przypisania kopiujacy ciag znakow na inne miejsce