mboost-dp1

hjælp til C++ overload prog med deafault


Gå til bund
Gravatar #1 - Qw_freak
28. maj 2009 23:03
hey guys, mit lille program her laver en eller anden error jeg ikke kan få ram på når den kører.
den vil fint compiles kan simpelthen ikke se hvad der er galt
help anyone!!!!!!

#include <iostream>
#include <cstring>
using namespace std;

void OvrLdedFunkt(int x=0, char ch[80] ="This is the deafault");
double OvrLdedFunkt(double z);


int main()
{
char str1[80] = "string one";
char str2[80] = "string two";

OvrLdedFunkt(2, str1);
OvrLdedFunkt(4);
OvrLdedFunkt();
cout << OvrLdedFunkt(7.7)<< endl;

return 0;
}

void OvrLdedFunkt(int x, char ch[80])
{
char cat[80] = " catended";
strcat(ch, cat);
cout << ch << " ";
cout << x*5 << endl;
}

int OvrLdedFunkt(int y)
{
y=y*5;
return y;
}

double OvrLdedFunkt(double z)
{
z=z+2.2;
return z;
}
Gravatar #2 - Windcape
28. maj 2009 23:12
Og du vælger IKKE at skrive hvad fejlmeddelsen er fordi ? ....
Gravatar #3 - Windcape
28. maj 2009 23:26
Og min debugger siger at din fejl er i:


int main()
{
...
OvrLdedFunkt();
...
}


Altså kaldet til din definition med default parametere.

Derudover er der problemer med


OvrLdedFunkt(4);


Som benytter double kaldet som standard, hvilket giver følgende problem:


main_loop: ; edx contains first dword of sorc string
mov [edi],edx ; store one more dword
add edi,4 ; kick dest pointer


Du burde nok definere et overload for din integer i toppen også, dvs.


void OvrLdedFunkt(int x=0, char ch[80] ="This is the deafault");
double OvrLdedFunkt(double z);
int OvrLdedFunkt(int y);


Problemet viser sig så at være at der ikke kan ses forskel på integer og double type overload.
Gravatar #4 - Windcape
28. maj 2009 23:34
Måske bedre eksempel på at lave type overloads:


#include "stdafx.h"
#include <iostream>

using namespace std;

void F();
int F(int v);
double F(double v);
long F(long v);

int main()
{
F(2);
F(3.3);
F((long)4);

system("PAUSE");
return 0;
}

void F()
{
}

int F(int v)
{
cout << "Integer Overload" << endl;
return v * 2;
}

double F(double v)
{
cout << "Double Overload" << endl;
return v * 2;
}

long F(long v)
{
cout << "Long Overload" << endl;
return v * 2;
}
Gravatar #5 - arne_v
29. maj 2009 01:28
#1

Følgende er OK:


void OvrLdedFunkt(int x=0, char ch[80] ="This is the deafault");
...
char str1[80] = "string one";
...
OvrLdedFunkt(2, str1);
...
void OvrLdedFunkt(int x, char ch[80])
{
char cat[80] = " catended";
strcat(ch, cat);


Følgende er ikke OK:


void OvrLdedFunkt(int x=0, char ch[80] ="This is the deafault");
...
char str1[80] = "string one";
...
OvrLdedFunkt(4);
...
void OvrLdedFunkt(int x, char ch[80])
{
char cat[80] = " catended";
strcat(ch, cat);


er ikke OK.

Og hvad er så forskellen?

Forskellen er at "string one" ligger i read write memory mens "This is the deafault" ligger i readonly memory - i de fleste nyere compilere (inkl. GCC og MS).

Ifølge ANSI C++ standarden er forsøg på at modificere en string literal undefined. Så opførslen er OK ifølge standarden.

Ved det andet kald crasher dit program fordi strcat forsøger at appende til noget der ligger i readonly memory.

En god compiler bør iøvrigt give dig en warning med hensyn til den kode.
Gravatar #6 - arne_v
29. maj 2009 01:34
Windcape (3) skrev:
Og min debugger siger at din fejl er i:


int main()
{
...
OvrLdedFunkt();
...
}


Altså kaldet til din definition med default parametere.


Din debugger bilder dig noget ind.

Programmet dør allerede i:

OvrLdedFunkt(4);

Windcape (3) skrev:

Derudover er der problemer med


OvrLdedFunkt(4);


Som benytter double kaldet som standard, hvilket giver følgende problem:


Nej.

OvrLdedFunkt(4);

svarer til:

OvrLdedFunkt(4, "This is the deafault");

Windcape (3) skrev:
Du burde nok definere et overload for din integer i toppen også, dvs.


Det vil give compile fejl, fordi OvrLdedFunkt(int) så er ambigious.

Windcape (3) skrev:
Problemet viser sig så at være at der ikke kan ses forskel på integer og double type overload.


Nej.

Problemet er at string literals er readonly.
Gravatar #7 - arne_v
29. maj 2009 01:37
#4

Jeps.

PS: F((long)4) kan skrivs som F(4L).
Gravatar #8 - Qw_freak
29. maj 2009 07:47
takker det var gode svar, har fået den til at virke nu, det var fordi som arne_v siger, at jeg forsøgte at skrive i defaulten som jo er konstant, og det ville den ikke!

grunden til mit prog ser sådan ud er at jeg i samme prog gerne vil ha både default, overload og strcat til brug til eksamen nu her!

så mange tak skal i ha!

Ps.
(forstår så bare ikke at det først var når programmet nåede til det sidste tuborgklamme at det crashede, og alt så fint ud i dos-boxen??)

PPs. jeg byttede bare om i strcat:
strcat(ch, cat);
til
strcat(cat, ch);
Gravatar #9 - arne_v
29. maj 2009 13:41
#8

Medmindre du har brug for at kalde C API'er som ikke findes i C++ version, så bør du bruge STL string (std::string) fremfor nultermineret char array.
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login