dwastoliki Temat założony przez niniejszego użytkownika |
Zadanie, wskaźniki w funkcji » 2019-01-23 11:03:14 Zrobiłem zadanie jednak nie wiem czy do końca zgadza się ono z treścią polecenia, proszę o sprawdzenie i wskazanie ewentualnych błędów. Napisz funkcję, która w argumencie będzie miała tablicę char i zwróci zwykły wskaźnik na nowy/dynamiczny obiekt string z ciągiem znaków z argumentu. Zadbaj o usunięcie rezerwacji we właściwym momencie #include <iostream> #include <cstring> using namespace std;
string * fs( const char * tab ) { string * w; w = new string( tab ); cout <<* w << endl; return w; } int main() { int R = 100; char * ch = new char[ R ]; cin.getline( ch, R ); cout << fs( ch ) << endl; delete ch; return 0; }
|
|
rafallauterbach |
» 2019-01-23 11:56:21 To chyba nie działa prawidłowo, zgadza się? W funkcji fs tworzysz stringa, który jest zmienną lokalną i znika zaraz po wykonaniu funkcji. W momencie gdy odczytujesz dane ze wskaźnika, ten pokazuje już na nieistniejącą zmienną. Powinieneś utworzyć nowy obiekt string używając "new", spróbuj tak to przerobić, żeby w funkcji użyć new i zwrócić uzyskany w ten sposób wskaźnik, a następnie użyć delete na tym wskaźniku po jego wykorzystaniu. |
|
dwastoliki Temat założony przez niniejszego użytkownika |
» 2019-01-23 11:58:45 Już edytowałem, możesz teraz zerknąć? |
|
rafallauterbach |
» 2019-01-23 12:01:23 Już patrzę, dostaję teraz prawidłowy wynik i jeszcze jakiś adres, zerknę w kod dokładniej. To powinno być poza funkcją, funckja ma tylko zwrócić wskaźnik, nie powinna nic wypisywać cout << fs( ch ) << endl;
A tu nic nie zmieniłeś, nadal wypisujesz wskaźnik takim jaki jest (stąd ten "losowy" adres z pamięci) , zamiast wypisać wartość zmiennej kryjącej się pod tym adresem. Fs nie zwraca stringa, tylko wskaźnik, więc nie powinno się wypisywać tego wskaźnika, tylko to na co on wskazuje. Aha, jeszcze się doczepię jednego szczegółu - w funkcji tworzysz stringa i zwracasz wskaźnik do niego, to jest ok, ale nie usuwasz potem rezerwacji pamięci z tego wskaźnika. Możesz użyć zmiennej, żeby zapisać wskaźnik otrzymany z funkcji i potem będziesz mógł usunąć dane z tego adresu w pamięci. W takiej sytuacji jak teraz tracisz adres wskaźnika, który utworzyłeś w tej cout << fs( ch ) << endl;
linijce i już nie będziesz mógł zwolnić tej pamięci. #include <iostream> #include <cstring> using namespace std;
string * fs( const char * tab ) { string * w; w = new string( tab ); cout <<* w << endl; return w; } int main() { int R = 100; char * ch = new char[ R ]; cin.getline( ch, R ); cout << fs( ch ) << endl; delete ch; return 0; }
|
|
dwastoliki Temat założony przez niniejszego użytkownika |
» 2019-01-23 13:32:14 Wcześniej wypisywałem stringa w funkcji żeby zobaczyć czy w ogóle string pobiera tekst z tablicy char. Już to poprawiłem, jednak dalej nie wiem jak przekazać wskaźnik z tej funkcji i jak usunąć rezerwację, nie mogę zrobić tego po returnie w funkcji bo nie zadziała. W zadaniu nie możemy też używać zmiennych globalnych. #include <iostream> #include <cstring> using namespace std;
string * fs( const char * tab ) { string * w; w = new string( tab ); return w; } int main() { int R = 100; char * ch = new char[ R ]; cin.getline( ch, R ); cout << fs( ch ) << endl; delete ch; return 0; }
|
|
rafallauterbach |
» 2019-01-23 16:54:14 Nie potrzebujesz zmiennej globalnej, Twoja funkcja ma właśnie za zadanie zwrócić ten wskaźnik i spełnia to zadanie, więc wystarczy że zapiszesz wynik działania funkcji do zmiennej w mainie wsk = funkcja(); No i wskaźnik z tej funkcji już przekazujesz prawidłowo, problem leży w odczycie zmiennej na którą wskazuje ten wskaźnik. W mainie wypisujesz adres wskaźnika cout << fs( ch ) << endl;
I teraz wypisuje on adres Twojej zmiennej. wcześniej miałeś w funkcji taki kawałek kodu I wypisywał tekst podany na wejściu funkcji, ale odnosił się do wskaźnika stringa - ta gwiazdka właśnie informuje kompilator że chodzi Ci o zmienną pod tym adresem a nie o sam adres. |
|
« 1 » |