Jak dostać się za pośrednictwem void* do struktur

0

Witajcie,

Napisałem tak:

(BearchLen*)*buf = file->tellp()+8;
/* Tu jest usunięty ten buf niżej */ 

/* Tutaj wyżej od tego było "buf = new BearchItemHeader" */
BearchItemHeader*(buf)->itemName = "/";

Błąd jest w tych 2-ch liniach.
W pierwszej linii:
buf to void* buf = new BearchLen
file to wskaźnik do pliku
BearchLen to typ unsigned long long int

W drugim przypadku:
buf to buf = new BearchItemHeader
BearchItemHeader to struktura która zawiera itemName (ale nie tylko).

Jak mam poprawnie do struktury wskazanej przez void* wpisać dane? Jak do unsigned long long int wskazanemu przez void* wpisać liczbę?

2

Nie zrozumiałem ani słowa z twojego opisu. Niemniej odpowiadając na zadane pytanie: rzutując.

int* liczba = new int;
void* wskaznik = liczba;
*((int*)wskaznik) = 10;
0

Wyjaśniam. Mam strukturę:

typedef unsigned long long int BearchLen;
typedef unsigned int BearchChildsNum;
typedef std::string BearchPath;
#define BEARCHMAXNAME 32

enum BearchEnum : unsigned int{
	BEARCHDIR,
	BEARCHFILE,
	BEARCHREMOVED
};

#pragma pack(push, 1)
struct BearchItemHeader{
	char itemName[BEARCHMAXNAME];
	BearchEnum itemType;
	BearchChildsNum itemChilds;
	BearchLen dataFirst;
	BearchLen dataLength;
};
#pragma pack(pop)

I mam:

 void* buf;
	buf = new BearchItemHeader;
	static_cast<BearchItemHeader*>(buf)->itemName = {"/"};

Teraz w sumie został błąd rzutu const char[2] na char[32]. To skleiłem ze Stack Overflow. Bez static_cast<> się nie da jakoś. Chyba będzie potrzebna funkcja przepisująca bajty z const char[2] do char[32]. Może jest coś w stdlib?

2

Nie no chłopie bez żartów. Tak sie NIE przypisuje C-stringów. Skoro masz w strukturze tablicę to SKOPIUJ tego stringa za pomocą strncpy() bo to co teraz robisz to jest zło w czystej postaci.

BTW doskonały przykład antywzorca Smurf Naming Convention. Rozumiesz że nadawanie wszystkiemu przedrostka Bearch w niczym nie pomaga, prawda?

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