Witam,
Posługuję się z lubością funkcjami wbudowanymi typu:
Chodzi mi jednak o tę drugą, której to podejrzane jak dla mnie zachowanie zaobserwowałem w pewnym przypadku. Zdaję sobie sprawę, że to moja wina ale może ktoś pomoże mi się naprowadzić na właściwe tory gdzie źle myślę albo robię błąd. W ksrócie problem opisałbym tak:
gdy mam kod:
nie mam żadnych dziwnych dla mnie objawów, strtok_r() działa OK!
ale gdy zdefiniuję wskaźnik *reszta wewnątrz main() czyli niejako na stosie (bo to w obszarze zmiennych automatycznych przecież)
no to już mam niewesoło - tłumaczę jaki efekt. Okazuje się, że tym razem funkcja strtok_r() już nigdy nie wykryje mi separatora "*" (tak jakby w ogóle go nie było a wskaźnik *wsk wskazuje na cały łańcuch wraz z gwiazdką * - nie została wykryta.
A teraz ciekawostka, mogę to naprawić umieszczając *reszta za pomocą specyfikatora static w obszarze zmiennych globalnych. Czyli tak jak niżej już działa poprawnie:
Uwaga! takie zjawisko nie występuje mi gdy identycznie postępuję w każdej funkcji - z tą różnicą , że tam nie działa to w pętli while(1)
Wiem oczywiście, że pierwsze wywołanie strtok_r() musi być ze wskaźnikiem na łańcuch a następne wywołania już wymagają NULL w tym miejscu. Ale skoro na początku pętli while(1) resetuję bufor, znowu coś do niego odbieram i chciałbym go od nowa analizować to hmmm chyba mogę podać znowu nazwę rsbuf (bufora) a nie NULL. Zresztą pokazałem przypadki gdzie to działa - a nie działa tylko w tej jednej sytuacji gdy wskaźnik *reszta nie jest statyczny. Tzn może źle mówię - nie źle działa - tylko budzi moje zdziwienie takie zachowanie i być może czegoś nie wiem jeszcze o tej funkcji albo .... o zachowaniu się stosu przy definiowaniu w pętli main zmiennych automatycznych - to musi mieć coś z tym wspólnego tak mi się wydaje.
Reasumując - wiem jak sobie radzić - ale jak zwykle nie daje mi spokoju dlaczego to w opisanej konkretnej sytuacji zawsze nie działa.
Posługuję się z lubością funkcjami wbudowanymi typu:
strtok()
strtok_r()Chodzi mi jednak o tę drugą, której to podejrzane jak dla mnie zachowanie zaobserwowałem w pewnym przypadku. Zdaję sobie sprawę, że to moja wina ale może ktoś pomoże mi się naprowadzić na właściwe tory gdzie źle myślę albo robię błąd. W ksrócie problem opisałbym tak:
gdy mam kod:
char rsbuf[250];
char *reszta;
int main(void) {
// inicjalizacja itp
char *wsk;
while(1) {
wsk = strtok_r(rsbuf, "*", &reszta);
// coś tam się dzieje dalej
}
}nie mam żadnych dziwnych dla mnie objawów, strtok_r() działa OK!
ale gdy zdefiniuję wskaźnik *reszta wewnątrz main() czyli niejako na stosie (bo to w obszarze zmiennych automatycznych przecież)
char rsbuf[250];
int main(void) {
// inicjalizacja itp
char *reszta;
char *wsk;
while(1) {
wsk = strtok_r(rsbuf, "*", &reszta);
// coś tam się dzieje dalej
}
}no to już mam niewesoło - tłumaczę jaki efekt. Okazuje się, że tym razem funkcja strtok_r() już nigdy nie wykryje mi separatora "*" (tak jakby w ogóle go nie było a wskaźnik *wsk wskazuje na cały łańcuch wraz z gwiazdką * - nie została wykryta.
A teraz ciekawostka, mogę to naprawić umieszczając *reszta za pomocą specyfikatora static w obszarze zmiennych globalnych. Czyli tak jak niżej już działa poprawnie:
char rsbuf[250];
int main(void) {
// inicjalizacja itp
static char *reszta;
char *wsk;
while(1) {
wsk = strtok_r(rsbuf, "*", &reszta);
// coś tam się dzieje dalej
}
}Uwaga! takie zjawisko nie występuje mi gdy identycznie postępuję w każdej funkcji - z tą różnicą , że tam nie działa to w pętli while(1)
Wiem oczywiście, że pierwsze wywołanie strtok_r() musi być ze wskaźnikiem na łańcuch a następne wywołania już wymagają NULL w tym miejscu. Ale skoro na początku pętli while(1) resetuję bufor, znowu coś do niego odbieram i chciałbym go od nowa analizować to hmmm chyba mogę podać znowu nazwę rsbuf (bufora) a nie NULL. Zresztą pokazałem przypadki gdzie to działa - a nie działa tylko w tej jednej sytuacji gdy wskaźnik *reszta nie jest statyczny. Tzn może źle mówię - nie źle działa - tylko budzi moje zdziwienie takie zachowanie i być może czegoś nie wiem jeszcze o tej funkcji albo .... o zachowaniu się stosu przy definiowaniu w pętli main zmiennych automatycznych - to musi mieć coś z tym wspólnego tak mi się wydaje.
Reasumując - wiem jak sobie radzić - ale jak zwykle nie daje mi spokoju dlaczego to w opisanej konkretnej sytuacji zawsze nie działa.