Muistipalan luominen kuvaan
Author: Jare
Added: 9. huhtikuuta 2011 kello 22.21
Edited: 15. huhtikuuta 2011 kello 22.19
Category: Muisti
Description
Code
Select all1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | img = LoadImage("media/map.bmp")
img_mem = ModImage(img,50) 'Luodaan kuvaosoittimeen 50 tavua kooltaan oleva muistipala
PokeInt img_mem, 0, 333 'Ja heivataan kuvan "sisältämään" muistipalaan luku 333
Repeat
DrawImage img, 0,0
Text 0,0, PeekInt(GetImageMod(img),0) 'GetImageMod() palauttaa osoittimeen kuvaan taltioituun muistipalaan
DrawScreen
Forever
Function ModImage(img, memblock_size)
mem = MakeMEMBlock(memblock_size)
PokeInt img, 4, mem
Return mem
EndFunction
Function GetImageMod(img)
Return PeekInt(img, 4)
EndFunction
|
Comments
#41 Sent by: Jare, 30. heinäkuuta 2014 kello 2.41
Näin jälkeenpäin olen huomannut, että tässä on ihan perustavaa laatua oleva virhe. CoolBasic ei nimittäin säilö kuvaa muistipalaan. Ei ainakaan sillä tavalla, että kuvan tietoihin pääsisi käsiksi muistipalakomennoilla antamalla niille kuvan osoittimen.
Tämä koodi demonstroi ongelmaa:
img=LoadImage("media\map.bmp")
DeleteMEMBlock img
DrawImage img, 0,0
DrawScreen
WaitKey
Jos koodi toimisi oletetulla tavalla, ja kuvan tiedot löytyisivät muistipalasta, johon img osoittaa, tämän testiohjelman pitäisi kaatua MAV-ilmoitukseen muistipalan poistamisen vuoksi. Näin ei kuitenkaan käy, vaan kuva tulee näkyviin, vaikka se "poistettiin" DeleteMEMBlockilla.
Päätelmä: En voi enää suositella ModImagen käyttämistä. Se saattaa kirjoittaa dataa jonnekin, mihin sen ei pitäisi, ja siten se voi ainakin teoriassa aiheuttaa vaikka koneen kaatumisen. Omalla vastuulla siis ;).
#25 Sent by: skorpioni_cb, 4. tammikuuta 2012 kello 11.06
O_Q Siis todella MAHTAVA koodi.
Tulen käyttämään sitten kun palaan Javasta, C++, C takaisin CB