[C++] Functie die array als referentie aflevert

Pagina: 1
Acties:

  • iets
  • Registratie: Maart 2002
  • Laatst online: 07-05 22:28
Ik loop nu een tijdje te worstelen met een void die een array moet afleveren aan de main.

C++:
1
void controle (bool input[], bool& output[]);


Alleen dit pikt hij dus niet: error C2234: 'output' : arrays of references are illegal. Alleen ik moet toch echt een array in die void gooien en een andere (gecontroleerde :P ) array terugkrijgen.

Met [google=c++ array void] en [google=c++ array void reference] kan ik 0.0 vinden omdat dat zich vooral richt op een array van main naar void zetten en niet andersom.

Hoe zou ik dit kunnen aanpakken?

tvw


  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

Ik snap niet precies wat je bedoelt.. Gokje:
Je wil een void functie met een (statische) input en je wil een pointer meegeven waarin de output wordt weggeschreven. Moet je dan niet zoiets gebruiken:
C++:
1
void controle (bool input[], bool *output);

:?

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
iets schreef op woensdag 20 april 2005 @ 22:21:
Ik loop nu een tijdje te worstelen met een void die een array moet afleveren aan de main.

C++:
1
void controle (bool input[], bool& output[]);


Alleen dit pikt hij dus niet: error C2234: 'output' : arrays of references are illegal. Alleen ik moet toch echt een array in die void gooien en een andere (gecontroleerde :P ) array terugkrijgen.
Als je een array als parameter meegeeft, dan is dit niks anders dan een pointer naar het 0e element. Een reference is ook niks anders dan een pointer, alleen met impliciete dereference. Ergo, dit voldoet gewoon, na aanroep van controle() zal output[] (ook voor main) de gewijzigde waarden hebben* :

C++:
1
void controle (bool input[], bool output[]);


Trouwens, zie je de foutmelding die de compiler geeft? Je declareert daar een array van references naar bools, niet een reference naar een array van bools. Als je de MSDN docs hebt, zoek eens naar het artikel "interpreting more complex declarators" (of zoek ze op via internet).

* = tenzij je realloc() gebruikt of op een andere manier de array verplaatst, dan heb je idd een probleem. Maar in dat geval wil je waarschijnlijk toch eerder de std::vector gebruiken dan een array.

  • iets
  • Registratie: Maart 2002
  • Laatst online: 07-05 22:28
Eeh ik bedoel eigenlijk zoiets:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void invert (bool input[], bool& output[]);

int main()
{
    bool bits[8] = { 1, 0, 1, 0, 1, 0, 1, 0 };
    bool bitsInverted[8];

    invert (bits, bitsInverted);
}

void invert (bool input[], bool& output[])
{
    for (int i = 0; i < 8; i++)
    {
        output[i] = !input[i];
    }
}


Bij dit stukje code zou dus de bits[] array geinvert in de bitsinverted[] array moeten komen. Alleen c++ kan bool& output[] niet. Blijkbaar kun je geen array op deze manier naar int main() krijgen. Nu kan ik bv. wel bool& input1, bool& input2, bool& input3, etc invoeren maar ik vroeg me af of het makkelijker kon.

/edit: Ok ik ben even bezig met het analyseren van de post van MrBucket...

/edit2: sorry type foutje

[ Voor 18% gewijzigd door iets op 20-04-2005 23:35 ]

tvw


  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

Dat kan wel.. Ik denk dat je C++ nog niet helemaal doorhebt.. Waarom gebruik je
C++:
1
void invert (bits, bitsInverted);

Wat doet die void daar? Die mag weg iig. Verder, zoals MrBucket zegt, een het meegeven van een array als parameter niks anders dan het meegeven van een pointer naar het eerste element in die array. Dus, gewoon bool *output of bool output[].

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Radiant schreef op woensdag 20 april 2005 @ 23:31:
Dat kan wel.. Ik denk dat je C++ nog niet helemaal doorhebt.. Waarom gebruik je
C++:
1
void invert (bits, bitsInverted);

Wat doet die void daar? Die mag weg iig.
Niet helemaal. Jouw c++ code mist de types van bits en bitsInverted, en de 'void' mag niet weg. Elke functie behoort een return-value te hebben, zo ook functies die niks returnen: het type 'void'.
Verder, zoals MrBucket zegt, een het meegeven van een array als parameter niks anders dan het meegeven van een pointer naar het eerste element in die array. Dus, gewoon bool *output of bool output[].
Klopt, "bool *output" is equivalent aan "bool output[]" (behalve misschien voor de debugger).

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Radiant schreef op woensdag 20 april 2005 @ 23:31:
Dat kan wel.. Ik denk dat je C++ nog niet helemaal doorhebt.. Waarom gebruik je
C++:
1
void invert (bits, bitsInverted);

