IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Caster
Člen
Avatar
Caster:10.5.2018 20:30

V programu potřebuji předat externí funkci adresu ukazatele na data jeho načtením (64 bit) do proměnné __int64.

C++ ale hlásí chybu:
BYTE *bsrc
a value of type "BYTE" cannot be assigned to an entity of type "long long"

__int64 adresa = 0;
BYTE* ptr = NULL;
BYTE* bsrc = ptr;  // Pointer na datové pole ASCII znaků

adresa = bsrc;
__int64 result = Funkce_Uprav(adresa);

Jak dostatat adresu ukazatele do proměnné ?

 
Odpovědět
10.5.2018 20:30
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Caster
DarkCoder:10.5.2018 20:49

Ukazatel je proměnná, která je schopna pojmout adresu jiného objektu. Chceš-li uchovávat adresu jiného ukazatele, je třeba vytvořit ukazatel na ukazatel na typ.

adresa = bsrc;

Tento přiřazovací příkaz je chybný, neboť adresa není ukazatel na typ.

Nahoru Odpovědět
10.5.2018 20:49
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Caster
Člen
Avatar
Caster:10.5.2018 21:20

To mi moc nepomohlo :-(. Jak to mám tedy správně udělat ? Do proměnné adresa potřebuji dostat 64 bitový ukazatel na pole z bsrc. Externí funkce volá macroassembler, kterému předá adresu na pole v registru RCX.

 
Nahoru Odpovědět
10.5.2018 21:20
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Caster
Martin Dráb:10.5.2018 22:36

Pokud potřebuješ celočíselný typ pro předávání obsahu ukazatelů, tak můžeš použít na Windows LONG_PTR či ULONG_PTR, záleží, zda chceš znaménko nebo ne. Velikost těchto typů odpovídá velikosti ukazatelů (4 bajty na 32bitových a 8 bajtů na 64bitových systémech).

Normálně ti ale bude fungovat explicitní přetypování.

adresa = (__int64)bsrc;

Nemůžeš však předat té externí funkci přímo ten ukazatel? Neb o **BYTE * ** bude v tvém případě reprezentován (interně) jako 64bitové číslo, takže následující dvě deklarace externí funkce jsou ekvivalentní:

void f(__int64 arg);
void f(BYTE *arg);

(na 64bitových Windows).

Nahoru Odpovědět
10.5.2018 22:36
2 + 2 = 5 for extremely large values of 2
Avatar
Caster
Člen
Avatar
Caster:11.5.2018 0:20

Funkce je definována:

extern "C" __int64 Funkce_Uprav(__int64);

Jak mám do ní při jejím volání zadat ten pointer, který je definován jako BYTE* ?

 
Nahoru Odpovědět
11.5.2018 0:20
Avatar
Caster
Člen
Avatar
Caster:11.5.2018 0:25

Stačilo to fakt jen přetypovat, už to chodí, díky :-).

 
Nahoru Odpovědět
11.5.2018 0:25
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.