Trotom Temat założony przez niniejszego użytkownika |
Problem ze zmienną size_t » 2013-03-19 17:09:58 Witam, Ostatnio chciałem zrobić program wykorzystujący długość wyrazu. W drogę weszła mi output funkcji lenght(), czyli size_t. Nie szło jakkolwiek przekonwertować na int, więc zmieniłem int na size_t w całym programie. To wywaliło mi taki błąd: error: invalid conversion from ‘std::basic_string<char>::size_type {aka unsigned int}’ to ‘size_t* {aka unsigned int*}’ [-fpermissive]|
... na ten kod: size_t * dlugosc = new size_t; dlugosc = wyrazenie.length();
Trochę nie rozumiem tego błędu, więc proszę o pomoc. |
|
unimator |
» 2013-03-19 17:34:00 <typ> * zmiennaABC - taki zapis oznacza, że zmiennaABC jest wskaźnikiem !, i jej jedynym zadaniem jest przechowywanie adresu jakiejś tam komórki w pamięci. Odwołanie do tej zmiennej wygląda tak samo jak do innych zmiennych w środowisku C czyli poprzez nazwę. Zapis: zmiennaABC = 123; oznacza, że próbujesz do zmiennej wskaźnikowej (lub po prostu wskaźnika) upchnąć liczbę, która nie jest adresem. Tzn. istnieje z pewnością taki adres w pamięci komputera jak 123, ale taki zapis jaki przedstawiłem tak jakby określa, że liczba jaką przypisuje do zmiennejABC ma być interpretowana jako całkowita a nie adres.
Cały ten wywód po to, żebyś zrozumiał, że pomimo, iż dla komputera "zmienna" zawsze przechowuje jakąś wartość liczbową, to dla nas (jak i kompilatora) ta sama zmienna przechowuje jakiś znak, adres, liczbę etc. ale nie wszystko na raz (wyjątek - unie).
Dobra, ale jak zrobić, żeby było poprawnie (i co ważniejsze działało)? Musimy się odwołać do tego na co wskazuje dana zmienna a nie do samej zmiennej. Służy do tego operator '*', tak więc chyba jest to logiczne: *dlugosc = wyrazenie.length();
Inna sprawa - po co używać wskaźnika i alokować pamięć dla jednej zmiennej size_t skoro ten sam efekt uzyskać można zmienną statyczną. Size_t ma wielkość słowa procesora (bodajże tak to się nazywa) więc w Twoim przypadku musisz dysponować pamięcią 2xsize_t; w przypadku zmiennej statycznej byłoby to po prostu size_t. No i dochodzi jeszcze sprawa tego, że dynamiczna alokacja jest mniej wygodna.
|
|
Trotom Temat założony przez niniejszego użytkownika |
» 2013-03-19 17:57:35 Dzięki za wytłumaczenie. Musi być jednak to zmienna dynamiczna, ponieważ jest wywołana w środku programu. EDIT: Jednak potrzebuje zmiennej typu int, a nie size_t, ponieważ później służy to jako określenie ilości zmiennych w tablicy. A zatem: jak przekonwertować size_t na int? Pewnie było to już poruszane na forum, ale po wpisaniu w wyszukiwarkę "size_t na int" pokazuje z 700 wyników. |
|
unimator |
» 2013-03-19 18:43:10 Musi być jednak to zmienna dynamiczna, ponieważ jest wywołana w środku programu.
|
Nie wiem do jakich celów używasz potem tej zmiennej ale na 99% jestem pewien, że wystarczy Ci do tego zmienna statyczna. Może deklarujesz ją wewnątrz jakiejś funkcji czy bloku kodu i jest ona niewidoczna tam gdzie chcesz jej użyć. Spróbuj zmienić tą zmienną na globalną (ale również statyczną!) i zobaczysz, że na pewno zadziała. Konwersja między różnymi typami w C/C++ to inaczej rzutowanie. W stylu C rzutowanie wygląda tak: ( typ ) nazwa_zmiennej;
double PI = 3.1415; int PI_calkowite =( int ) PI;
Natomiast rzutowanie w stylu C++ prezentuje się w następujący sposób: static_cast < typ >( nazwa_zmiennej );
double PI = 3.1415; int PI_calkowite = static_cast < int >( PI );
static_cast<typ>(nazwa_zmiennej) to operator, który wygląda zupełnie jak funkcja szablonowa. Istnieją jeszcze inne tego typu operatory o zbliżonym działaniu jak dynamic_cast czy reinterpret_cast. W C++ można oczywiście używać obu; jednak zaleca się używanie tej drugiej wersji. |
|
pekfos |
» 2013-03-19 18:47:29 Jednak potrzebuje zmiennej typu int, a nie size_t, ponieważ później służy to jako określenie ilości zmiennych w tablicy |
Co za różnica? |
|
Trotom Temat założony przez niniejszego użytkownika |
» 2013-03-19 18:54:25 Taka, iż potem jest linijka kodu: string * znak = new string[ dlugosc ];
..., która jest uznawana za błedną. A po zmianie zmiennej dlugosc na int lub bezpośrednio int, nie ma tego błędu. EDIT: Dzięki unimator. A jeżeli chodzi o zmienną dynamiczną, wiem że wystarczy mi statyczna, ale ponieważ jej wartość jest uzależniona od użytkownika to wolę, aby była dynamiczna. |
|
mactec |
» 2013-03-19 19:04:56 która jest uznawana za błedną. A po zmianie zmiennej dlugosc na int lub bezpośrednio int, nie ma tego błędu. |
Nie ma różnicy czy użyjesz size_t czy int. Powodem, że kompilator wywala Ci błędy może być to, że ta twoja dlugosc jest wskaznikiem. |
|
« 1 » |