Rzutowanie wskaźnika na stringa

0

Witam. Mam proste pytanko : mam

string *napis="test";
string napis2;

I teraz mam pytanie, jak zrobić rzutowanie aby w stringu napis2 uzyskać wartość "test" ? Bo jak próbuję jakoś to rzutować to wyrzuca mi błędy typu : "invalid conversion from 'std::string*' to 'char'|". Z góry dzięki za pomoc :) Pozdrawiam

0

@mcaffey a to:
string napis="test";
Co niby ma znaczyć? Może tam miało być char
a nie string*? Napisz co chcesz osiagnąć, bo ewidentnie sposób w który chcesz to osiągnąć jest bez sensu.

0
string napis = "test";
string napis2 = napis;
0

Ok, więc napiszę konkretnie jak wygląda problem. Pisząc w allegro 4.4 mam funkcję z nieokreśloną liczbą argumentów. I jako argumenty daję dla niej zmienne string. Wewnątrz funkcji mam tablicę

 string *nazwa[50]

a potem przypisuję do niej wartości poprzez nazwa[0]=va_arg(ap, string*);

 Wygląda to w ten sposób (z tymi wskaźnikami) ponieważ w inny sposób nie potrafiłem pobrać wartości tekstowych z tych argumentów poprawnie. Problem pojawił się gdy chciałem użyć funkcji <code class="cpp">text_length(czcionka, nazwa[1]);

ponieważ wyrzuca błąd : cannot convert 'std::string*' to 'const char*' for argument '2' to 'int text_length(const FONT*, const char*)'. Normalnie gdy jako argument tej funkcji dawałem "zwykłego" stringa to wystarczyło dopisać tylko .c_str()

 i wszystko grało, ale w tym przypadku kończy to się błędem : request for member 'c_str' in 'nazwa[1]', which is of non-class type 'std::string*. Nigdy za bardzo nie operowałem na wskaźnikach więc za bardzo nie wiem jak to obejść. Pomożecie ? :)

Edit: <b>@up</b> nie wchodzi w rachubę, ponieważ nie mam :

```cpp
string napis = "test";
string napis2 = napis;

tylko

string *napis = "test";
string napis2 = napis;
0

text_length(czcionka, nazwa[1]->c_str());

0

Kompilować się kompiluje, ale program się zawiesza.

0

Zawiesza się, bo jeśli przekazujesz przez wartość te stringi, to innej opcji nie ma, musi się wywalić.

Przekaż wskaźniki:

string s1, s2;

foo(2, &s1, &s2);
0

Nie bardzo rozumiem. Co mam zrobić z tymi wskaźnikami ?

0

Pokaż jak wywołujesz tę kłopotliwą funkcję.

0

ale po co robisz tablicę wskaźników na stringi, zamiast zrobić po prostu tablicę stringów? (albo jeszcze lepiej: wektor stringów).
sam sobie stwarzasz kłopot.

0

Pokaż jak wywołujesz tę kłopotliwą funkcję.

Już pisałem wyżej, jeśli chcesz dokładnie jak to mam w kodzie to wygląda tak :

szerokosc[1]= text_length(rodzaj_czcionki[1], nazwa_przycisku_in[1]->c_str());

ale po co robisz tablicę wskaźników na stringi, zamiast zrobić po prostu tablicę stringów? (albo jeszcze lepiej: wektor stringów).
sam sobie stwarzasz kłopot.

Próbowałem, ale tylko w ten sposób mi się udało. Gdy robiłem po prostu tablicę stringów to nie działało (nie jestem pewien, ale chyba się zawieszało z tego co pamiętam).

0

Już pisałem wyżej (...)

Pisałeś, że "jako argumenty daję dla niej zmienne string". Z kontekstu można zrozumieć, żę chodziło Ci o typ std::string a nie c-string. Ale mniejsza o to. Jeśli w argumentach podajesz wskaźniki const char* (bo to zwraca c_str), to nie możesz ot tak sobie ich rzutować na wskaźnik string*. Możesz zrobić tak jak pisano, czyli:

string nazwa[50];

nazwa[0] = va_arg(ap, const char*); 

lub, jeśli musi być ta tablica wskaźników:

string* nazwa[50];

nazwa[0] = new string(va_arg(ap, const char*)); // tworzysz obiekt typu string i ustawiasz mu wartość (vide ctor string( const char * s ))

p.s. pytałem się o wywołanie funkcji ze zmienną ilością parametrów, bo wywołanie text_length jest tutaj najmniej istotne.

0

p.s. pytałem się o wywołanie funkcji ze zmienną ilością parametrów, bo wywołanie text_length jest tutaj najmniej istotne.

Źle zrozumiałem, przepraszam :) Co do meritum Twoje postu : poprzez sposób pierwszy program się kompiluje, ale zawiesza, a poprzez sposób drugi się nie kompiluje tylko wyrzuca : cannot convert 'const char*' to 'std::string*' in assignment.

0

Coś kręcisz kolego, drugi sposób nie ma prawa wyrzucić jakiegokolwiek błędu, tym bardziej błędu związanego z próbą przypisania wskaźnika const char* na wskaźnik string*, ponieważ tam czegoś takiego po prostu nie ma. Przyjrzyj się jeszcze raz, dokładnie:

nazwa[0] = new string(   va_arg(ap, const char*)   );

Mam nadzieję, że widzisz różnicę.

Problem w tym, że cały czas nie wiem, co Ty tam w argumentach funkcji (ze zmienną ilością parametrów) dajesz. Jeśli to są c-stringi, to to, co podałem wyżej, musi działać. Jeśli przekazujesz std::stringi przez wartość, czyli:

string s = "tekst";

foo(s);

wtedy do parametru dobierasz się tak:

string *nazwa[50];

...

nazwa[0] = &va_arg(ap, string);

Choć nie jestem pewnien, czy operowanie na takim stringu jest bezpieczne. Dlatego lepiej przekazać go przez wskaźnik:

foo(&s);

i

string *nazwa[50];

nazwa[0] = va_arg(ap, string*);

powinna działać.

0

Ja myślę że cała ta funkcja to jest jedno wielkie WTF. Ale nie możemy jej poprawić, nie widząc całości.

1 użytkowników online, w tym zalogowanych: 0, gości: 1