» Poradna » Ostatní

Zapisovanie do pamate v C++

 |   |  Microsoft Windows 10 Chrome 76.0.3809.100

Ahojte potreboval by som v C / C++ daco zapisat na adresu v pamatiV Basicu na to boli funckiePEEK(ADRESA%) - funkcia precitala hodnotu zo zadanej adresyPOKE ADRESA%, hodnota% - procedura zapisala hodnotu na zadanu adresu ak sme chceli zapisat znak bolo ho potrebne previest na cisloA k tymto funkciam bola este prikaz:DEF SEG, ktorym sa prepinali segmenty.Ako sa tieto funkcie a prikazy volaju v C++ resp C? Alebo vedeli by ste mi poradit ako tento priklad z basicu prepisat do C++?DIM a%(2)DEF SEG = VARSEG(a%(0))FOR i% = 0 TO 2 READ d% POKE VARPTR(a%(0)) + i%, d%NEXT i%DATA 205, 5, 203CALL ABSOLUTE(VARPTR(a%(0)))DEF SEG

Odpovědi na otázku

 |   |  Microsoft Windows 7 Chrome 73.0.3683.88

Tam je to jednoduché. Stačí používat pointery.unsigned char * addr; //Byteaddr = 1213365; //adresa paměti*addr = 38; //zapíšeš hodnotu 38 na adresu 1213365Jen si dej pozor jakou adresu tam zadáváš. Pokud se ve windows aplikace pokusí přistoupit k paměti, kterou nemá alokovanou tak to vyvolá chybu. (access violation at address)

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 10 Firefox 68.0

On se ptal na C++, ne na C. V C++ je nutný cast, v C to možná projde s warningem.Správně by to bylo addr = (char*) 1213365;

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Firefox 68.0

ten kod kterej máš v Basicu vypadá na GWBasic/TurboBasic nebo něco podobnýho bohužel pod moderním PC s Windows 7 a výše to už nefunguje ... myslim příkazy POKE a PEEK .. musel bys to programovat v C++ pro MSDOS třeba Watcom C++ nebo Borland C++ vše z éry MSDOSu a samozřejmě takový program pujde spustit zase jen pod MSDOS max. do verze 7.1 tedy Windows ME. jinak zkus poslat dotaz na programujte.com... pokud programuješ pod MSDOSem třeba v Borland C++ tak tam ti na to stačí vestavěmý assembler příkaz asm{ ... } a příkazy MOV pro přesun něčeho někam na určitou adresu..........

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Firefox 68.0

ještě taková drobnout ta oblast paměti kam něco zapisuješ musí býát samozřejmě nejprve nějak alokovaná třeba příkazem new nebo službou MSDosu IntXX nebo biosu IntXX chápeš jo ?

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Android AppleMAC-Safari 5.0

Jen upřesním, že uvedený kód se používal v QBasicu k tisku obsahu obrazovky v textovém režimu na místní tiskárně.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Firefox 68.0

jinak taky mužeš použíd DosBox nebo VirtualPC nebo VMWare a tak podobně

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 10 Firefox 68.0

V céčku můžeš pole deklarovat přímo: unsigned char a = { 205, 5, 3 };Ten call půjde nahradit castováním na funkci: ((void(*)())a)();Ale v C se k tomu používá inline assembler nebo emit, jak tu už zaznělo.void printscreen(){ asm int 5}nebovoid printscreen(){ __emit__ (205); __emit__ (5); __emit__ (203);}A k čemu to vůbec chceš ? Máš v PC DOS nebo to budeš pouštět v DosBoxu ?

Souhlasím  |  Nesouhlasím  |  Odpovědět

Související témata: Poke, Peek, Procedura


Určitě si přečtěte

Lektvar z války Severu proti Jihu zabírá i tam, kde selhávají moderní antibiotika

Lektvar z války Severu proti Jihu zabírá i tam, kde selhávají moderní antibiotika

** Američtí farmakologové hledali inspiraci pro vývoj nových léků v brožuře z americké občanské války ** Jižanští felčaři podle ní připravovali rostlinné extrakty chránící rány před zánětem ** Výluhy ze tří dřevin zabírají i proti bakteriím rezistentním k antibiotikům

Jaroslav Petr | 2



Aktuální číslo časopisu Computer

Velký test Wi-Fi mesh

Nejlepší hodinky pro všechny aktivity

Důležité aplikace na cesty

Jak streamovat video na Twitch