[C++] Dynamisch reserveren meerdimensionale arrays

Pagina: 1
Acties:

  • TheBorg
  • Registratie: November 2002
  • Laatst online: 23-04 16:45

TheBorg

Resistance is futile.

Topicstarter
Ik ben een QuickBasic applicatie (ja lach maar) aan het omzetten naar C++ en ik heb een probleempje. :)

Ik moet voor een onbepaald aantal audio kanalen een tabelletje maken:

code:
1
2
3
4
5
6
7
8
signed short    *buffer;

...
Header van de .WAV file lezen dus weet ik NumChannels
...


buffer = new signed short[65536][Header.NumChannels];

Krijg ik dit:

error C2540: non-constant expression as array bound
error C2440: '=' : cannot convert from 'short (*)[1]' to 'short *'

WTF? Kan ik een clue kopen?

[ Voor 5% gewijzigd door TheBorg op 24-11-2004 20:13 ]


  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022

Reveller

Hopla!

Via Google vind ik onder andere http://dbforums.com/t561831.html. Wellicht staat daar je antwoord al?
"I am having trouble dynamicly allocating
a 2d array of bytes. the compiler complains:

error C2540: non-constant expression as array bound
error C2440: '=' : cannot convert from 'unsigned char (*)[1]' to 'unsigned
char * Types pointed to are unrelated; conversion requires reinterpret_cast,
C-style cast or function-style cast

Can someone show me how to properly do this?"

[ Voor 96% gewijzigd door Reveller op 24-11-2004 20:25 ]

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Verwijderd

C++:
1
2
3
short** array2d;
array2d = new short*[10];
for(int i=0;i<10;++i) array2d[i] = new short[20];

maakt een 2d array van 10x20
delete moet ook met for loop

  • TheBorg
  • Registratie: November 2002
  • Laatst online: 23-04 16:45

TheBorg

Resistance is futile.

Topicstarter
Via hier http://www.parashift.com/...store-mgmt.html#faq-16.15
kom ik hier http://dbforums.com/t561831.html
en ik vroeg me dus af: Kan het ook simpel :P

Maar het moet dus idd zoals d0t zegt. Ff proberen.

-edit-

Het kan dus gelukkig wel simpel, omdat ik 1 van de dimensies voor het compilen al weet:

C++:
1
2
3
4
5
6
7
8
signed short    (*buffer)[65536];

...
Header van de .WAV file lezen dus weet ik NumChannels
...


buffer = new signed short[Header.NumChannels][65536];

[ Voor 40% gewijzigd door TheBorg op 24-11-2004 21:12 ]


  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
Waarom geen vector van vector's van short? Scheelt je for loops met new en delete:

C++:
1
2
3
typedef std::vector< std::vector<signed short> > bufType;

bufType buffer( 65536, bufType::value_type( Header.NumChannels));

Nu kun je gewoon buffer[x][y] gebruiken ( 0 <= x < 65536, 0 <= y < NumChannels).

Of gebruik een van de Matrix klasses die in de c++ faq(16.17 / 16.18) staan. Zorgen er (net als vectors) allemaal voor dat er geen geheugenlekken ontstaan doordat je vergeet te deleten.

"He took a duck in the face at two hundred and fifty knots."


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 15-05 06:45
_Squatt_: dat is rampzaling, nu alloceer je 65536 losse arrays van 4 bytes (of iets meer, maar meestal 4 als het om stereo wave files gaat) die allemaal niet aansluiten. Het lijkt me performance-gewijs echt veel beter om alle samples in een enkel blok geheugen te hebben.

  • TheBorg
  • Registratie: November 2002
  • Laatst online: 23-04 16:45

TheBorg

Resistance is futile.

Topicstarter
Meestal is een WAV file PCM en maar 2 kanalen, maarja, surround is tegenwoordig iets normaals en het is natuurlijk wel handig om vanaf het begin een onbeperkt aantal kanalen te ondersteunen zonder zinloze buffers te gebruiken.

Het is nu wel gelukt omdat 1 dimensie bekend was, heb je echter 2 onbekende dan wordt het een erg omslachtig gedoe, waar ik eigenlijk nog geen nette oplossing voor heb gezien.

  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
Soultaker schreef op woensdag 24 november 2004 @ 23:55:
_Squatt_: dat is rampzaling, nu alloceer je 65536 losse arrays van 4 bytes (of iets meer, maar meestal 4 als het om stereo wave files gaat) die allemaal niet aansluiten. Het lijkt me performance-gewijs echt veel beter om alle samples in een enkel blok geheugen te hebben.
Helemaal gelijk, daar had ik zo snel niet aan gedacht.

---
In de huidige oplossing van de TS wordt wel één blok geheugen gebruikt, maar nu heb je bijvoorbeeld 2 arrays van 65536 elementen. Nu liggen de waardes voor het linker en rechter kanaal 64K shorts van elkaar vandaan. Dat is zo ver ik weet ook niet ideaal voor je performance.
TheBorg schreef op donderdag 25 november 2004 @ 01:02:
Het is nu wel gelukt omdat 1 dimensie bekend was, heb je echter 2 onbekende dan wordt het een erg omslachtig gedoe, waar ik eigenlijk nog geen nette oplossing voor heb gezien.
De Matrix klasse uit c++ faq 16.17 biedt een aardige oplossing. Je kunt ook Boost.MultiArray gebruiken.

"He took a duck in the face at two hundred and fifty knots."


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Soultaker schreef op woensdag 24 november 2004 @ 23:55:
_Squatt_: dat is rampzaling, nu alloceer je 65536 losse arrays van 4 bytes (of iets meer, maar meestal 4 als het om stereo wave files gaat) die allemaal niet aansluiten. Het lijkt me performance-gewijs echt veel beter om alle samples in een enkel blok geheugen te hebben.
Omgedraaid is het natuurlijk precies wat je zoekt :) 4 arrays van 64K, een array per kanaal.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1