mboost-dp1
hjælp til C++ overload prog med deafault
- Forside
- ⟨
- Forum
- ⟨
- Programmering
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!!!!!!
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;
}
Og min debugger siger at din fejl er i:
Altså kaldet til din definition med default parametere.
Derudover er der problemer med
Som benytter double kaldet som standard, hvilket giver følgende problem:
Du burde nok definere et overload for din integer i toppen også, dvs.
Problemet viser sig så at være at der ikke kan ses forskel på integer og double type overload.
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.
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;
}
#1
Følgende er OK:
Følgende er ikke OK:
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.
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.
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.
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:
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);
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.