(z kanonu c++)
Czy mogę wskazywać wskaźnikiem do char
char *ptr
do stałego łańcucha znaków?
const char str[] = "foobar"
(z kanonu c++)
Czy mogę wskazywać wskaźnikiem do char
char *ptr
do stałego łańcucha znaków?
const char str[] = "foobar"
W deklaracji wskaźnika musisz napisać, że wskazuje on na obiekt stały.
Tutaj słowo kluczowe const może stać w dwóch miejscach:
const char *ptr;
char *const ptr;
niektóre kompilatory wyrzucą ci bład albo przynajmniej ostrzeżenie. Wskażnik powinien być tego samego typu co zmienna na którą wskazuje więc lepiej nie rób takich sztuczek. Poza tym jeżeli deklarujesz stały łańcuch to znaczy, że nie chcesz żeby był przypadkowo zmieniony a wykorzystując zwyczajny wskaźnik możesz go zmienić poprzez ten wskaźnik.
Chodzi o to, że chciałem zrobić funkcję zajmującą się zwracaniem błędu, a dokładniej żeby funkcja zwracała (w przypadku powstania błędu gdzieś w programie) wskaźnik do tekstu błędu; sam tekst konkretnego błędu powinien być niezmienny (wiadomo).
const char err_0[] = "nie ma błędu";
const char err_1[] = "za mało pamięci";
const char err_2[] = "za mało miejsca w szafie";
char* current_error;
char* GetLastError(){
char *ptr = current_error;
current_error = err_0; // ***
return ptr;
}
Przy przypisywaniu *** wyjdzie błąd, a nie chce rezygnować ze "stałości" komunikatów błędów.
Więc zrób jak napisałem:
const char *ptr;
W ten sposób nie będzie błędu i jednocześnie kompilator nie pozwoli na zmianę stringu przez wskaźnik.
const char* tablica
oznacza tablice znakow char, ktore akurat sa stalymi
a jesli chcesz uczynic WSKAZNIK niezmienny to
char* const tablica
. jednakze zapis ten sprawi, ze nie mozesz zmienic zawartosci tablicy a sprwic by wskaznik wskazywal co innego. wiec najwlasciwszym rozwiazaniem wydaje sie const char* const tablica
Rafal_F twój zapis nic nie da funkcja i tak zwraca zwykły wskaźnik, którym można modyfikować elementy.
Teraz powinno być dobrze:
const char err_0[] = "nie ma błędu";
const char err_1[] = "za mało pamięci";
const char err_2[] = "za mało miejsca w szafie";
const char* current_error;
const char* GetLastError(){
const char *ptr = current_error;
current_error = err_0;
return ptr;
}
const char* current_error;
no tak, ale właśnie chodzi o to, że każda inna funkcja w module powinna móc zmeniać current_error
i przez to pokazywać, e nastąpił jakiś błąd, którego treść możnaby uzyskac przez GetLastError
a teraz z innej beczki, przeciez to ty piszesz ten program, czy ktos cie zmusza do modyfikacji tych danych ?
/*const*/ struct {
int numer;
char* nazwa;
}* errory[]={{0,"ok"},{1,"ala ma okres"},{2,"wsciekl sie pies"},{3,"ale ta pani ma wąsa"},{4,"juz nie bede przejezdzal na czerwoym panie wladzo"}};
// chyba dobrze zadeklarowalem, nie wiem ;p
Bucz napisał(a)
const char* current_error;
no tak, ale właśnie chodzi o to, że każda inna funkcja w module powinna móc zmeniać
current_error
i przez to pokazywać, e nastąpił jakiś błąd, którego treść możnaby uzyskac przezGetLastError
No przecież możesz zmieniać, const char* -> wskaźnik do stałej, nie stały wskaźnik.
Chyba jedyne sensowne rozwiązanie:
// ew. const char* const :)
const char err_0[] = "nie ma bledu";
const char err_1[] = "za malo pamieci";
const char err_2[] = "za malo miejsca w szafie";
const char* current_error;
const char* GetLastError(){ // TU: const char* zwracaj! albo const char* const jak tak bardzo chcesz być pedantyczny, tylko po co...?
//..jak tam chcesz...
return current_error;
}
void foo()
{
current_error = err_1;
}
void bar()
{
current_error = "blad";
}
int main()
{
foo();
bar();
}
Zresztą Heimdall już ci to napisał... Zrób z tym co chcesz i po swojemu.
Bucz napisał(a)
const char* current_error;
no tak, ale właśnie chodzi o to, że każda inna funkcja w module powinna móc zmeniać
current_error
i przez to pokazywać, e nastąpił jakiś błąd, którego treść możnaby uzyskac przezGetLastError
wskaźnik current_error możesz dowolnie zmieniać; nie możesz tylko modyfikować łańcuchów na które wskazuje
current_error = err_0; //dobrze
current_error = "fcgdfgd"; //dobrze
curren_error[2] = 'f'; //błąd
w sumie...
... to moge
a co z const_cast<char*> ???