Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[C++] Multidimensionele array van onbekende grootte

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik kom even ergens niet meer uit,

ik wil in C++ een raster maken, de grote van dit raster is van te voren nog niet bekend. Hier voor wil ik een 2 dimensioneel array gebruiken, bijv. .. raster[x][y], aangezien de raster grootte nog niet bekend is moet deze dynamisch worden toegewezen. Nu weet ik hoe ik dit moet voor een enkele array maar niet voor meerdere, bijv...

C++:
1
2
3
4
5
int * raster;
int x, y;
x = 5; y = 5;

raster = new int  [x][y];


...werkt niet, ik weet dat het niet hoort te werken, maar hoe moet het dan wel?

  • KopjeThee
  • Registratie: Maart 2005
  • Niet online
zoiets?:

code:
1
2
3
4
5
6
7
8
9
int ** raster; 
int x, y; 
x = 5; y = 5; 

raster = new int*[x];

for (int i = 0; i < x; ++i) {
   raster[i] = new int[y];
}


Wel weer even netjes de boel opruimen.

  • dawuss
  • Registratie: Maart 2001
  • Laatst online: 24-11 12:28

dawuss

gadgeteer

Is de grootte van de dimensies tijdens compile time wel bekend? Of gaat deze pas tijdens runtime bepaald worden?

Anders kun je namelijk altijd iets als:

C++:
1
2
3
4
5
6
int * raster; 

#DEFINE x 5
#DEFINE y 5 

raster = new int  [x][y];


Als het pas tijdens runtime wordt bepaald (als het user input is bijvoorbeeld) zul je met een andere datastructuur moeten werken dan een array. Denk daarbij bijvoorbeeld aan een linked list van linked lists oid.

micheljansen.org
Fulltime Verslaafde Commandline Fetisjist ©


  • Jehjoa
  • Registratie: September 2007
  • Laatst online: 30-10 09:04
Hmm volgens mij kan het ook zo:

C++:
1
2
3
4
5
6
7
8
9
10
11
int * piRaster = 0;
int x = 5;
int y = 5;

piRaster = new int[x*y];

for (int iXCount = 0; iXCount < x; iXCount++) {
   for (int iYCount = 0; iYCount < y; iYCount++) {
      *(piRaster + iXCount * iYCount) = 1337; // of wat dan ook ;-)
   }
}

Verwijderd

Topicstarter
Nee de grote van de dimensies zijn niet bekent voor het compilen, ze owrden aangeleverd door een apart proces, maar de code van KopjeThee werkt,

Erg bedankt!

  • Count
  • Registratie: Augustus 2000
  • Laatst online: 10-08-2023
dawuss schreef op vrijdag 07 september 2007 @ 16:33:Als het pas tijdens runtime wordt bepaald (als het user input is bijvoorbeeld) zul je met een andere datastructuur moeten werken dan een array. Denk daarbij bijvoorbeeld aan een linked list van linked lists oid.
Ook als je de afmetingen tijdens runtime wil wijzigen is dat niet nodig. Je kan nog steeds prima arrays gebruiken, je allocate gewoon een 2e array met de nieuwe dimensies en kopieert de oude elementen over. Daarna free je je ouwe array en laat je de pointer naar de 2e array wijzen.

[ Voor 5% gewijzigd door Count op 07-09-2007 16:44 ]

Great minds think in parallel gutters.


Verwijderd

Topicstarter
Jehjoa schreef op vrijdag 07 september 2007 @ 16:40:
Hmm volgens mij kan het ook zo:

C++:
1
2
3
4
5
6
7
8
9
10
11
int * piRaster = 0;
int x = 5;
int y = 5;

piRaster = new int[x*y];

for (int iXCount = 0; iXCount < x; iXCount++) {
   for (int iYCount = 0; iYCount < y; iYCount++) {
      *(piRaster + iXCount * iYCount) = 1337; // of wat dan ook ;-)
   }
}
daar zat ik ook aan te denken, maar dat brengt problemen in deze situatie:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int * piRaster = 0; 
int x = 5; 
int y = 5; 
 
piRaster = new int[x*y]; 

// Edit; dit is dan niet nodig hè :) 
//for (int iXCount = 0; iXCount < x; iXCount++) { 
//   for (int iYCount = 0; iYCount < y; iYCount++) { 
//   }  

}
piRaster[2*1] = 2222;
piRaster[1*2] = 3333;

cout << piRaster[2*1] << ", " << piRaster[1*2];


(output 3333, 3333)

[ Voor 6% gewijzigd door Verwijderd op 07-09-2007 16:49 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 30-11 20:54

.oisyn

Moderator Devschuur®

Demotivational Speaker

Jehjoa schreef op vrijdag 07 september 2007 @ 16:40:
Hmm volgens mij kan het ook zo:

C++:
1
2
3
4
5
6
7
8
9
10
11
int * piRaster = 0;
int x = 5;
int y = 5;

piRaster = new int[x*y];

for (int iXCount = 0; iXCount < x; iXCount++) {
   for (int iYCount = 0; iYCount < y; iYCount++) {
      *(piRaster + iXCount * iYCount) = 1337; // of wat dan ook ;-)
   }
}
Je indexering is verkeerd. Uiteraard moet je niet x*y doen, maar y*width+x (of x*height+y, afhankelijk van hoe je de layout het liefst hebt... de eerste is gebruikelijk)

Of je gebruikt gewoon boost::multi_array

[ Voor 8% gewijzigd door .oisyn op 07-09-2007 17:07 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 07:48
Als alternatief kun je ook gebruik maken van vectoren:

C++:
1
vector<vector<int>> raster;


Omdat vector de [] operator overload kun je ze gewoon benaderen als array:
C++:
1
cout << raster[1][0];


Bovendien hoef je je dan niet druk te maken over het alloceren. Als je de []- operator gebruikt met een index groter dan de huidige grootte van de vector, dan wordt hij automatisch vergroot.

Grrr, ik dacht dat vector dat ook deed, maar daar moet je dus eerst een resize() doen, of natuurlijk initialiseren met een bepaalde grootte.

[ Voor 15% gewijzigd door Jaap-Jan op 07-09-2007 17:46 ]

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 30-11 20:54

.oisyn

Moderator Devschuur®

Demotivational Speaker

Jaap-Jan schreef op vrijdag 07 september 2007 @ 16:55:
Bovendien hoef je je dan niet druk te maken over het alloceren. Als je de []- operator gebruikt met een index groter dan de huidige grootte van de vector, dan wordt hij automatisch vergroot.
En dat klopt dus niet :). Wellicht ben je in de war met std::map, die met de [] operator automatisch het element aanmaakt als het niet bestaat.

[ Voor 15% gewijzigd door .oisyn op 07-09-2007 16:58 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Jehjoa
  • Registratie: September 2007
  • Laatst online: 30-10 09:04
.oisyn schreef op vrijdag 07 september 2007 @ 16:50:Je indexering is verkeerd. Uiteraard moet je niet x*y doen, maar y*width+x (of x*height+y, afhankelijk van hoe je de layout het liefst hebt... de eerste is het gebruikelijkst)
Je hebt helemaal gelijk. Dat krijg je als je nachten overslaat... :z

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

maar toch moet je je niet druk maken om allocatie:

C++:
1
std::vector< std::vector<int> > array(y, std::vector<int>(x,0));


en je hebt een array van 'y' rijen en 'x' kolommen, geinitialiseerd op 0.

ASSUME makes an ASS out of U and ME

Pagina: 1