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

Problem ze zmienną size_t

Ostatnio zmodyfikowano 2013-03-19 19:04
Autor Wiadomość
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:
C/C++
size_t * dlugosc = new size_t;
dlugosc = wyrazenie.length();
Trochę nie rozumiem tego błędu, więc proszę o pomoc.
P-78858
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.

P-78861
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.
P-78863
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:
C/C++
( typ ) nazwa_zmiennej;
//Przyklad:
double PI = 3.1415;
int PI_calkowite =( int ) PI; //czyli przed nazwa zmiennej podajemy typ do jakiego chcemy rzutowac w nawiasie zwyklym

Natomiast rzutowanie w stylu C++ prezentuje się w następujący sposób:
C/C++
static_cast < typ >( nazwa_zmiennej );
//Przyklad:
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.
P-78865
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?
P-78866
Trotom
Temat założony przez niniejszego użytkownika
» 2013-03-19 18:54:25
Taka, iż potem jest linijka kodu:
C/C++
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.
P-78867
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.
P-78868
« 1 »
  Strona 1 z 1