Wat doet die void daar? Die mag weg iig.
Psst, forward declaratie. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • iets
  • Registratie: Maart 2002
  • Laatst online: 07-05 22:28
Bedankt voor al jullie hulp, het werkt nu goed :D.

Ik vind het nog wel een beetje vaag, maar dat komt waarschijnlijk omdat ik met mijn studie (nog) geen pointers heb behandeld.

C++:
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
#include <iostream>
using namespace std;

void invert (bool input[], bool* output);

int main()
{
    bool bits[8] = { 1, 0, 1, 0, 1, 0, 1, 0 };
    bool bitsInverted[8];

    invert (bits, bitsInverted);

    for (int i = 0; i < 8; i++)
    {
        cout << bitsInverted[i] << endl;
    }
    
    cin.get();
    return 0;
}

void invert (bool input[], bool* output)
{
    for (int i = 0; i < 8; i++)
    {
        output[i] = !input[i];
    }

Deze code werkt dus mooi zoals hij het hoort te doen.

tvw


  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

MrBucket schreef op woensdag 20 april 2005 @ 23:34:
[...]

Niet helemaal. Jouw c++ code mist de types van bits en bitsInverted, en de 'void' mag niet weg. Elke functie behoort een return-value te hebben, zo ook functies die niks returnen: het type 'void'.
-NMe- schreef op woensdag 20 april 2005 @ 23:39:
[...]

Psst, forward declaratie. ;)
Ik doelde dus op de aanroep van die functie, het prototype moet inderdaad een return type en types van de argumenten specificeren (en dat heeft hij ook gedaan). Hij had het kennelijk later zelf door en heeft het weggeedit, klein misverstandje.

[ Voor 20% gewijzigd door Radiant op 21-04-2005 07:46 ]


  • Daos
  • Registratie: Oktober 2004
  • Niet online
iets schreef op woensdag 20 april 2005 @ 23:54:
Bedankt voor al jullie hulp, het werkt nu goed :D.

Ik vind het nog wel een beetje vaag, maar dat komt waarschijnlijk omdat ik met mijn studie (nog) geen pointers heb behandeld.

C++:
1

Deze code werkt dus mooi zoals hij het hoort te doen.
Als je even alle berichten gelezen had, dan zag je dat het ook zonder pointers kan:
MrBucket schreef op woensdag 20 april 2005 @ 23:13:
[...]

Als je een array als parameter meegeeft, dan is dit niks anders dan een pointer naar het 0e element. Een reference is ook niks anders dan een pointer, alleen met impliciete dereference. Ergo, dit voldoet gewoon, na aanroep van controle() zal output[] (ook voor main) de gewijzigde waarden hebben* :

C++:
1
void controle (bool input[], bool output[]);

  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

Lees jij ook eens ff ;) Dat is dus ook een pointer. En wat is er zo slecht aan pointers gebruiken?
"bool *output" is equivalent aan "bool output[]" (behalve misschien voor de debugger).

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 19:34

.oisyn

Moderator Devschuur®

Demotivational Speaker

MrBucket schreef op woensdag 20 april 2005 @ 23:34:
Klopt, "bool *output" is equivalent aan "bool output[]" (behalve misschien voor de debugger).
Nee, T[] is helemaal niet equivalent aan T*, dat geldt slechts voor parameters in functies. T[] is een incomplete type, wat prima is voor parameters, declaraties en template arguments, maar wel essentieel anders dan een T*. typeid(T[]) != typeid(T*)

.reactie op bericht onder deze:
In deze context wel ja, maar je opmerking was nogal ongenuanceerd ;)

[ Voor 11% gewijzigd door .oisyn op 21-04-2005 10:47 ]

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.


  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Radiant schreef op donderdag 21 april 2005 @ 08:42:
Lees jij ook eens ff ;) Dat is dus ook een pointer. En wat is er zo slecht aan pointers gebruiken?

[...]
De enige reden om "bool output[]" te prefereren boven "bool *output" is dat het bij de eerste declaratie voor de programmeur duidelijk is dat het om een array gaat. Bij de tweede declaratie zie je alleen dat je een bool "aanwijst", maar niet of je alleen in die bool bent geinteresseerd, of ook in de bools die erop volgen.

@.oisyn: in deze context zijn de twee declaraties gelijk, iig.

[ Voor 10% gewijzigd door MrBucket op 21-04-2005 10:40 ]

Pagina: 1