Dejme tomu, že mám strukturu:
struct a
{int i a, b;};
A když bych chtěl získat ukazatel na b - jde to takto?
a struktura;
int* p = &struktura.b;
Dejme tomu, že mám strukturu:
struct a
{int i a, b;};
a struktura;
int* p = &struktura.b;
To yaqwsx : mozna pro jistotu &(struktura.b) pripadne pokud znas velikosti prvku tak ((int *)&struktura) + 1.. ale to je uz spis riziko pouzit .. co kdyby se nahodou struktura struktury zmenila :)
V tom bohužel chyba není.
Mám načítací a ukládací funkci. Používám binární soubor. Vše funguje, až na poslední načítací cyklus. Zde se mi načte do hodnoty u (kolk[i].ind.size();) nesmyslná hodnota.
Kód má spoustu chyb (např. že pro uchovávní velikosti používá signed int) - zatím se jedná o neustále přepisovanou verzi, takže z důvodu lenosti jsou tam takové věci. V kód jsme zde taky hodně pokrátil - vynechal jsem nepodstatné definice,atd...
void sobjekt::save(std::fstream &s)
{
objekt::save(s);
string::size_type sx = ns.size();
s.write((char*)(&sx), sizeof(string::size_type));
for(int i = 0; i != sx; i++)
{
s.write((char*)(&ns[i]), sizeof(char));
}
s.write((char*)(&this->s.x), sizeof(int));
s.write((char*)(&this->s.y), sizeof(int));
unsigned int p = kol.size();
s.write((char*)(&p), sizeof(unsigned int));
for(int i = 0; i != p; i++)
{
s.write((char*)(&kol[i]), sizeof(::kol));
}
p = kolk.size();
s.write((char*)(&p), sizeof(unsigned int));
for(int i = 0; i != p; i++)
{
s.write((char*)(&(kolk[i].kruh)), sizeof(::kol6));
unsigned int u = kolk[i].ind.size();
s.write((char*)(&u), sizeof(unsigned int));
for(int q = 0; q != u; q++)
{
s.write((char*)(&(kolk[i].ind[q])), sizeof(int));
}
}
}
void sobjekt::load(ifstream&s)
{
objekt::load(s);
string::size_type sx;
s.read((char*)(&sx), sizeof(string::size_type));
for(int i = 0; i != sx; i++)
{
char c;
s.read(&c, sizeof(char));
ns.push_back(c);
}
this->s = sprite(this->ns.c_str());
s.read((char*)(&this->s.x), sizeof(int));
s.read((char*)(&this->s.y), sizeof(int));
unsigned int p;
s.read((char*)(&p), sizeof(unsigned int));
for(int i = 0; i != p; i++)
{
::kol k;
s.read((char*)(&k), sizeof(::kol));
kol.push_back(k);
}
s.read((char*)(&p), sizeof(unsigned int));
for(int i = 0; i != p; i++)
{
::kol7 k;
s.read((char*)(&(k.kruh)), sizeof(::kol6));
unsigned int u;
s.read((char*)(&u), sizeof(unsigned int));
for(int q = 0; q != u; q++)
{
int r;
s.read((char*)(&r), sizeof(int));
k.ind.push_back(r);
}
kolk.push_back(k);
}
}
class sobjekt :
public objekt
{
public:
sobjekt(void);
~sobjekt(void);
//Nepodstatné definice vynechány
objekt* klon() {sobjekt* p = new sobjekt; (*p) = (*this); return p;};//Klonování
private:
sprite s;//Sprite
vector<::kol> kol;//Kolizní objekty
vector<::kol7> kolk;//Kolizní kružnice
string ns;//název souboru
};
struct kol2
{
bod A, u;
bool o;
bool operator==(const kol2& n){return (A == n.A && u == n.u);};
};
struct kol3
{
double x, y, v, s;
};
struct kol4
{
double r;
bod b;
};
struct kol5
{
kol4 kruh;
std::vector<int> ind;//vector indexů
};
struct kol6
{
double r;
usecka b;
};
struct kol7
{
kol6 kruh;
std::vector<int> ind;
};
struct kol
{
usecka k;
usecka vz;
bool o;
};
KIIV napsal:
mozna pro jistotu &(struktura.b)
Jak otevíráš ty streamy pro zápis a jak pro čtení? Jsou opravdu obě varianty otevřeny v binárním modu? Pokud aspoň jeden z nich není a zkoušíš to na windows, tak to nepojede.
To yaqwsx : Na ukladanie aj nacitanie pouzi vector<int>::size_type, co je vo vela verziach kniznic long a nie unsigned int. Pridaj k tomu 64bitovy kompilator a katastrofu mas na svete :).
Ak to nebude v tomto tak sa vzdavam ... ;)
Konečně to funguje! Příčina - neznámá; Zkusil jsem tedy přepsat datové typy ukládaných hodnot - nepomohlo. Tak jsme se naštval, celé to smazal a napsal znovu (kdybych se nezeptal a přepsal to znovu, tak by to nefungovalo - nevím čím je to způsobené, ale vždy to tak je. Viz má témata zde na pg.com). Nyní už to funguje. Děkuji všem za rady.
neviem v akom IDE robis ale vzdy si vyskusaj daj prekompilovat (rebuiltnut) cely projekt, pretoze myslim ze builder a aj ine dasie IDE to tak robi, ze ked uz mas projekt skompilovany a potom tam nieco dopisujes tak len akokeby "dokompilovavaju" dopisany kod
ale neviem ci netrepem:)
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku