[C++] Structs

Pagina: 1
Acties:

  • Chip.
  • Registratie: Mei 2006
  • Niet online
Hallo,

Ik heb deze code hieronder geschreven alleen het probleem is, zoals je al raad, dat die niet werkt. Ik heb al flink gezocht op error's maar kom tot de conclusie dat er volgens mij niks fout aan is, wat jullie natuurlijk zal verbazen want jullie zien de fout wel :P.

Ik zal even vertellen wat het programma moet doen. Het programma rekent gewoon de afstand uit van een bepaald punt dat in het x,y vlak ligt tot het 0 punt. In dit geval doet die dat dus voor 2 punten.

Als ik dit dus uitvoer krijg ik een hele lijst met error's. Mocht daar interesse in zijn deze kun je deze hier vinden: http://www.plaatscode.be/4242/

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
#include <iostream>
#include <cmath>
using namespace std;

struct Punt
{
    int x;
    int y;
};

float afstand(Punt p)
{
    // Berekenen de afstand tot het nulpunt
    return sqrt(pow(p.x,2) + pow(p.y,2));
}

int main()
{
    Punt p1, p2;
    
    cout << "Berekenen van 2 punten tot het nulpunt (0,0)." << endl;
    cout << "Voer de x-coordinaat in voor punt 1:";
    cin >> p1.x;
    cout << "Voer de y-coordinaat in voor punt 1:";
    cin >> p1.y;
    cout << endl << "Voer de x-coordinaat in voor punt 2:";
    cin >> p2.x;
    cout << "Voer de y-coordinaat in voor punt 2:";
    cin >> p2.y;
    
    cout << endl << "Punt 1 (" << p1.x << "," << p1.y << ") ligt " << afstand(p1) << " af van (0,0)." << endl;
    cout << "Punt 2 (" << p2.x << "," << p2.y << ") ligt " << afstand(p2) << " af van (0,0)." << endl;
    
    return 0;
}           

  • Janoz
  • Registratie: Oktober 2000
  • Nu online

Janoz

Moderator Devschuur®

!litemod

De naam van een variabele mag niet enkel een cijfer zijn of ermee beginnen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 13:42
Een paar opmerkingen over de log die je plaatst:
• al die template-meldingen zijn niet zo interessant (ze geven de context bij de foutmeldingen weer); de echte foutmeldingen staan onderaan; die had je ook alleen kunnen posten.
• heel goed dat je hier een versimpelde versie van je code plaatst, maar zorg dan dat je je foutmeldingen ook aanpast zodat de regelnummers corresponderen met de code die je hier post, want zo is het erg onduidelijk welke foutmelding waarbij hoort.

Inhoudelijk: identifiers (de namen van variabelen, types, functies enzovoort) moeten met een letter (of underscore) beginnen. 1 en 2 kunnen dus geen identifiers zijn; maak daar eens een en twee of p1 en p2 van.

  • Chip.
  • Registratie: Mei 2006
  • Niet online
Ah ok ja ik weet dat variable eigenlijk geen 1 mag zijn ofzo maar ik dacht omdat 1.x dan zeg maar een var is... maar blijkbaar zit ik hier dus fout. Had hier eigenlijk ook niet eens bij stilgestaan of aangedacht.

Verder alvast bedankt voor jullie hulp. Ik heb die fout verbetert krijg nu alleen nog een error met de kwadraat functie en wortel functie maar daar kijk ik wel morgen na ga nu namelijk slapen

trusten :w

  • Chip.
  • Registratie: Mei 2006
  • Niet online
Hey,

Ik ben nu weer daarmee bezig en ik kom tevens niet uit uit die error met de kwadraat functie... Ik heb nu verschillende dingen geprobeerd waaronder ik 1 oplossing heb gevonden maar daar ben ik echter niet tevreden mee want ik wil weten waarom de wortel functie en de kwadraat functie niet werken...

Dit is de code met error's over de kwadraat functie
C++:
1
2
3
4
5
float afstand(Punt p)
{
    // Berekenen de afstand tot het nulpunt
    return sqrt(pow(p.x,2) + pow(p.y,2));
}   


