Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  byte array jääb väikseks? märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
asjameez
Kreisi kasutaja
asjameez

liitunud: 10.12.2006




sõnum 23.05.2010 16:46:40 byte array jääb väikseks? vasta tsitaadiga

Kasutan GLubyte massiivi, et hoida arve 0-255 (terrain heightmap). Kuni 255x255 maastikuni toimib käik hästi, aga alates 256x256 jookseb programm kokku. Tundub, et pole rohkem ruumi andmeid rohkem salvestada.
GLuint ja GLfloat kasutades aga tekivad imelikud seosetud arvud massiivi.
Mis võimalused oleks 1024*1024 arvu hoida massiivis, mis algselt on unsigned byte tüüpi?

   GLubyte *data0 = new GLubyte[width*height*3 + 2]; // Piksli 3 värvi hoidmiseks
   GLubyte *data = new GLubyte[width*height + 2]; // Grayscale ehk lõplik massiiv
   ilCopyPixels(0, 0, 0, width, height, 1, IL_RGB, IL_UNSIGNED_BYTE, data0);
   ilDeleteImages(1, &texid);
   data[0] = width;
   data[1] = height;
   for(int i = 0; i < width*height*3; i+=3) {
      data[i/3 + 2] = 0.3 * data0[i] + 0.59 * data0[i+1] + 0.11 * data0[i+2];
   }
Kommentaarid: 63 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 61
tagasi üles
vaata kasutaja infot saada privaatsõnum
Ohohh
Kreisi kasutaja
Ohohh

liitunud: 13.09.2003




sõnum 23.05.2010 19:19:06 vasta tsitaadiga

Tee üks pointerite massiiv suurusega 0..1023, kus iga element viitab massiivile 0..1023, siis saadki 1024x1024 kuid mälu ei pea ühe tükina olema.
Kommentaarid: 6 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 6
tagasi üles
vaata kasutaja infot saada privaatsõnum
Supiplex
HV veteran
Supiplex

liitunud: 11.12.2002




sõnum 24.05.2010 10:05:04 vasta tsitaadiga

Massiivi võid sa teha ükskõik kui suure hoolimata sellest mis tüüpi elemendid seal sees on. Bool, byte, int, float - miski ei takista sind tegemast neist 1024*1024 massiivi kui mälu jagub. Muide - kas muutujad "width" ja "height" on 32-bitised? Kui nad on näiteks 16-bitised, siis tekib nende korrutamisel väike overflow.

Üldiselt kasutatakse selliste probleemide puhul debuggerit. Soovitan soojalt programm debuggeris käima tõmmata ja vaadata kas juhtuvad sellised asjad nagu sa ootad.

_________________
The young lady had an unusual list,
Linked in part to a structural weakness.
She set no preconditions.
Kommentaarid: 38 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 34
tagasi üles
vaata kasutaja infot saada privaatsõnum
Ho Ho
HV Guru
Ho Ho

liitunud: 16.02.2002




sõnum 24.05.2010 12:38:27 vasta tsitaadiga

Ohohh kirjutas:
Tee üks pointerite massiiv suurusega 0..1023, kus iga element viitab massiivile 0..1023, siis saadki 1024x1024 kuid mälu ei pea ühe tükina olema.
Tõsi kuid sellisel kujul on andmeid üsna keerukas videomällu transportida.

Muidu ühinen Supiplex'i arvamusega, kui width/height on midagi muud, kui 32bit int tüüpi siis tõenäoliselt tekib viga nonde overflow'ga.

Huvi pärast küsin, et miks massiivide loomisel on seal nood lisa +2 elementi? Kui kardad overflow pärast siis sellisel viisil sa lihtsalt peidad vigu kuigi peaks koodi kirjutama nii, et overflow'd ei saa tekkida.

_________________
Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity"
Kommentaarid: 106 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 86
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
asjameez
Kreisi kasutaja
asjameez

liitunud: 10.12.2006




sõnum 25.05.2010 09:40:34 vasta tsitaadiga

GLuint ongi 32-bit integer, GLubyte aga 8-bit integer. Tõsi, võtsid selle +2 maha ja midagi ei muutunud.
Kommentaarid: 63 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 61
tagasi üles
vaata kasutaja infot saada privaatsõnum
Ho Ho
HV Guru
Ho Ho

liitunud: 16.02.2002




sõnum 25.05.2010 09:56:53 vasta tsitaadiga

asjameez kirjutas:
GLuint ongi 32-bit integer, GLubyte aga 8-bit integer.
Seda küll kuid mis tüüpi on su width/height muutujad? Kui nad on gl(u)byte siis nende korrutamisel tekib overflow ning saadki vale suurusega massiivid.
_________________
Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity"
Kommentaarid: 106 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 86
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
asjameez
Kreisi kasutaja
asjameez

liitunud: 10.12.2006




sõnum 25.05.2010 10:06:35 vasta tsitaadiga

Ho Ho kirjutas:
asjameez kirjutas:
GLuint ongi 32-bit integer, GLubyte aga 8-bit integer.
Seda küll kuid mis tüüpi on su width/height muutujad? Kui nad on gl(u)byte siis nende korrutamisel tekib overflow ning saadki vale suurusega massiivid.

Pikkuse ja laiuse saan nii:
   GLuint width = ilGetInteger(IL_IMAGE_WIDTH);
   GLuint height = ilGetInteger(IL_IMAGE_HEIGHT);
Kommentaarid: 63 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 61
tagasi üles
vaata kasutaja infot saada privaatsõnum
Ho Ho
HV Guru
Ho Ho

liitunud: 16.02.2002




sõnum 25.05.2010 10:19:40 vasta tsitaadiga

Debuggerit proovisid et leida mis koha peal täpselt kokku jookseb? gcc'l ja msvc'l baseeruvad kompilaatorid-ide'd omavad kõik suht-koht asist debuggerit.
_________________
Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity"
Kommentaarid: 106 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 86
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
asjameez
Kreisi kasutaja
asjameez

liitunud: 10.12.2006




sõnum 25.05.2010 11:35:43 vasta tsitaadiga

GDB ei näita midagi.
Kommentaarid: 63 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 61
tagasi üles
vaata kasutaja infot saada privaatsõnum
Ho Ho
HV Guru
Ho Ho

liitunud: 16.02.2002




sõnum 25.05.2010 11:40:41 vasta tsitaadiga

kui crashib siis peab näitama. Kui ei näita siis kasutad gdb'd valesti.
_________________
Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity"
Kommentaarid: 106 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 86
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
THNS
HV vaatleja

liitunud: 12.05.2010




sõnum 25.05.2010 12:11:57 Re: byte array jääb väikseks? vasta tsitaadiga

Mälu küll ei tohiks puudu jääda, aga saad kindlaks teha selle kui paned "new" try catch blocki sisse.

   
try
{
GLubyte *data0 = new GLubyte[width*height*3 + 2]; // Piksli 3 värvi hoidmiseks
GLubyte *data = new GLubyte[width*height + 2]; // Grayscale ehk lõplik massiiv
}
catch( const std::bad_alloc& e )
{
//mälu otsas kuskil räme memory leak
}


Suurem tõenäosus on, et saad GL funktsioonides vastu pükse. Vaata compileri warningud üle!
tagasi üles
vaata kasutaja infot saada privaatsõnum
Supiplex
HV veteran
Supiplex

liitunud: 11.12.2002




sõnum 25.05.2010 13:01:13 vasta tsitaadiga

asjameez kirjutas:
GDB ei näita midagi.


Ei, oma tarkusest ta väga palju ei näita - kuigi karmi pange (exception või segfault) peale laseb vist vähemalt stacktrace välja. Sealt saab välja lugeda, mis kood täpselt ennast täis situb.

