Witam,
potrzebuję rzutować dowolne typy danych na char* i odwrotnie.
No i w czym problem? Potrzebujesz to rzutuj ;]
Dodatkowo standard zapewnia, że nigdy nie będzie to problem.
Więc do roboty :)
Rzutowanie czy konwertowanie do stringa? Może autor nie rozróżnia.
Wibowit napisał(a):
Rzutowanie czy konwertowanie do stringa? Może autor nie rozróżnia.
Możesz traktować to jako konwertowanie do stringa, bo jest coś takiego jak .c_str(), ale chodzi mi o konkretne bajty. Gdy mam inta to nie chcę napisu typu "12048", chcę reprezentację binarną inta w typie char* co wygląda np. tak ")u_#".
Żeby uniknąć konwersji musisz rzutować adresy (wskaźniki/ referencje/ stałe adresy/ cokolwiek).
A a = cośtam;
A * ap = &a;
B * bp = (B*)ap;
B b = *bp;
Na co dzień w C/ C++ nie kodzę, więc mogłem coś pokręcić, ale mniej więcej takie coś powinno zadziałać.
Możesz olać ostatnią dereferencję, za typ A wstawić int
, za typ B wstawić char
i dostaniesz to co chcesz, czyli interpretację inta jako char *.
Jest tylko pewien haczyk - takie konwersje są chyba UB, a na reprezentację wpływa endianess.
Wibowit napisał(a):
Jest tylko pewien haczyk - takie konwersje są chyba UB, a na reprezentację wpływa endianess.
Nie do końca. Generalnie można castować takie rzeczy:
-
X*
<->Y*
, gdzieX*
iY*
to zwykłe wskaźniki (nie wskaźniki na funkcje) i ichalignment
jest zgodny (dla castaX*
->char*
alignment
jest zawsze zgodny) -
X*
<->void*
, gdzieX*
to zwykły wskaźnik (nie wskaźnik na funkcję) -
X*
<->Y*
, gdzieX*
iY*
to wskaźniki na funkcje
Warto dodać, że dereferencja tak skonwertowanego pointera jest poprawna (zagwarantowana przez standard) tylko dla cast X*
-> char*
.
int n = 99931;
char *c = new char[4];
c = (char*) &n;
for (size_t i = 0; i < 4; ++i)
cout << *(c + i);
delete[] c;
Ten kod jest zły.
Oczywiście, że jest zły.
int n = 99931;
char *c = new char[4]; // tutaj c zawiera adres pamięci na stercie
c = (char*) &n; // a tutaj od razu przypisujesz adres ze stosu, więc po co wcześniejsza alokacja?
...
delete[] c; // a więc tutaj próbujesz zdealokować pamięć na stosie, WTF???
Jeśli chcesz sobie przekopiować to zrób takie coś:
int n = 12345;
char c[4];
memcpy(c, &n, 4);
for (int i = 0; i < 4; i++) {
cout << c[i];
}
Zrobiłem tak:
template <typename T>
char* toCharPtr(T &t)
{
char *c = new char[sizeof(t)];
memcpy(c, &t, sizeof(t));
return c;
}
template <typename D>
//tylko, że nie mogę wywołać tej funkcji
D fromCharPtr(char *c)
{
D t = new T[sizeof(*c)];
memcpy(t, c, sizeof(*c));
return t;
}
Co to jest D
? Nie powinno być T*
?
Jak wywołujesz? Parametryzujesz szablon czy nie? Jeśli kompilator nie ma skąd zinferować parametru to się kompilacja wysypie, proste i logiczne.
Z T* też nie działa
Pokaż kod i błąd.