Anonymní profil Štěpán – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil Štěpán – Programujte.comAnonymní profil Štěpán – Programujte.com

 

Příspěvky odeslané z IP adresy 213.41.138.–

Štěpán
C / C++ › _asm (funguje v konzoli, ve…
13. 10. 2011   #148623

#3 Štěpán
Vyřešeno, stačilo odstranit optimalizace

Štěpán
C / C++ › _asm (funguje v konzoli, ve…
13. 10. 2011   #148619

aha, už tomu rozumím, co ty řádky dělají. Jaký ale může být důvod, že ten kód funguje jen v konzolové aplikaci a ve WinAPI ne? Je tam něco, co musím ošetřit? Mohu vůbec používat asembler ve WinAPI aplikaci?

Štěpán
C / C++ › _asm (funguje v konzoli, ve…
13. 10. 2011   #148591

Ahoj,

na netu jsem hledal, jak získat nějaká data o procesoru. Potřebuji nějaké 20B ID, jen pro kontrolu licence. Něco jsem našel a překopal jsem to podle svých potřeb. V konzoli mi normálně b[20] naplní (pokaždé stejně, samozřejmě) . Ve WinAPI mi to padá. Programuji v C (ne c++) (PellesC). Tomu asemblerovskému kódu vůbec nerozumím, máte nápady, co mám nastavit, změnit či tak? Fakt nic mi to neříká...


char VendorID[13];
    unsigned char Brand;
    unsigned long VersionInfo;
    unsigned long FeatureInfo;
    _asm
    {
        mov eax,0
        cpuid                           //CPUID Instruction
        mov dword ptr [VendorID],ebx
        mov dword ptr [VendorID+4],edx
        mov dword ptr [VendorID+8],ecx
        mov byte ptr [VendorID+12],0
    }
    _asm
    {
        mov eax,1
        cpuid                           //CPUID Instruction
        mov VersionInfo,eax             //Store Version Information
        mov FeatureInfo,edx             //Store Feature Information
        mov Brand,bl                    //Store Brand Information
    }
BYTE b[20];

memcpy(b,&VersionInfo,4);
memcpy(b+4,VendorID,11);
b[15]=Brand;
memcpy(b+16,&FeatureInfo,4);

Díky za nápady.

Štěpán
C / C++ › Soubor je větší než ukládaná…
12. 10. 2011   #148563

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

Štěpán
C / C++ › Soubor je větší než ukládaná…
12. 10. 2011   #148562

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

Štěpán
C / C++ › Soubor je větší než ukládaná…
12. 10. 2011   #148559

#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?

Štěpán
C / C++ › Soubor je větší než ukládaná…
12. 10. 2011   #148539

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

Štěpán
C / C++ › Soubor je větší než ukládaná…
12. 10. 2011   #148526

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

Štěpán
C / C++ › wsprintf floating point prob…
11. 10. 2011   #148513

díky, swprintf funguje:)

Štěpán
C / C++ › wsprintf floating point prob…
11. 10. 2011   #148501

Ahoj,

mám napsanou aplikaci v jazyce C, (ne c++), pro Windows mobile, která funguje. Udělal jsem pár úprav a už běží i na klasickém PC. Jen jedna věc mi nefunguje, a sice při použití wsprintf(sz, L"%.2f",dbl) mi místo čísla vypíše "f"... Na WinMobile to funguje normálně, ale na PC ne. Co s tím? Díky

 

 

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