Debuggerit tuleb kasutada. Enimlevinud nipp on panna breakpoint umbkaudu paar rida enne seda koodi kus sa kahtlustad crashi (või kui stack trace on sulle täpse reanumbri öelnud, siis kasuta seda). Siis lased programmi debuggeris käima, mispeale ta lippab kuni breakpointini ja seiskub soovitud real. Seejärel jooksutad ühe rea haaval kuni leiad selle rea kus crash tegelikult toimub. See on esimene ja kõige kasulikum vihje vea leidmiseks. Reeglina on programm selleks hetkeks juba nii perses, et kohalikest muutujatest midagi head välja lugeda ei anna. Siis tuleb operatsiooni uuesti alustada ning seekord panna breakpoint vahetult enne crashi rida. Siis tuleb programm jooksutada sinnamaani ja uurida, mis tegelikult toimub enne kui pauk käib. Uurid kohalikke muutujaid, kui toimub mingi funktsiooni väljakutse siis kindlasti vaatad selle argumendid üle, astud sinna sisse ja vaatad mis toimub, kratsid kukalt jne.

_________________
The young lady had an unusual list,
Linked in part to a structural weakness.
She set no preconditions.
Kommentaarid: 38 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 34
tagasi üles
vaata kasutaja infot saada privaatsõnum
THNS
HV vaatleja

liitunud: 12.05.2010




sõnum 25.05.2010 13:29:52 vasta tsitaadiga

Teine asi mis mul meelde tuli on see, et kui muutuja width on unsigned char ja sa omistad talle väärtuse 256 siis mällu jääb väärtus 0 kuna unsiged char limiit on 0 - 255. Isegi kui ta ei ole unsiged char jama tekib ikkagi kui

data[0] = width;
tagasi üles
vaata kasutaja infot saada privaatsõnum
blinx
HV vaatleja

liitunud: 28.11.2009




sõnum 25.05.2010 15:21:37 Re: byte array jääb väikseks? vasta tsitaadiga

THNS kirjutas:
Mälu küll ei tohiks puudu jääda, aga saad kindlaks teha selle kui paned "new" try catch blocki sisse.

   
try
{
GLubyte *data0 = new GLubyte[width*height*3 + 2]; // Piksli 3 värvi hoidmiseks
GLubyte *data = new GLubyte[width*height + 2]; // Grayscale ehk lõplik massiiv
}
catch( const std::bad_alloc& e )
{
//mälu otsas kuskil räme memory leak
}


Suurem tõenäosus on, et saad GL funktsioonides vastu pükse. Vaata compileri warningud üle!


new võib throw-ida alles siis kui eraldatud mälu on "katsutud", st. kui tegelik alloc toimub.

_________________
'Just buy everything then you're safe'
tagasi üles
vaata kasutaja infot saada privaatsõnum
Ho Ho
HV Guru
Ho Ho

liitunud: 16.02.2002




sõnum 25.05.2010 15:27:49 vasta tsitaadiga

Enne kui new sul exceptioneid viskama hakkab on su kõvakettale tekitatud mõne giga jagu swap'i ning masin niigi suremise äärel. Exceptionitega mälu probleemide otsimine on üsna lootusetu üritus ning annab kasu ainult siis, kui on võimalus et pärid mälu liigsuurte tükkide kaupa. Kuigi sel puhul on lihtsal kontrollida, kas tagastati korralik pointer või null.
_________________
Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity"
Kommentaarid: 106 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 86
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
THNS
HV vaatleja

liitunud: 12.05.2010




sõnum 25.05.2010 15:42:13 vasta tsitaadiga

C++-s new ei tagasta kunagi null pointerit v.a siis kui sul on märgitud notthrow või new operaator on overloaditud.
tagasi üles
vaata kasutaja infot saada privaatsõnum
Ho Ho
HV Guru
Ho Ho

liitunud: 16.02.2002




sõnum 25.05.2010 16:00:13 vasta tsitaadiga

THNS kirjutas:
C++-s new ei tagasta kunagi null pointerit v.a siis kui sul on märgitud notthrow või new operaator on overloaditud.
Tõsi, kuid minu mäletamist mööda on defauldis notthrow sisse lülitatud ning, et new/delete hakkaks exceptioneid loopima tuleb need välja lülitada.
_________________
Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity"
Kommentaarid: 106 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 86
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
asjameez
Kreisi kasutaja
asjameez

