Ukazatel na položku struktury – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Ukazatel na položku struktury – C / C++ – Fórum – Programujte.comUkazatel na položku struktury – C / C++ – Fórum – Programujte.com

 

yaqwsx+9
Posthunter
20. 7. 2009   #1
-
0
-

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;

Nahlásit jako SPAM
IP: 85.160.96.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
KIIV
~ Moderátor
+43
God of flame
20. 7. 2009   #2
-
0
-

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 :)

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
yaqwsx+9
Posthunter
20. 7. 2009   #3
-
0
-

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);
}
}

Definice datových struktur
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;
};


Nenašel by se někdo, kdo by se na to mrknul a neskusil přijít na to, kde mám chybu?
Děkuji za každou odpověď

Nahlásit jako SPAM
IP: 85.160.99.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
nikto
~ Anonymní uživatel
24 příspěvků
21. 7. 2009   #4
-
0
-

To yaqwsx : Do toho 'u' to nacita nezmysel vzdy alebo az pri poslednej iteracii cyklu ?
A len tak vystrel do tmy: skus pridat na koniec save() s.flush();

Nahlásit jako SPAM
IP: 217.118.98.–
yaqwsx+9
Posthunter
21. 7. 2009   #5
-
0
-

Už hned při první iteraci.

Nahlásit jako SPAM
IP: 85.160.81.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
21. 7. 2009   #6
-
0
-

KIIV napsal:
mozna pro jistotu &(struktura.b)



operátor tečka má vyšší prioritu než deference, závorka není nutná.

Nahlásit jako SPAM
IP: 213.211.34.–
KIIV
~ Moderátor
+43
God of flame
21. 7. 2009   #7
-
0
-

To Anonymní uživatel : nenechavam vetsinou ani prioritu operatoru nahode :D

Nahlásit jako SPAM
IP: 80.188.94.–
Program vždy dělá to co naprogramujete, ne to co chcete...
ondra.holub+1
Stálý člen
21. 7. 2009   #8
-
0
-

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.

Nahlásit jako SPAM
IP: 194.138.12.–
nikto
~ Anonymní uživatel
24 příspěvků
21. 7. 2009   #9
-
0
-

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 ... ;)

Nahlásit jako SPAM
IP: 217.118.98.–
yaqwsx+9
Posthunter
21. 7. 2009   #10
-
0
-

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.

Nahlásit jako SPAM
IP: 85.160.87.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
milan_m0
Newbie
23. 7. 2009   #11
-
0
-

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:)

Nahlásit jako SPAM
IP: 91.127.37.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 10 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý