[C++] functie

Pagina: 1
Acties:

  • Spike_wolf
  • Registratie: Maart 2003
  • Laatst online: 14:43

Spike_wolf

Genius Or Madman?.. You Decide

Topicstarter
Okay, ik loop nu al een tijdje te k*tten met C++ en een funcitie maar het wil me maar niet lukken (hoogstwaarschijnlijk omdat ik op een n00b manier iets heel doms over het hoofd zie of vergeet ofzo :P ).

Ik heb dus een progje dat de oppervlakten van een aantal opgegeven maten moet uitrekenen.
maar dit moet met een functie gebeuren, zodat ik voor het uitrekenen van 2 verschillende dingen (wel gelijkwaardig) maar één functie hoef te gebruiken.. maar t wil nie helemaal werken zoals ik wil :P.

code:
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
41
#include <iostream.h>


void bereken(int, int, int, int);

void main()
{
     
    long  deur1, deur2, aantaldeur, oppervlakdeur;


    cout << "Hoe hoog word een deur? [in cm]" <<endl;
    cin >> deur1;
    
    cout << "Hoe breed word een deur? [in cm]" <<endl;
    cin >> deur2;
    
    cout << "Hoeveel deuren komen er in het huis?" <<endl;
    cin >> aantaldeur;
    cin.get();

    oppervlakdeur = bereken(deur1,deur2,aantaldeur, oppervlakdeur);

    cout <<endl;
    cout << "================================================="<<endl;
    cout << "Het oppervlakte van de deuren is " <<oppervlakdeur <<" cm2" <<endl;
    cout <<endl;
    cout << "Druk op [ENTER] om verder te gaan";
    cout <<endl;
    cout << "================================================="<<endl;
    cout <<endl;
    cin.get();
    

}

void bereken(long a, long b, long c, long d)
{
 d = a * b * c
 return(d);
}


dit is de vereenvoedigde versie, het hele progje rekent nog veel meer dingen uit, maar t komt verder op hetzelfde neer, als k hem zegmaar voor dit stukje aan de praat krijg, lukt de rest ook wel :)
Wie o wie kan me vertelen waarom dit zo niet werkt?
en graag ook uitleggen wat ik verkeerd doe zodat ik ervan kan leren :)

Wat doet Ctrl+W ook alweer?
Humankind… be both.
Star Wars Awakens | Instagram


  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

C++:
1
2
3
4
5
void bereken(long a, long b, long c, long d)
{
 d = a * b * c
 return(d);
}

je returnt hier een long, maar je return type is void ;)

ow en je moet natuurlijk ook zorgen dat de definitie bovenin de file hetzelfde is :o

[ Voor 23% gewijzigd door Erkens op 21-02-2005 22:53 ]


Verwijderd

Als ik jou programma probeer te compilen krijg ik de volgende foutmeldingen:

code:
1
test.cpp:7: error: `main' must return `int'

Jij hebt void main staan, en mijn compiler vind dat main een int (integer) moet terug geven. Om dit op te lossen vervang je void door int. Dan geeft main dus een int terug in plaats van niks.

