abonnement Unibet Coolblue Bitvavo
pi_88188902
Je moet altijd bedenken dat de compiler moet kunnen afleiden hoeveel geheugen een object van je klasse inneemt. Een array als int[][] declareren gaat hem dus niet worden, want de compiler weet dan niet hoe groot de array is. Als je een array van niet van tevoren gedefinieerde grootte wilt aanmaken, moet je dat dus op de heap doen.

Met vectoren werken lijkt me dan het handigst. Wil je dat niet doen, dan zul je array als een int** moeten declareren, in de constructor array = new int*[y] doen en dan in een lus array[i] = new int[x] voor elke i. Vergeet ook niet een delete op al die zaken uit te voeren in je destructor. ;).
pi_88189693
Ik begrijp waarom mijn poging niet werkte, het was even een manier om duidelijk te maken wat ik wilde.

Persoonlijk wil ik ook liever vectoren gebruiken, maar de opdracht wenst dat er een array gebruikt wordt. Morgen toch maar even discussiėren met mijn docent.

Slimme oplossing, zo met de lus. Dat delete voorkomt dat er een memory leak plaatsvindt?

Om nog even andere oplossingen te overwegen. Een constante maken voor y en x, en die te gebruiken bij het declareren? Of een multidimensionale array meegeven als parameter in de constructor en dan op een of andere manier een nieuwe member aanmaken, die niet is gedeclareerd, als dit mogelijk is?

Iig bedankt voor je reactie(s).
pi_88190592
Ja, delete voorkomt memory leaks.

Een nieuwe member aanmaken kan niet, C++ is geen Python. :P. Je kan natuurlijk wel een pointer als member meegeven daar de meerdimensionale array aan plakken. Maar omdat je het type niet kent (hangt nl van de size af) zou dat een void* moeten worden, dat is denk ik nogal lelijk.
pi_88191261
Oke. Bedankt voor je antwoord.
  zondag 31 oktober 2010 @ 23:43:13 #155
58834 Catbert
The evil HR Director.
pi_88195771
quote:
Op zondag 31 oktober 2010 21:42 schreef FastFox91 het volgende:
Persoonlijk wil ik ook liever vectoren gebruiken, maar de opdracht wenst dat er een array gebruikt wordt. Morgen toch maar even discussiėren met mijn docent.
Die discussie ga je verliezen. Je 'moet' leren datastructuren als vectors e.d. zelf te maken, dat is een onderdeel van je opleiding. Je mag bij dit soort opdrachten nooit collections gebruiken.
"[...] a large number of the teenagers claiming Asperger's are, in fact, merely dicks."
pi_88202815
Je kan het als matrix opslaan, maar ook als een lijst van [x,y,waarde] triplets.
1
2
3
4
struct triplet
{
int x,y,waarde;
}
en dan simpelweg een 1-dimensionale array van deze triplets bijhouden en evt. vergroten wanneer nodig. :)

Anders zou ik je aanraden een matrix-classe te maken van een vaste grootte met een equals-operator om data over te zetten. Daarna een klasse maken die deze matrices weer gebruikt om een variabele grootte te realiseren:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
class Matrix
{
private:
   int* data;
   unsigned int width;
   unsigned int height;
public:
   unsigned int getWidth() const {return width;} 
   unsigned int getHeight() const {return height;}
   Matrix(unsigned int width, unsigned int height) : width(width), height(height) 
   {data = new int[width * height];}
   ~Matrix() {delete[] data;}

   int& get(unsigned int x, unsigned int y) {/* todo: check bounds */ return data[x + y * width];}
   void copyTo(Matrix& pMatrix) {/* for-next loops to copy data */} 
};

class VariableMatrix
{
   private:
   Matrix* MyMatrix;
   public:
   VariableMatrix() : MyMatrix(0) {}
   ~VariableMatrix() {delete MyMatrix;}
   Get(unsigned int x, unsigned int y) {/*check for zero*/ return MyMatrix.Get(x,y);}
   Set(unsigned int x, unsigned int y)
   {
      if (MyMatrix == 0 || x >= MyMatrix.GetWidth() || y >= MyMatrix.GetHeight())
      {
         Matrix* NewMatrix = new Matrix(x+1, y+1);
        if (MyMatrix) 
        {
          MyMatrix.copyTo(NewMatrix);
          delete MyMatrix;
          MyMatrix = NewMatrix;
        }
      }
   }
};
Let niet op m'n vreselijke stijl en alle fouten. want ik gebruik nu m'n persoonlijke- en werk-stijl doorelkaar.
pi_88213742
@Catbert
Je hebt gelijk gekregen. :P

@Cruise.Elroy
Dit gaat nog even wat te ver voor mijn niveau en is waarschijnlijk ook wel beetje te veel van het goede voor m'n opdracht. Waarschijnlijk zoek ik in de toekomst je post nog wel eens op.
pi_88241422
Ik zou er een linked list van matrices van maken denk ik. Krijg je echt enorm leuke code, en nog efficient in geheugengebruik ook. (alleen niet heel snel :P)
  dinsdag 2 november 2010 @ 11:44:52 #159
58834 Catbert
The evil HR Director.
pi_88241545
quote:
Op dinsdag 2 november 2010 11:41 schreef Cruise.Elroy het volgende:
Ik zou er een linked list van matrices van maken denk ik. Krijg je echt enorm leuke code, en nog efficient in geheugengebruik ook. (alleen niet heel snel :P)
Klinkt als een enorme teringzooi, maargoed. Als je een 2D array nodig hebt, moet je niet opeens met rare zaken gaan klooien.
"[...] a large number of the teenagers claiming Asperger's are, in fact, merely dicks."
pi_88241846
quote:
1s.gif Op dinsdag 2 november 2010 11:44 schreef Catbert het volgende:

[..]

Klinkt als een enorme teringzooi, maargoed. Als je een 2D array nodig hebt, moet je niet opeens met rare zaken gaan klooien.
Rare zaken? :D

Ik zou wss apart verticaal en horizontaal resizen afhandelen, en elk nieuw blok erbij in een linked list zetten. Elk blok kan je dan indexen als elke statische 2D array :)

[ Bericht 18% gewijzigd door Cruise.Elroy op 02-11-2010 17:54:31 ]
  woensdag 3 november 2010 @ 22:48:39 #161
189216 netolk
maar dan andersom
pi_88308544
quote:
1s.gif Op dinsdag 2 november 2010 11:53 schreef Cruise.Elroy het volgende:

[..]


Rare zaken? :D

Ik zou wss apart verticaal en horizontaal resizen afhandelen, en elk nieuw blok erbij in een linked list zetten. Elk blok kan je dan indexen als elke statische 2D array :)
Hoe maak je zo'n linked list dan?
Beware of the Raping Zebra's
  woensdag 3 november 2010 @ 23:28:06 #162
58834 Catbert
The evil HR Director.
pi_88310365
quote:
Op woensdag 3 november 2010 22:48 schreef netolk het volgende:

Hoe maak je zo'n linked list dan?
Dat bedoel ik dus...
"[...] a large number of the teenagers claiming Asperger's are, in fact, merely dicks."
pi_88314776
Oh kom op, een LL is naast een standaard array wel de meest basic manier van data opslaan.
http://en.wikipedia.org/wiki/Linked_list
  donderdag 4 november 2010 @ 10:03:32 #164
58834 Catbert
The evil HR Director.
pi_88317192
quote:
Op donderdag 4 november 2010 07:54 schreef Cruise.Elroy het volgende:
Oh kom op, een LL is naast een standaard array wel de meest basic manier van data opslaan.
http://en.wikipedia.org/wiki/Linked_list
Je hoeft mij niet te vertellen wat een linked list is. Het punt is dat hij voor z'n opleiding C++ aan het leren is, en net met arrays begint. Dan zou je moeten snappen dat hij A) de opdracht uit moet voeren zoals beschreven en B) we het niet onnodig complex moeten maken.
"[...] a large number of the teenagers claiming Asperger's are, in fact, merely dicks."
pi_88317516
Ik vind het wel raar hoor, dat mensen eerst met programmeertalen beginnen en daarna pas met algoritmen en datastructuren. Andersom zou beter zijn.
  donderdag 4 november 2010 @ 10:25:41 #166
58834 Catbert
The evil HR Director.
pi_88317847
quote:
Op donderdag 4 november 2010 10:14 schreef thabit het volgende:
Ik vind het wel raar hoor, dat mensen eerst met programmeertalen beginnen en daarna pas met algoritmen en datastructuren. Andersom zou beter zijn.
Het is wat lastig practicumopdrachten uit te voeren als je geen taalen kent waarin je dat uitvoeren kunt doen. Je kunt zoveel theorie leren, maar een DSW tree kunnen implementeren zul je toch echt gewoon een keer moeten doen om 't te snappen.

Ik heb zelf HBO-I gedaan en wij hadden destijds het probleem dat de het praktijkdeel van het vak C++ verplaatst hadden naar het vak Algorithmen. En toen was opeens de docent C++ ziek en mochten we implementaties van Algorithmen (Huffman / LZW) in C++ doen terwijl we daar nog geen les in hadden gehad. Dat ging ongeveer zo:

CODERDECODE
*compile*
execute!
"SEGMENTATION FAULT. CORE DUMPED"

Wut?
"[...] a large number of the teenagers claiming Asperger's are, in fact, merely dicks."
pi_88318408
Praten jullie nog steeds over dat probleempje van mij? :P
Heeft C++ geen interessantere, van hoger niveau, onderwerpen waarover te discussiėren valt?
  donderdag 4 november 2010 @ 10:51:26 #168
