Posted By: Quasimodo (Quasimodo) on 'CZprogram' Title: Pokud nejaky javista nema co delat... Date: Thu Nov 18 16:17:58 2004 Pokud na to spravne koukam, tak v jave neexistuje neco takoveho jako union a pointery jsou neco, ceho se strasne moc chteli zbavit. Vzpomnel jsem si na jeden problem, kdyz jsem v C++ potreboval nacist ze souboru vytvoreneho pascalem hodnoty typu float... Jak by se neco takoveho delalo v jave nebo podobnych jazycich, kde nemam ani union ani pouzitelne pointery? Pripada mi, ze to musi byt peknej porod... Nebo se pletu? Moje reseni v C++ sice krasou neoplyva, ale dostatecne (rychle) funguje pro data, se kterymi ma pracovat: #define unsigned char byte /// Pro snadny pristup k jednotlivym bytum pouziju union union cfloat { byte bajt[4]; float value; cfloat &operator = (float f) { value = f; return *this; } }; /** Pascalsky real zabira v pameti 6B. Tato trida umoznuje konverze mezi timto formatem a std C++ floatem na 4B Pozor na endian! Tohle je psano a odzkouseno pro intel! */ struct pasfloat { byte bajt[6]; pasfloat &operator=(float f) { cfloat cf; cf = f; *this = cf; return *this; }; /// Prevod z ceckovskeho floatu pasfloat &operator=(cfloat cf) { bajt[0] = (cf.bajt[3] & 0x7f)*2 + ((cf.bajt[2] & 0x80) >> 7) + 2; bajt[1] = 0; bajt[2] = 0; bajt[3] = cf.bajt[0]; bajt[4] = cf.bajt[1]; bajt[5] = cf.bajt[2] & (0x7f); // Znamenko bajt[5] |= cf.bajt[3] & 0x80; return *this; }; /// Prevod na ceckovsky float (fuj - az nekdy bude cas, predelat) operator float() { float f = pow (2, bajt[0] - 129) * ( bajt[1] * pow (2, -63) + bajt[2] * pow (2, -31) + bajt[3] * pow (2, -23) + bajt[4] * pow (2, -15) + (bajt[5] & 0x7f )* pow (2, -7) + 1); if (bajt[5] & 0x80) f = -f; return f; }; }; Pouzivam to obvykle ve tvaru pasfloat pf; read(fd, &pf, sizeof(pf)); - Clovek je nejpomalejsi zname zarizeni typu I/O. Quasimodo