...
pixIFS=createPixmap(410, 504); // libovolna velikost
drawPixmap(pixIFS); // vykresleni pixmapy
destroyPixmap(pixIFS);
drawPixmap(pixIFS);
pixIFS=createPixmap(200, 15); // libovolna velikost
drawPixmap(pixIFS); // vykresleni pixmapy
destroyPixmap(pixIFS);
drawPixmap(pixIFS);
...
tak zobrazení funguje..
Fórum › C / C++
Opengl - změna velikosti pixmapy
první příspěvek ignorujte ;).. takže
mám funkce:
Citovat:
//-----------------------------------------------------------------------------
// Funkce pro vytvoreni pixmapy o zadane velikosti
//-----------------------------------------------------------------------------
pixmap * OpenGL::createPixmap(const unsigned int width, const unsigned int height)
{
pixmap *p = new pixmap;
if (!p) return NULL;
p->width=width; // naplneni struktury
p->height=height;
p->pixels = new unsigned char [3*width*height];
if (!p->pixels) { // alokace pole pro pixely
delete p; // alokace se nepovedla
return NULL;
}
else {
memset(p->pixels, 0, 3*width*height); // smazani pixmapy
}
return p;
}
//-----------------------------------------------------------------------------
// Funkce pro zruseni pixmapy
//-----------------------------------------------------------------------------
void OpenGL::destroyPixmap(pixmap *p)
{
if (p->pixels) {
delete[] p->pixels; // uvolnit vlastni pixmapu
}
if (p) {
delete p; // i okolni strukturu
}
p = NULL;
}
//-----------------------------------------------------------------------------
// Funkce pro vykresleni pixmapy do barvoveho bufferu
//-----------------------------------------------------------------------------
void OpenGL::drawPixmap(const pixmap *p)
{
if (!p || !p->pixels) return;
glDrawPixels( // vykresleni pixmapy
p->width, p->height, // sirka a vyska pixmapy
GL_RGB, // format dat pixelu
GL_UNSIGNED_BYTE, // datovy typ kazde barevne slozky
p->pixels); // ukazatel na pamet s barvami pixelu
}
při překreslení zavolám:
Citovat:
...
pixIFS=createPixmap(width, height); // velikost okna
drawPixmap(pixIFS); // vykresleni pixmapy
destroyPixmap(pixIFS);
drawPixmap(pixIFS);
...
ale při změně velikosti okna zde aplikace spadne a nevím proč confused smiley.. tušíte někdo? přitom když zadám za sebou zobrazení dvou pixel map takto:
Citovat:
...
pixIFS=createPixmap(410, 504); // libovolna velikost
drawPixmap(pixIFS); // vykresleni pixmapy
destroyPixmap(pixIFS);
drawPixmap(pixIFS);
pixIFS=createPixmap(200, 15); // libovolna velikost
drawPixmap(pixIFS); // vykresleni pixmapy
destroyPixmap(pixIFS);
drawPixmap(pixIFS);
...
tak zobrazení funguje..
akosi nechapem tomuto:
pixIFS=createPixmap(width, height);
drawPixmap(pixIFS);
destroyPixmap(pixIFS); // < --- data su teraz dealokovane?
drawPixmap(pixIFS); // <--- tak potom wtf? :)
Ked predpokladam spravne a funkcia destroyPixmap uvolni pamet alokovanu funkciou createPixmap a funkcia drawPixmap k nej pristupuje, tak pritupovanie k pameti po jej uvolneni z velmy velkou pravdepodobnostou sposobi pad aplikacie.
Aha ty to chces zastavit tym tvojim "if(!p) return;". No to ti bohuzial nepomouze, kedze funkcia destryPixmap si spravi vlastnu kopiu pointera a tu nastavy na NULL => pointer pixIFS zostane nedktuty. Ked to chces takto tak musis zmenit funkciu takto:
void OpenGL::destroyPixmap(pixmap& *p) { ... }
To Wizard :
ne, to je muj překlep.. ta druhý volání funkce drawPixmap(pixIFS); je tam navíc..
zkoušel sem upravit destroy na:
void OpenGL::destroyPixmap(pixmap** p)
{
pixmap* map = *p;
if (map->pixels) {
//MessageBox(_T(""), _T(""), NULL);
delete[] map->pixels; // uvolnit vlastni pixmapu
}
if (map) {
delete map; // i okolni strukturu
}
*p = NULL;
}
ale nepomaha to.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Změna velikosti obrázku — založil Petr
Zmena velikosti formulare — založil
Změna velikosti pole — založil Martin
Změna velikosti obrázku — založil Arlene
Změna velikosti obrázků — založil Michal Š.
Moderátoři diskuze