code:
1
2
test.cpp: In function `int main(...)':
test.cpp:22: error: void value not ignored as it ought to be

In regel 22 roep je de functie aan en je doet alsof er een waarde uit komt, maar omdat de functie een void teruggeeft, oftewel niks, gaat dat niet werken.

code:
1
2
test.cpp: In function `void bereken(long int, long int, long int, long int)':
test.cpp:40: error: parse error before `return'


Voor regel 40 is er een foutje opgetreden. Je bent namelijk de ; vergeten.

Verder geef je bovenaan een prototype:
code:
1
int bereken(int, int, int, int);


Maar dan gebruik je long's in plaats van ints in de functie zelf. Het moet dus worden:

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream.h>


int bereken(int, int, int, int);

int main()
{
     
    long  deur1, deur2, aantaldeur, oppervlakdeur;


    cout << "Hoe hoog word een deur? [in cm]" <<endl;
    cin >> deur1;
    
    cout << "Hoe breed word een deur? [in cm]" <<endl;
    cin >> deur2;
    
    cout << "Hoeveel deuren komen er in het huis?" <<endl;
    cin >> aantaldeur;
    cin.get();

    oppervlakdeur = bereken(deur1,deur2,aantaldeur, oppervlakdeur);

    cout <<endl;
    cout << "================================================="<<endl;
    cout << "Het oppervlakte van de deuren is " <<oppervlakdeur <<" cm2" <<endl;
    cout <<endl;
    cout << "Druk op [ENTER] om verder te gaan";
    cout <<endl;
    cout << "================================================="<<endl;
    cout <<endl;
    cin.get();
    

}

int bereken(int a, int b, int c, int d)
{
 d = a * b * c;
 return(d);
}


Lees nog eens het een en ander of datatypes, zoals int, long en void.

  • Spike_wolf
  • Registratie: Maart 2003
  • Laatst online: 14:43

Spike_wolf

Genius Or Madman?.. You Decide

Topicstarter
Erkens schreef op maandag 21 februari 2005 @ 22:52:
C++:
1
2
3
4
5
void bereken(long a, long b, long c, long d)
{
 d = a * b * c
 return(d);
}

je returnt hier een long, maar je return type is void ;)
hoe bedoel je dat?

Wat doet Ctrl+W ook alweer?
Humankind… be both.
Star Wars Awakens | Instagram


Verwijderd

d is een long en die wil je teruggeven. Je functie-definitie zou er dan als volgt uit moeten zien:
C++:
1
2
3
long functie(long a, long bla bla bla) {
...
}


Verder is het niet nodig om d mee te geven aan de functie. Beter is dit:
C++:
1
2
3
4
5
int bereken(int a, int b, int c) {
    int d;
    d = a * b * c;
    return(d);
}

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Verwijderd schreef op maandag 21 februari 2005 @ 23:01:
Verder is het niet nodig om d mee te geven aan de functie. Beter is dit:
C++:
1
2
3
4
5
int bereken(int a, int b, int c) {
    int d;
    d = a * b * c;
    return(d);
}
C++:
1
2
3
int bereken(int a, int b, int c) {
    return (a * b * c);
}

/mierenneukmodus :P

  • Spike_wolf
  • Registratie: Maart 2003
  • Laatst online: 14:43

Spike_wolf

Genius Or Madman?.. You Decide

Topicstarter
thanks :)
Het werkt nu zoals ik wil, en met deze info is het ook gelukt de ret te laten werken :)
dank u _o_

Wat doet Ctrl+W ook alweer?
Humankind… be both.
Star Wars Awakens | Instagram


Verwijderd

Erkens schreef op maandag 21 februari 2005 @ 23:03:
[...]

C++:
1
2
3
int bereken(int a, int b, int c) {
    return (a * b * c);
}

/mierenneukmodus :P
C++:
1
#define BEREKEN(a, b, c) ((a)*(b)*(c))


:P

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Verwijderd schreef op maandag 21 februari 2005 @ 23:09:
[...]


C++:
1
#define BEREKEN(a, b, c) ((a)*(b)*(c))


:P
nee lekker handig ;)
ben zelf niet zo'n grote fan van "functies" in een define, geeft niet echt duidelijkheid, en bovendien:
dit is de vereenvoedigde versie, het hele progje rekent nog veel meer dingen uit,

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:57

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op maandag 21 februari 2005 @ 23:09:
C++:
1
#define BEREKEN(a, b, c) ((a)*(b)*(c))


:P
Beter maak je er een inline functie van; dat is type-safe en respecteert namespaces.

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.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Yep, en nog beter: een inline functie is vaak legaal waar een macro dat niet is:
C++:
1
2
int a = 1;
a = BEREKEN( ++a, 2, 3 ); // werkt alleen met inline, niet met #define

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


  • Boy
  • Registratie: November 2001
  • Laatst online: 09:58

Boy

www.byoscoop.nl

MSalters schreef op dinsdag 22 februari 2005 @ 14:26:
Yep, en nog beter: een inline functie is vaak legaal waar een macro dat niet is:
C++:
1
2
int a = 1;
a = BEREKEN( ++a, 2, 3 ); // werkt alleen met inline, niet met #define
Hoezo werkt een macro hier niet?

'a' wordt toch eerst verhoogt en dan pas teruggegeven, zoals het moet? Bij de define wordt dus 2 teruggegeven en deze gebruikt (a staat tussen haakjes in de define, dus geen probleem lijkt me).

Naar de bioscoop? => gebruik de app op Byoscoop.nl


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

H!GHGuY

Try and take over the world...

Boy schreef op woensdag 02 maart 2005 @ 21:49:
[...]

Hoezo werkt een macro hier niet?

'a' wordt toch eerst verhoogt en dan pas teruggegeven, zoals het moet? Bij de define wordt dus 2 teruggegeven en deze gebruikt (a staat tussen haakjes in de define, dus geen probleem lijkt me).
in dit geval zou't denk'k wel werken maar dit:
C++:
1
#define BEREKEN(A,B) (A*A+B)


brengt je aardig in de problemen denk'k

ASSUME makes an ASS out of U and ME


Verwijderd

Even over die macro: lees het volgende maar eens:

(De C++ FAQ)

http://www.parashift.com/...ne-functions.html#faq-9.5

citaatje:

"Why should I use inline functions instead of plain old #define macros?

Because #define macros are evil in 4 different ways"

Als iedereen die zichzelf "C++-programmeur" noemt, dit nou eens eerst zou doorlezen....

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Boy schreef op woensdag 02 maart 2005 @ 21:49:
Hoezo werkt een macro hier niet?

'a' wordt toch eerst verhoogt en dan pas teruggegeven, zoals het moet? Bij de define wordt dus 2 teruggegeven en deze gebruikt (a staat tussen haakjes in de define, dus geen probleem lijkt me).
Omdat je a niet twee keer mag veranderen: [google=C++ sequence points]

(vnl deze http://www.langer.camelot...oints/SequencePoints.html )
Verwijderd schreef op woensdag 02 maart 2005 @ 23:30:
Even over die macro: lees het volgende maar eens:
(De C++ FAQ)
Dat voorbeeld is niet wat er hier fout is (het is ook wel een pitfall met macros), het ging er bij msalters om dat de waarde van een variabele maximaal een keer veranderd mag worden tussen twee 'sequence points'. Daar het hhier een macro is, wordt het rechtstreeks omgezet in a = a++ * b * c; Binnen die expressie zitten geen sequence points, en a wordt dus bij de a++ en bij de assignment veranderd. Een functie call is wel een sequence point, en a = foo(a++); mag dus wel.

[ Voor 55% gewijzigd door Zoijar op 02-03-2005 23:42 ]


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Het "goede" antworod is dus "sequence points", maar het belangrijkste is dus dat je dit soort verassingen krijgt. Een macro is geen functie en moet je dus ook niet daarvoor gebruiken.

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