Nu geeft die de volgende error's:
2096199_TEP2C_3.7.2.cpp(20) : error C2668: 'pow' : ambiguous call to overloaded
function
C:\Program Files\Microsoft Visual Studio 8\VC\INCLUDE\math.h(575): could
be 'long double pow(long double,int)'
C:\Program Files\Microsoft Visual Studio 8\VC\INCLUDE\math.h(527): or 'f
loat pow(float,int)'
C:\Program Files\Microsoft Visual Studio 8\VC\INCLUDE\math.h(489): or 'd
ouble pow(double,int)'
while trying to match the argument list '(int, int)'
2096199_TEP2C_3.7.2.cpp(20) : error C2668: 'pow' : ambiguous call to overloaded
function
C:\Program Files\Microsoft Visual Studio 8\VC\INCLUDE\math.h(575): could
be 'long double pow(long double,int)'
C:\Program Files\Microsoft Visual Studio 8\VC\INCLUDE\math.h(527): or 'f
loat pow(float,int)'
C:\Program Files\Microsoft Visual Studio 8\VC\INCLUDE\math.h(489): or 'd
ouble pow(double,int)'
while trying to match the argument list '(int, int)'
Ik zie wel steeds dat ze iets zeggen over de byte waarde van het elementaire type maar weet niet wat ik hier eigenlijk mee aan moet :?

Nu als ik gewoon de pow functie weg laat en die vervang door:
C++:
1
2
3
4
5
float afstand(Punt p)
{
    // Berekenen de afstand tot het nulpunt
    return sqrt(p.x*p.x + p.y*p.y);
}


p.x*p.x = p.x^2 natuurlijk. Nu krijg ik een error over de wortel functie waar ik tevens ook niet echt weet wat ik mee aan moet...
2096199_TEP2C_3.7.2.cpp(19) : error C2668: 'sqrt' : ambiguous call to overloaded
function
C:\Program Files\Microsoft Visual Studio 8\VC\INCLUDE\math.h(581): could
be 'long double sqrt(long double)'
C:\Program Files\Microsoft Visual Studio 8\VC\INCLUDE\math.h(533): or 'f
loat sqrt(float)'
C:\Program Files\Microsoft Visual Studio 8\VC\INCLUDE\math.h(128): or 'd
ouble sqrt(double)'
while trying to match the argument list '(int)'
Nauw als ik vervolgens de wortel functie vervang door de kwadraat functie en de uitkomst van p.x*p.x... tot de macht 0,5 verheft (wortel) dan doet ie het wel...
C++:
1
2
3
4
5
float afstand(Punt p)
{
    // Berekenen de afstand tot het nulpunt
    return pow(p.x*p.x + p.y*p.y,0.5);
}


Wie oh wie kan me vertellen waarom de eerste 2 pogingen niet lukken terwijl het (volgens) mij gewoon moet werken.

PS: voor de hele code verwijs ik naar me beginpost.

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 01-12 20:19

Gerco

Professional Newbie

Die foutmeldingen over de pow() en sqrt() functies komen omdat de compiler niet weet welke versie van de functie je bedoelt aan te roepen ("ambiguous call to overloaded function"). Van de pow() functie zijn er de volgende mogelijke varianten (er zijn er veel meer, maar deze passen het beste bij de argumenten die je gebruikt hebt):

long double pow(long double, int)
float pow(float, int)
double pow(double, int)

Jij probeert pow() aan te roepen met (int, int) en dat behoort niet tot de mogelijkheden. Je zult dus je argumenten moeten aanpassen aan de types die de functie verwacht. In dit geval:

C++:
1
2
3
4
5
float afstand(Punt p)
{
    // Berekenen de afstand tot het nulpunt
    return sqrt(pow((double)p.x, 2) + pow((double)p.y, 2));
}


Voor sqrt geld uiteraard iets soortgelijks (al gaat die nu spontaan werken, bedenk zelf waarom). Mijn eerste paragraaf is een letterlijke vertaling van de foutmelding, die is echt geen onleesbare brei (al lijkt het er soms verdacht veel op). Aandachtig de foutmelding lezen kan een hoop duidelijkheid scheppen :)

[ Voor 25% gewijzigd door Gerco op 18-02-2007 11:48 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • Chip.
  • Registratie: Mei 2006
  • Niet online
Harstikke bedankt voor je uitleg. Heb probleem opgelost en snap het nu :)

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

.oisyn

Moderator Devschuur®

Demotivational Speaker

Gerco schreef op zondag 18 februari 2007 @ 11:45:
long double pow(long double, int)
float pow(float, int)
double pow(double, int)
long double pow(long double, long double)
float pow(float, float)
double pow(double, double)
;)

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.


  • Chip.
  • Registratie: Mei 2006
  • Niet online
C:\Program Files\Microsoft Visual Studio 8\VC\INCLUDE\math.h(575): could
be 'long double pow(long double,int)'

:?

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

.oisyn

Moderator Devschuur®

Demotivational Speaker

Het was een aanvulling, geen verbetering :)
.edit: oh excuus, ik heb over dit stukje heen gelezen:
er zijn er veel meer, maar deze passen het beste bij de argumenten die je gebruikt hebt
8)7

[ Voor 64% gewijzigd door .oisyn op 18-02-2007 15:36 ]

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.

Pagina: 1