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

Zadanie, wskaźniki w funkcji

Ostatnio zmodyfikowano 2019-01-23 16:54
Autor Wiadomość
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

C/C++
#include <iostream>
#include <cstring>
using namespace std;

string * fs( const char * tab )
{
    string * w;
    w = new string( tab );
    //string w(tab);//przypisanie do stringa wartoœci z tab
    cout <<* w << endl;
    //delete w;
    return w;
   
}
int main()
{
    int R = 100;
    char * ch = new char[ R ];
    cin.getline( ch, R );
    cout << fs( ch ) << endl;
   
    delete ch;
    return 0;
}
P-173659
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.
P-173660
dwastoliki
Temat założony przez niniejszego użytkownika
» 2019-01-23 11:58:45
Już edytowałem, możesz teraz zerknąć?
P-173661
rafallauterbach
» 2019-01-23 12:01:23
Już patrzę, dostaję teraz prawidłowy wynik i jeszcze jakiś adres, zerknę w kod dokładniej.

C/C++
cout <<* w << endl;

To powinno być poza funkcją, funckja ma tylko zwrócić wskaźnik, nie powinna nic wypisywać

C/C++
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
C/C++
cout << fs( ch ) << endl;
 linijce i już nie będziesz mógł zwolnić tej pamięci.

C/C++
#include <iostream>
#include <cstring>
using namespace std;

string * fs( const char * tab )
{
    string * w;
    w = new string( tab ); // < - nigdzie nie usuwasz tego stringa, który tutaj utworzyłeś
    //string w(tab);//przypisanie do stringa wartoœci z tab
    cout <<* w << endl;
    //delete w;
    return w;
   
}
int main()
{
    int R = 100;
    char * ch = new char[ R ];
    cin.getline( ch, R );
    cout << fs( ch ) << endl;
   
    delete ch; // < - usuwasz char * ch, to jest ok
    return 0;
}
P-173662
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.
C/C++
#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;
}
P-173663
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
C/C++
cout << fs( ch ) << endl;
I teraz wypisuje on adres Twojej zmiennej.
wcześniej miałeś w funkcji taki kawałek kodu
C/C++
cout <<* w << endl;
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.
P-173664
« 1 »
  Strona 1 z 1