Soubor je větší než ukládaná struktura – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Soubor je větší než ukládaná struktura – C / C++ – Fórum – Programujte.comSoubor je větší než ukládaná struktura – C / C++ – Fórum – Programujte.com

 

Štěpán
~ Anonymní uživatel
126 příspěvků
12. 10. 2011   #1
-
0
-

Ahoj, ještě mám další C (ne c++) dotaz. Aplikace pro Windows mobile je plně funkční, její přepis na PC však není tak snadný, jak by se mohlo zdát. wsprintf vs. swprintf už jsem opravil, tak ještě toto:

//struktura uchovávající nastavení

struct c_settings
{
DWORD dwHandRanking;
double dblEuros;
double dblPounds;
double dblEquity;
DWORD dwAskSite;
DWORD dwActiveSite;
DWORD dwActiveBankroll;
};

//globální proměnná s nastavením

struct c_settings g_pSettings;

//Uložení nastavení

WriteFile(hFile,&g_pSettings,sizeof(struct c_settings),&dwWritten,NULL);

Výsledný soubor má na Windows mobile 40 bajtů, tak, jak to má být. Ale proč má ve Windows PC 48 bajtů? Ten program je stený, liší se pouze v #inculde souborech, platformě... Máte nápad, co by to mohlo způsobovat? Zkopíroval jsem si soubory používané programem na mobilu, a program na PC s nimi začal padat, protože (nejen u příkladu settingů) prostě načítá něco jiného, než co je v těch souborech uložené...

Díky za nápady

Nahlásit jako SPAM
IP: 213.41.138.–
KIIV
~ Moderátor
+43
God of flame
12. 10. 2011   #2
-
0
-

porovnej pomoci sizeof jednotlive velikosti datovych typu... muze to byt i zarovnany v pameti a podobne (takze muzes vypsat jednotlive offsety dat ve strukture, jestli souhlasi)

kazdopadne binarni soubory sou obvykle velice tezko prenositelne mezi platformama

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Štěpán
~ Anonymní uživatel
126 příspěvků
12. 10. 2011   #3
-
0
-

tak jsem to porovnal pomocí sizeof, trochu jsem si mákl, protože jsem včera přepisoval wsprintf na swprintf, aby to fungovalo na PC, ale přestalo to fungovat zas na mobilu... No tak jsem musel na 150 místech udělat podmíněný překlad...

Takže sizeof na Pocket PC ukazuje 40B

sizeof na PC ukazuje 48B

To je opravdu možné, že systém kvůli něčemu (indexování, rychlost) může nechat některé bajty v paměti nevyužité a ukládat 40B strukturu na 48B (3*16?) ? Mohu se zeptat, které bajty budou vyplněny daty a které ničím? 0...39 nebo 8...47?

Ještě trochu off topic, to není nutné, ale pokud by byla odpověď snadná, nemusel bych to hledat...:)

a) Jak se píše cesta k souboru (nějak zkráceně), který je ve složce se spouštěným exe?

b) PC vyžaduje swprintf(wchar_t*,int,wchar_t*,...) mobil jen swprintf(wchar_t*,wchar_t*,...). Dá se napsat nějak jednoduše funkce, ve které bych udělal podmíněný překlad až vevnitř, tedy jednou? Jde mi o ty tři tečky...

Díky

Nahlásit jako SPAM
IP: 213.41.138.–
KIIV
~ Moderátor
+43
God of flame
12. 10. 2011   #4
-
0
-

#3 Štěpán
nu nemyslel sem sizeof cele struktury ale DWORD a double

offsety jsou zase mysleny adresy, kde jsou v pameti jednotlive prvky te same struktury:

print:   &struktura,  &(struktura.dwHandRanking)  .... az po:   &(struktura.dwActiveBankroll)

se pak da poznat o kolik bajtu je co v pameti posunute oproti zacatku cele struktury

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Štěpán
~ Anonymní uživatel
126 příspěvků
12. 10. 2011   #5
-
0
-

#4 KIIV
sizeof DWORD = 4 a sizeof(double)=8, to jsem zkoušel, ale sizeof(struktury), která je 3*double+4*DWORD je 48 místo 40... Nechápu to. Co je tedy na těch 8 bajtech?

Nahlásit jako SPAM
IP: 213.41.138.–
KIIV
~ Moderátor
+43
God of flame
12. 10. 2011   #6
-
0
-

#5 Štěpán
proto ty pozice adres uvnitr struktury... jestli je tam zarovnani tak to poznas...

pak jeste existuje neco jako packed struct ... kde se tydle vychytavky kvuli rychlosti vynechaji explicitne

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
liborb
~ Redaktor
+18
Guru
12. 10. 2011   #7
-
0
-

Na  DWORD před a za double je vyhrazeno 8 bajtů, stejně jako na ty double. Kdyby si udělal strukturu:

struct c_settings
{
double dblEuros;
double dblPounds;
double dblEquity;
DWORD dwHandRanking;
DWORD dwAskSite;
DWORD dwActiveSite;
DWORD dwActiveBankroll;
};

tak budeš mít velikost 40. Jistě na to existuje nějaký přepínač v nastavení překladače nebo #pragma (že by pack?).

Nahlásit jako SPAM
IP: 78.80.52.–
Štěpán
~ Anonymní uživatel
126 příspěvků
12. 10. 2011   #8
-
0
-

Hmm, tak to jsem ještě neslyšel, díky za radu, kde hledat řešení. Musím na to kouknout...

Nahlásit jako SPAM
IP: 213.41.138.–
Štěpán
~ Anonymní uživatel
126 příspěvků
12. 10. 2011   #9
-
0
-

Problém vyřešen

#Pragma pack(1) , před windowsáckými #include nefunguje, to pořád hází 48, asi to někde změní...

#Pragma pack(1) za všema windowsovskýma #include už ale funguje, tak jak potřebuji. Nevěděl jsem, že takový alignment existuje, ono vesměs když člověk používá buď celočíselné struktury se samýma DWORD nebo jen matematické se samýma double, tak na to nenarazí. Bylo zapotřebí udělat nějakou komplexnější strukturu jako settings, aby se to ukázalo... Díky za rady

Nahlásit jako SPAM
IP: 213.41.138.–
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, 123 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ý