Springen naar inhoud

[c++] maximum grootte array?


  • Log in om te kunnen reageren

#1

De Pianoman

    De Pianoman


  • 0 - 25 berichten
  • 20 berichten
  • Gebruiker

Geplaatst op 10 augustus 2013 - 23:05

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:

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:

unsigned char RGB[2082528];
Dit werkt nog wel.
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 (
unsigned char*** RGB;
)?

Alvast bedankt

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

Benm

    Benm


  • >5k berichten
  • 8811 berichten
  • VIP

Geplaatst op 11 augustus 2013 - 01:19

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

#3

Xenion

    Xenion


  • >1k berichten
  • 2606 berichten
  • Moderator

Geplaatst op 11 augustus 2013 - 02:31

Iemand had hier een gelijkaardig probleem. De stack grootte aanpassen blijkt te werken (default schijnt slechts 1MB te zijn).

#4

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 11 augustus 2013 - 07:50

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

#5

De Pianoman

    De Pianoman


  • 0 - 25 berichten
  • 20 berichten
  • Gebruiker

Geplaatst op 11 augustus 2013 - 09:57

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:


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=auto:0]? :oops:

#6

Xenion

    Xenion


  • >1k berichten
  • 2606 berichten
  • Moderator

Geplaatst op 11 augustus 2013 - 11: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 ;)





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures