Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
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:5.8.2018 21:30
VOID OnPaint(HDC hdc)
{
        Graphics graphics(hdc);
        Pen      pen(Color(255, 0, 0, 255), 3);
        INT32   LAT[156]{ -10127, -10291, -11002, ...
        };
        INT32   LON[156]{ 73025, 73056, 72348, ...
        };
        POINT    apt[156]{ };
        for (int i = 0; i < 156; i++)   // Naplníme pole pro vynášení bójí
        {
                apt[i].x = (float)LON[i] / (float)180000 * 960 + 960;
                apt[i].y = (float)abs(LAT[i]) / (float)90000 * 540 + 540;
        }
        //graphics.DrawLine(&pen, 0, 0, 200, 100);
        //SetMapMode(hdc, MM_ISOTROPIC);
        //SetWindowExtEx(hdc, 960, 540, NULL);
        //SetViewportExtEx(hdc, cxClient / 2, -cyClient / 2, NULL);
        //SetViewportOrgEx(hdc, cxClient / 2, cyClient / 2, NULL);

        Polyline(hdc, apt, 156);
}

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, INT iCmdShow)
...

Chci docílit: Kód výše je funkční (není zde uveden celý), pro diskuzi zde jsem jen ponechal první tři hodnoty LAT, LON ze 156. Potřebuji poradit, jak načíst vektor z ASM přímo z paměti. Z C++ volám vlastní funkce v x64 macroassembleru (počet souřadnic a vektor souřadnic ve tvaru QWORD kde LoDWORD je LAT a HiDWORD je LON, souřadnice jsou za sebou. Při pokusu o náhradu počtu bodů (místo 156) v

POINT    apt[156]{ };

pomocí *(DWORD *)(bsrc + 0x01719F0F6B + 4 * i) mi to hlasí chybu, že není definován pointer bsrc a proměnná i. Těm ale přiřadím hodnoty v hlavní části programu ve WinMain. Jak na to ?

 
Odpovědět
5.8.2018 21:30
Avatar
Caster
Člen
Avatar
Caster:6.8.2018 17:37

Upravil jsem příkaz, aby se odkazoval na hodnoty přímo z paměti:

Polyline(hdc, *(DWORDLONG *)(bsrc + 0x01719F0F6B + 8 * x + 8), *(DWORD *)(bsrc + 0x01719F0F6B + 4 * x + 4));

Překlad mi ale hlásí chybu, že není definován pointer bsrc (je definován v hlavním programu WinMain. Co s tím ? Přesun funkce OnPaint za blok WinMain nepomohlo.

 
Nahoru Odpovědět
6.8.2018 17:37
Avatar
Caster
Člen
Avatar
Caster:6.8.2018 17:45

bsrc už jsem vyřešil jeho definováním:

BYTE* bsrc = NULL;

před funkcí OnPaint. Poslední problém:

argument of type "DWORDLONG" is incompatible with parameter of type "const POINT *"

Co s tím ? Jde o 64bit pointer, který odkazuje do paměti s daty (souřadnice bodů) pro jejich vykreslení funkcí Polyline.

 
Nahoru Odpovědět
6.8.2018 17:45
Avatar
Caster
Člen
Avatar
Caster:6.8.2018 23:38

Nakonec se ukázalo, že potřebuji nadefinovat odkaz na data bodů v paměti.
To znamené nahradit řádek programu, který odkazuje na strukturu bodů:

POINT    apt[156]{}

něčím jako

POINT     má_adresa_na_pole_bodů[*(DWORD *)(bsrc + 0x01719F0F6B + 4 * x + 4)]

kde je *(DWORD *)(bsrc + 0x01719F0F6B + 4 * x + 4) odkaz na DWORD hodnotu počet bodů v poli a přesměrovat adresu pole s daty "apt" na mou 64 bit adresu v paměti např. pomocí *(DWORDLONG *)(bsrc + 0x01719F0F6B + 8 * x + 8)

 
Nahoru Odpovědět
6.8.2018 23:38
Avatar
Caster
Člen
Avatar
Caster:14.8.2018 1:25

Vyřešeno, pomohl

reinterpret_cast<POINT*>(memory)
Akceptované řešení
+5 Zkušeností
Řešení problému
 
Nahoru Odpovědět
14.8.2018 1: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 5 zpráv z 5.