1 van 1

[c++] maximum grootte array?

Geplaatst: zo 11 aug 2013, 00:05
door De Pianoman
Beste lezer,

ik ben bezig met een opdracht over image processing, en had bedacht dit eens in c++ te doen, om zo de taal beter te leren kennen. Ik heb wel wat ervaring met programmeren, en heb een course c++ gevolgd, maar merk regelmatig dat ik er nog niet echt in thuis ben.

Afijn, voor dit programma moet ik een plaatje inladen. Dit doe ik dmv het verkrijgen van de rgb waardes, die ik in een 3 dimensionale (byte) array wil zetten:

Code: Selecteer alles

uint8_t rgb[H][W][3];
waar H en W de hoogte en breedte van het plaatje zijn. Het programma werkt goed, totdat ik probeerde wat grotere plaatjes in te laden (op dit moment compiled de code, maar crasht het programma). Dit vond ik gek, want het lijkt me sterk dat dit aan een gebrek aan geheugen ligt. Om de oorzaak te vinden, heb ik in een leeg project wat geexperimenteerd met de initialisatie van de rgb array. Daarbij vond ik dat:

Code: Selecteer alles

unsigned char RGB[2082528];
Dit werkt nog wel.

Code: Selecteer alles

unsigned char RGB[2082529];
Op dit moment crasht het programma.

Maarrr, aangezien elke entry precies 1 byte in gebruik neemt, is deze array 'slechts' 2.08MB groot. Kan iemand mij vertellen wat hier het probleem is, en hoe ik dit eventueel kan oplossen (dynamic allocation met pointers oid (

Code: Selecteer alles

unsigned char*** RGB;
)?

Alvast bedankt

Re: [c++] maximum grootte array?

Geplaatst: zo 11 aug 2013, 02:19
door Benm
Vreemd inderdaad... het getal komt in de buurt van 2^21 maar zit daar toch wat ver onder om aan te nemen dat dat een beperkende factor zou zijn (niet dat ik zo 123 zie waarom dat zo zou moeten zijn, maar soms vallen dat soort getallen je op).

Ik zou eens proberen je code met een andere compiler te compileren, wellicht zit er gewoon iets niet goed in degene die je gebruikt.

Re: [c++] maximum grootte array?

Geplaatst: zo 11 aug 2013, 03:31
door Xenion
Iemand had hier een gelijkaardig probleem. De stack grootte aanpassen blijkt te werken (default schijnt slechts 1MB te zijn).

Re: [c++] maximum grootte array?

Geplaatst: zo 11 aug 2013, 08:50
door EvilBro
De stack grootte aanpassen blijkt te werken (default schijnt slechts 1MB te zijn).
Dat is in mijn ogen de verkeerde oplossing voor het probleem. Je gebruikt dan de stack voor iets waarvoor die niet ontworpen is. Bovendien gaat het dan weer mis als je een plaatje opent dat groter is dan jij voorzien had.

De oplossing is 'new' gebruiken om de benodigde ruimte te reserveren. Je kunt dan meteen mooi een check doen of het reserveren van de ruimte kan. Als dit niet het geval is dan kun je netjes melden dat er te weinig geheugen is (hoef je ook niet meer te crashen).

Re: [c++] maximum grootte array?

Geplaatst: zo 11 aug 2013, 10:57
door De Pianoman
EvilBro schreef: zo 11 aug 2013, 08:50
Dat is in mijn ogen de verkeerde oplossing voor het probleem. Je gebruikt dan de stack voor iets waarvoor die niet ontworpen is. Bovendien gaat het dan weer mis als je een plaatje opent dat groter is dan jij voorzien had.

De oplossing is 'new' gebruiken om de benodigde ruimte te reserveren. Je kunt dan meteen mooi een check doen of het reserveren van de ruimte kan. Als dit niet het geval is dan kun je netjes melden dat er te weinig geheugen is (hoef je ook niet meer te crashen).
Oke, dus wat je voorstelt is iets in de vorm van:

Code: Selecteer alles


uint8_t*** rgb;

rgb=new uint8_t**[H];

for (uint32_t i=0;i<H;i++)

{

   rgb[i]=new uint8_t*[W];

   for (uint8_t j=0;j<W;j++)

   {

  rgb[i][j]=new uint8_t[3];

   }

}

Andere kleine vraag: Hoe plaats ik een tab in een

Code: Selecteer alles

?  :oops:

Re: [c++] maximum grootte array?

Geplaatst: zo 11 aug 2013, 12:50
door Xenion
EvilBro schreef: zo 11 aug 2013, 08:50
Dat is in mijn ogen de verkeerde oplossing voor het probleem.
Daar heb je gelijk in.

@De Pianoman: ik typ meestal eerst code in iets als notepad++ en copy paste dat dan hier. Als je hier tabs wil typen, dan moet je de ascii code ervan kennen denk ik ;)