Login Register
Frontpage Code library Pastebin

Muistipalan luominen kuvaan

Author: Jare
Added: 9.4.2011 22:21
Edited: 15.4.2011 22:19
Category: Muisti

Description

ModImage()-funktiolla voit luoda muistipalan, jonka osoitin tallennetaan muistissa olevaan kuvaan. Toimenpiteen ei pitäisi haitata kuvan käyttöä mitenkään, mutta takuuta ei ole, koska laajaa testiä ei ole tehty. Tämän avulla voi laittaa kuviin lisätietoja, jotka normaalisti olisivat vaatineet oman rakenteensa, esimerkiksi tyypin.

Code

Select all
 1
 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

#25 Sent by: skorpioni_cb, 4.1.2012 11:06

O_Q Siis todella MAHTAVA koodi.
Tulen käyttämään sitten kun palaan Javasta, C++, C takaisin CB

#41 Sent by: Jare, 30.7.2014 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 ;).

Leave a comment

You must be logged in to comment.