58834 Catbert
The evil HR Director.
pi_88318558
quote:
Op donderdag 4 november 2010 10:45 schreef FastFox91 het volgende:
Praten jullie nog steeds over dat probleempje van mij? :P
Heeft C++ geen interessantere, van hoger niveau, onderwerpen waarover te discussiėren valt?
Nee, C++ is gewoon saai.

;)
"[...] a large number of the teenagers claiming Asperger's are, in fact, merely dicks."
  donderdag 4 november 2010 @ 11:22:20 #169
189216 netolk
maar dan andersom
pi_88319527
quote:
1s.gif Op donderdag 4 november 2010 07:54 schreef Cruise.Elroy het volgende:
Oh kom op, een LL is naast een standaard array wel de meest basic manier van data opslaan.
http://en.wikipedia.org/wiki/Linked_list
Ow heet dat zo XD
Beware of the Raping Zebra's
  maandag 8 november 2010 @ 23:12:16 #170
189216 netolk
maar dan andersom
pi_88497254
Even een vraagje wat kost een lege vector aan geheugen? is dit niks of is dit wel wat en afhankelijk van wat de vector stored?
Beware of the Raping Zebra's
pi_88499273
Elk object neemt geheugen in. Hoeveel precies hangt van de implementatie van vector af en is niet door de standaard gedefinieerd. Maar ik neem aan dat een vector toch in elk geval z'n lengte zal opslaan, een pointer naar de beginwaarde en bovendien een stukje geheugen reserveert om dingen in te stoppen (je wil namelijk niet elke keer als je iets in die vector stopt een nieuw stuk geheugen moeten vrijmaken om vervolgens je oude vector daarheen te verplaatsen).
pi_88503575
bron: http://social.msdn.micros(...)5b-a739-5cd311bc21c4

quote:
tried spelunking in STL code that comes with VS2008 SP1 (a.k.a. VC9).

Considering debug builds as per your request, I came to the following conclusions:

In both cases of iterator debugging feature (i.e. _HAS_ITERATOR_DEBUGGING) being enabled or disabled:

1. vector has 3 data members, all pointers. In 32-bit systems, each pointer is 4 bytes, so they occupy 3*4 = 12 bytes.

2. vector is derived from _Vector_val class. This class has an _Alval data member, which is 1 byte big.
However, for alignment reasons, the size cost is rounded to 4 bytes.

So, you have 12 bytes (from 3 vector's pointers) + 4 bytes (from _Vector_val::_Alval) = 16 bytes subtotal.

Now, let's go to sub-cases of iterator debugging feature enabled or disabled.

If iterator debugging feature is enabled:
3a. _Vector_val derives from _Container_base_secure. _Container_base_secure has a data member _Myfirstiter, which is a pointer, so add 4 bytes.
The total becomes: 16 + 4 = 20 bytes (as per your finding).

If iterator debugging feature is disabled:
3b. _Vector_val derives from _Container_base_aux_alloc_real. _Container_base_aux_alloc_real has one data member. Its size is 1 byte, but for alignment reasons rounds up to 4 bytes.
4b. _Container_base_aux_alloc_real derives from _Container_base_aux. _Container_base_aux has one data member _Myownedaux, which is a pointer; so: add 4 bytes.
In this case the total becomes: 16 + 4 + 4 = 24 bytes (as per your finding).

You may want to try this simple C++ program I wrote to try to better understand the total size of STL vector.
Ik heb nog wat lopen spitten, en het lijkt dat er minstens 4 bytes verloren lijken te gaan, iig 3 jaar geleden nog wel ;).
Leesvoer: http://blogs.msdn.com/b/f(...)ector-data-size.aspx

Wat ik er zelf van weet: elke vector heeft sowieso 3 pointers, de MyFirstIter kan je met elke intellisense-GUI ook wel zien staan, dus dat maakt 16 bytes. Waarom de _Aval 1 byte is weet ik niet want het is een stateloos object.

[ Bericht 4% gewijzigd door Cruise.Elroy op 09-11-2010 10:49:53 ]
  dinsdag 9 november 2010 @ 13:34:40 #173
189216 netolk
maar dan andersom
pi_88513263
oke bedankt voor de info... Bedacht later hčhč dat ik het ook via sizeof had kunnen weten |:(

@Cruise.Elroy txs voor de extra info
Beware of the Raping Zebra's
pi_88514318
sizeof laat natuurlijk alleen de ruimte zien die het object zelf inneemt, niet de extra geheugenruimte die het reserveert.
pi_88514475
quote:
4s.gif Op dinsdag 9 november 2010 14:00 schreef thabit het volgende:
sizeof laat natuurlijk alleen de ruimte zien die het object zelf inneemt, niet de extra geheugenruimte die het reserveert.
Je mag van STL verwachten dat een lege container geen heap gaat aanspreken.
Grappig genoeg gebeurt dit wel op de PS3 of X360 (weet niet meer welke)
abonnement Unibet Coolblue Bitvavo
Forum Opties
Forumhop:
Hop naar:
(afkorting, bv 'KLB')