c++ 2d array door geven

Pagina: 1
Acties:
  • 157 views sinds 30-01-2008
  • Reageer

  • Bpje
  • Registratie: November 2000
  • Laatst online: 11-08 09:17
Ik ben bezig met huiswerk maar kom ergens niet uit en heb een uit gebreide zoek tocht achter de rug :)

wat wil ik :

ik wil een 2d array mee geven aan een functie maar dan op zo'n manier dat ik hem nog kan aanpassen dus geen copie.
dat moet dus met pointers zo ver was ik ook al.
code:
1
2
3
4
5
6
7
8
9
int move(int& lijst)
{
  //doet iets met lijst
  // returnt ook nog iets 
}


int alijst[10][10];
move(**alijst);


mijn vraag is wat gaat er fout?

die ** is een gok omdat lijst een 2d array is maar onder bouwen kan ik het niet.
ver der wil ik nog graag weten hoe ik de lijst in de functie move kan aanspreken ?

  • whoami
  • Registratie: December 2000
  • Laatst online: 17:38
Een array geef je zowiezo al door by reference.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void GeefArrayDoor (int anArray[][]);

int main()
{
   int tabel[5][5];

   GeefArrayDoor(tabel);
}

void GeefArrayDoor (int tab[5][5])
{
   // HIer kun je elementen in de array gaan veranderen
   // en die wijzingen zullen ook in de main zichtbaar zijn.
}


(Misschien toch maar ff in jouw cursus/boek lezen...)

[ Voor 10% gewijzigd door whoami op 07-01-2003 20:21 ]

https://fgheysels.github.io/


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
En waarom is dat zo? Omdat int anArray[] feitelijk hetzelfde is als int* anArray :)

  • Bpje
  • Registratie: November 2000
  • Laatst online: 11-08 09:17
Tja das leuk maar dan maakt hij een copie van de array en dat wil ik niet hij moet gewoon de zelfde array gebruiken.

Verwijderd

Hoe kom je er bij dat ie een kopie maakt dan?

  • Postman
  • Registratie: Februari 2000
  • Laatst online: 15-08 20:11
By reference is wat jij zoekt. Een functie past iets aan in jouw array. Oplossing van whoami werkt perfect en is geen kopie hoor.

Je kunt ook nog iets returnen, maar waar dat dan weer goed voor is...

  • Bpje
  • Registratie: November 2000
  • Laatst online: 11-08 09:17
het programma wordt er prestatie gedreven dus is erg belangrijk dat het zo snel mogelijk gaat, maar ik zal ff klussen
:)

  • whoami
  • Registratie: December 2000
  • Laatst online: 17:38
Bpje schreef op 07 January 2003 @ 20:25:
Tja das leuk maar dan maakt hij een copie van de array en dat wil ik niet hij moet gewoon de zelfde array gebruiken.


Lees m'n reply nog eens goed.
Een array in C++ wordt niet by value doorgegeven, maar zowiezo by reference. (Dit is omdat het geheugenadres wordt doorgegeven v/h eerste element van de array. Wat de offset van de array is kan de compiler bepalen doordat hij de grootte van de array weet).

Pak dus toch maar eens uw C++ boek bij de hand...

https://fgheysels.github.io/


Verwijderd

Even kort :

Een array is niks anders dan een pointer(!) naar een geheugenblok.

als je die pointer doorgeeft naar een functie, en daar gebruik van maakt (dus door die pointer stukken geheugen gaat aanpassen), pas je dus wel degelijk het stuk geheugen aan van de originele array.

Ergo :
het verneukeratieve van een array is dat het lijkt op een 'gewone' variabele als een int,
maar het is gewoon een pointer.

  • whoami
  • Registratie: December 2000
  • Laatst online: 17:38
Bpje schreef op 07 januari 2003 @ 20:18:
ver der wil ik nog graag weten hoe ik de lijst in de functie move kan aanspreken ?


Euhm, hoe bedoel je?

Je wilt in uw functie de array die je doorgegeven hebt aanspreken?

Komop, dit is echt wel basic hoor...
code:
1
2
3
4
void functie ( int variabele )
{
   cout << variabele ;
}

https://fgheysels.github.io/


  • SWfreak
  • Registratie: Juni 2001
  • Niet online
en whoami heeft gelijk....
juist zou moeten zijn:
C:
1
2
3
4
5
6
7
8
void func( int lijst[][4] )
{
}
void main()
{
   int blaat[2][4];
   func(blaat);
}

Volgens mijn oude C-boek moet bij het doorgeven van een multi-dimensionale array minstens het aantal kolommen meegegeven worden. Je kunt ook int ** in je functie-declaratie doen.

Verwijderd

copie of geen copie ?? het is bijde waar

er wordt nl een copy van de pointer (array) zelf gemaakt bij het doorgeven aan de functie.
binnen die functie heb je dus een andere pointer (copie), maar die verwijst wel naar dezelfde data...
je maakt dus geen copie van de data zelf, maar wel een copie van de pointer die naar die data wijst :)

als je dat niet wil, zet er dan & voor:
code:
1
void functie(*&pointer);

  • Bpje
  • Registratie: November 2000
  • Laatst online: 11-08 09:17
Sorry maar ik al enige boeken geraad pleegd maar in mijn basic boek c++ kon ik niet vinden over 2d array's maar goed ik ben heel erg blij met deze reactie en kan er dus ook wat mee :)

whoami move is zeker niet bit shiften wat dat is zeker standaard :)

ik ben bezig met het spel reversi en die moet bepalen welke stenen je wel en niet mag zetten daar is de functie move voor.

  • Postman
  • Registratie: Februari 2000
  • Laatst online: 15-08 20:11
Verwijderd schreef op 07 januari 2003 @ 20:49:als je dat niet wil, zet er dan & voor:
code:
1
void functie(*&pointer);
Is ook duidelijker. Zo zie je meteen dat je gebruik maakt van een pointer (of reference, net welke taal je gebruikt heeft het beestje een naam).

  • whoami
  • Registratie: December 2000
  • Laatst online: 17:38
[nohtml]
Bpje schreef op 07 januari 2003 @ 20:52:

whoami move is zeker niet bit shiften wat dat is zeker standaard :)
:?
Ik snap niet wat je bedoeld... Op welke reactie van mij slaat dat?

https://fgheysels.github.io/


  • SWfreak
  • Registratie: Juni 2001
  • Niet online
Verwijderd schreef op 07 januari 2003 @ 20:49:
copie of geen copie ?? het is bijde waar

er wordt nl een copy van de pointer (array) zelf gemaakt bij het doorgeven aan de functie.
binnen die functie heb je dus een andere pointer (copie), maar die verwijst wel naar dezelfde data...
je maakt dus geen copie van de data zelf, maar wel een copie van de pointer die naar die data wijst :)
Als we het zo gaan bekijken weet ik er nog wel een. Als we jouw code (of de andere code) naar machine-instructies gaan omzetten, zal er echt niets verschillends gebeuren. In beide gevallen zal er een nieuwe referentie naar de pointer gebakken worden. *zucht*

  • Bpje
  • Registratie: November 2000
  • Laatst online: 11-08 09:17
whoami schreef op 07 januari 2003 @ 20:38:

[...]


Euhm, hoe bedoel je?

Je wilt in uw functie de array die je doorgegeven hebt aanspreken?

Komop, dit is echt wel basic hoor...
code:
1
2
3
4
void functie ( int variabele )
{
   cout << variabele ;
}
sorry ik dacht dat je dit typte om het move uit te leggen maar je streamt dit naar cout. mijn fout.

  • Bpje
  • Registratie: November 2000
  • Laatst online: 11-08 09:17
maar goed een array is dus standaard al by reference en dat kost mij dus weer bijna een avond. heel erg bedankt allemaal en ik zal mijn docent ff vragen wat hij nou bedoelde.

  • doggiedoggiedog
  • Registratie: December 2001
  • Laatst online: 25-01-2020
Koop gewoon een goed C++ boek
'Aan de slag met C++' bijvoorbeeld
Daarin wordt alles goed uitgelegd en ook twee dimensionale arrays

(Wellicht gebruik je dat boek al, en dan ligt het gewoon aan je intelligentie, daar kan ik je niet bij helpen)

[ Voor 5% gewijzigd door doggiedoggiedog op 07-01-2003 21:17 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 17:38
doggiedoggiedog schreef op 07 January 2003 @ 21:16:
Koop gewoon een goed C++ boek
'Aan de slag met C++' bijvoorbeeld
Daarin wordt alles goed uitgelegd en ook twee dimensionale arrays

(Wellicht gebruik je dat boek al, en dan ligt het gewoon aan je intelligentie, daar kan ik je niet bij helpen)


Mag ik je erop wijzen dat we van dit soort replies helemaal niet gediend zijn.
Als je iets weet dat bijdraagt tot een topic, zeg het dan, kan je niets positiefs bijdragen, zeg dan niets.
Dit soort replies verzieken alleen maar de sfeer en zeggen veel over jouw niveau.

https://fgheysels.github.io/


  • Bpje
  • Registratie: November 2000
  • Laatst online: 11-08 09:17
Tnx whoami
Maar ik ben zeker niet te beroerd om in de boeken te duiken maar c++ is gewoon niet iets Voor mij. Daar komt bij als een docent tegen je zegt dat dat efficenter kan dan wil ik dat graag geloven.

ik ben zelf meer iemand van de functionele programeer talen zoals amanda, prolog oid.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 17:14
Tsja, je kunt natuurlijk ook C achter je laten, en de "nieuwe" ( pas 10 jaar oud) C++ methode gebruiken:

vector< int > = 1D array van int
vector< vector< int > > = 1 array van 1D array van ints is 2D array van ints
vector< vector < int > >& = reference naar 2D array van ints.

en verder

vector<int>::size( ) = aantal ints in array.
element access via [index] of voor 2D [x][y], danwel vector<int>::at( index ) voor een bounds-checked versie.

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


  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
Stroustrop 3rd Edition [C++ the ONLY book IMHO] raad af ooit een & te gebruiken in een function declaratie. Want dan weet de gebruiker niet dat het oorspronkleijke object kan verandered worden...

dus niet

function a(int& anyObjcet){}; a(myObject);

maar

function b(int* anObject){}; b(&myObject);

en als je het niet gaat aanpassen natuurlijk const ervoor. Vectors' zijn best cool maar ik zou geen image erin steken aangezien een Vector van Vector een list van lists is. Een rauwe array (maakt niet uit hoe je hem definieert in C++/C) is gewoon een pointer waar je geheugen netjes naast elkaar zit. (en als het echt snel moet gaan elke horizontale lijn alignen op 32bits ;)

[ Voor 4% gewijzigd door hobbit_be op 07-01-2003 21:48 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 07 januari 2003 @ 20:37:
Even kort :

Een array is niks anders dan een pointer(!) naar een geheugenblok.

als je die pointer doorgeeft naar een functie, en daar gebruik van maakt (dus door die pointer stukken geheugen gaat aanpassen), pas je dus wel degelijk het stuk geheugen aan van de originele array.

Ergo :
het verneukeratieve van een array is dat het lijkt op een 'gewone' variabele als een int,
maar het is gewoon een pointer.


als het een pointer zou zijn zou je bijvoorbeeld array++ kunnen doen, maar dat is hier niet het geval

het kan wel als pointer, dan moet het zo:
C++:
1
2
3
4
void func (int (*array)[2])
{
    // ...
}


ok, je kunt een array zien als een pointer, maar het essentiele verschil is dat je van een pointer het adres op kunt vragen van het stukje geheugen waarin staat waar de pointer naar wijst (een pointer naar de pointer dus). Dat kan bij een array niet
SWfreak schreef op 07 januari 2003 @ 20:40:
Je kunt ook int ** in je functie-declaratie doen.
nee, een int ** is heel wat anders dan een int (*)[]. Een int ** wijst naar een int *, en dus is een int ** een lijst van pointers naar int. Je kunt een multidimensionale array ook niet converteren naar een int **
MSalters schreef op 07 januari 2003 @ 21:39:
Tsja, je kunt natuurlijk ook C achter je laten, en de "nieuwe" ( pas 10 jaar oud) C++ methode gebruiken:

vector< int > = 1D array van int
vector< vector< int > > = 1 array van 1D array van ints is 2D array van ints
vector< vector < int > >& = reference naar 2D array van ints.

en verder

vector::size( ) = aantal ints in array.
element access via [index] of voor 2D [x][y], danwel vector::at( index ) voor een bounds-checked versie.
ik houd niet van die oplossing, omdat je elke regel kunt instellen met een ander aantal kolommen, en is dus niet een vaste 2 dimensionale array. Ook is het geen continuous blok geheugen wat bijvoorbeeld wel handig is bij een framebuffer oid. Imho mist de STL een 2d vector constructie (geloof dat er wel iets voor in boost zat?)

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.


  • Eelis
  • Registratie: Januari 2003
  • Laatst online: 21-02-2015
.

[ Voor 100% gewijzigd door Eelis op 18-02-2015 19:48 ]


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 17:14
.oisyn schreef op 07 January 2003 @ 23:57:
Ook is het [ vector<vector< > > -ms] geen continuous blok geheugen wat bijvoorbeeld wel handig is bij een framebuffer oid. Imho mist de STL een 2d vector constructie (geloof dat er wel iets voor in boost zat?)
std::valarray is geen klassieke STL, maar zit wel in de STandard Library :)
Alleen is dat een wat ingewikkelde class, ik denk dat je die niet als framebuffer wilt gebruiken - al was het alleen maar omdat een framebuffer volatile zou moeten zijn.

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