De Pianoman
Artikelen: 0
Berichten: 20
Lid geworden op: zo 18 mei 2008, 10:47

[c++] maximum grootte array?

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
Benm
Artikelen: 0
Berichten: 12.262
Lid geworden op: za 21 okt 2006, 01:23

Re: [c++] maximum grootte array?

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.
Victory through technology
Gebruikersavatar
Xenion
Artikelen: 0
Berichten: 2.609
Lid geworden op: za 21 jun 2008, 10:41

Re: [c++] maximum grootte array?

Iemand had hier een gelijkaardig probleem. De stack grootte aanpassen blijkt te werken (default schijnt slechts 1MB te zijn).
EvilBro
Artikelen: 0
Berichten: 7.081
Lid geworden op: vr 30 dec 2005, 09:45

Re: [c++] maximum grootte array?

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).
De Pianoman
Artikelen: 0
Berichten: 20
Lid geworden op: zo 18 mei 2008, 10:47

Re: [c++] maximum grootte array?

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:
Gebruikersavatar
Xenion
Artikelen: 0
Berichten: 2.609
Lid geworden op: za 21 jun 2008, 10:41

Re: [c++] maximum grootte array?

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 ;)

Terug naar “Informatica en programmeren”