liitunud: 10.12.2006




sõnum 25.05.2010 18:44:24 vasta tsitaadiga

THNS kirjutas:
Teine asi mis mul meelde tuli on see, et kui muutuja width on unsigned char ja sa omistad talle väärtuse 256 siis mällu jääb väärtus 0 kuna unsiged char limiit on 0 - 255. Isegi kui ta ei ole unsiged char jama tekib ikkagi kui

data[0] = width;

Tabasid naelapea pihta thumbs_up.gif cout'idega debugides jõudsin lõpuks sinnamaale. Veel pole aga leidnud moodust, mismoodi number 256 ja suuremad sinna data-massiivi saaks panna...
Kommentaarid: 63 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 61
tagasi üles
vaata kasutaja infot saada privaatsõnum
-ordi-
HV vaatleja

liitunud: 03.06.2009




sõnum 25.05.2010 19:18:52 vasta tsitaadiga

asjameez kirjutas:
THNS kirjutas:
Teine asi mis mul meelde tuli on see, et kui muutuja width on unsigned char ja sa omistad talle väärtuse 256 siis mällu jääb väärtus 0 kuna unsiged char limiit on 0 - 255. Isegi kui ta ei ole unsiged char jama tekib ikkagi kui

data[0] = width;

Tabasid naelapea pihta thumbs_up.gif cout'idega debugides jõudsin lõpuks sinnamaale. Veel pole aga leidnud moodust, mismoodi number 256 ja suuremad sinna data-massiivi saaks panna...


Miks sa gdb ei kasuta? Ise olen sellega KWini debuginud. Mis asi see cout'idega debuggimine on?
Gdb ise lambist ei näita midagi.
http://www.ibm.com/developerworks/library/l-gdb/
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
virus152
HV vaatleja
virus152

liitunud: 05.03.2009




sõnum 25.05.2010 20:25:38 vasta tsitaadiga

Ho Ho kirjutas:
THNS kirjutas:
C++-s new ei tagasta kunagi null pointerit v.a siis kui sul on märgitud notthrow või new operaator on overloaditud.
Tõsi, kuid minu mäletamist mööda on defauldis notthrow sisse lülitatud ning, et new/delete hakkaks exceptioneid loopima tuleb need välja lülitada.

Vastupidi, vaikimisi pillub erindeid ja nothrow'ga lülitad ümber.
http://www.cplusplus.com/reference/std/new/nothrow/
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
Ho Ho
HV Guru
Ho Ho

liitunud: 16.02.2002




sõnum 25.05.2010 21:58:47 vasta tsitaadiga

asjameez kirjutas:
Veel pole aga leidnud moodust, mismoodi number 256 ja suuremad sinna data-massiivi saaks panna...
Pigem on küsimus et miks sa tahad üldse hoida oma heightmap'is tollesama heightmap'i dimensioone. See karjub igast kandist "disainiviga".

Kui väga tahad ikkagi seal suuremaid väärtusi hoida siis on see võimalik kuid enne kui seletama hakkan tahaks kuulda põhjust miks seda tarvis on icon_smile.gif

_________________
Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity"
Kommentaarid: 106 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 86
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
asjameez
Kreisi kasutaja
asjameez

liitunud: 10.12.2006




sõnum 26.05.2010 09:34:48 vasta tsitaadiga

Lahedus leitud!

Tegin maasiku jaoks omakorda eraldi klassi 'Terrain'.
Ütlen Terrain klassile, et loe sisse heighmap pildist andmed. Andmed ning dimensioonid salvestatakse Terrain klassi muutujatesse.
Järmisena ütlen Terrain klassile, et joonista mulle maastik. Terrain klass joonistab siis eelnevalt salvestatud dimensioonide ja andmetega maasiku.

Tänud kõigile, kes lahenduse leidmisel kaasa aitasid thumbs_up.gif
Kommentaarid: 63 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 61
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  byte array jääb väikseks?
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.