Atypic Skrevet 1. januar 2006 Rapporter Del Skrevet 1. januar 2006 (endret) Hei. Jeg har litt kode, således: #define BOOL bool #define TRUE true class cMinklasse { protected: long *m_Array; public: BOOL m_funksjon(); }; //outline m_funksjon() BOOL cMinklasse::m_funksjon() { m_Array = new long[1]; m_Array[0] = 1; m_Array[1] = 2; return TRUE; } void main() { cMinklasse cInstans; cInstans.m_funksjon(); } Snøft, dette går ikke. Og jeg skjønner ikke helt hvorfor. Noen som ser åpenbart hva som går galt? Dette her er selvsagt svært forenklet i forhold til min egentlige kode, men dette er i hovesak det som foregår. Når jeg kjører gjennom debuggen virker det som om det rett og slett ikke blir laget stack-frames til m_Array - arrayet. Skjønner dere hvorfor? [Edit] Gjorde koden litt mer kompatibel. Skru av idiotisk error angående void-return i main for å kompilere. Endret 1. januar 2006 av Atypic Lenke til kommentar
dayslepr Skrevet 1. januar 2006 Rapporter Del Skrevet 1. januar 2006 (endret) * main returnerer int, ikke void * BOOL er ikke en type; du mener bool * samme med TRUE; du mener true etter å ha rettet på de tingene får jeg: lars@ibmr52:~/programming/c++$ g++ -Wall -g a.cpp -o aa.cpp: In function ‘int main()’: a.cpp:24: error: ‘cInstance’ was not declared in this scope a.cpp:23: warning: unused variable ‘cInstans’ og retter da på skriveleifen: class cMinklasse { protected: long *m_Array; public: bool m_funksjon(); }; //outline m_funksjon() bool cMinklasse::m_funksjon() { m_Array = new long[2]; // Edit: ups, ja - her skal det stå 2 m_Array[0] = 1; m_Array[1] = 2; return true; } int main() { cMinklasse cInstance; cInstance.m_funksjon(); return 0; } Endret 1. januar 2006 av dayslepr Lenke til kommentar
dayslepr Skrevet 1. januar 2006 Rapporter Del Skrevet 1. januar 2006 husk å bruke delete[] i stedet for delete da ... Lenke til kommentar
Atypic Skrevet 1. januar 2006 Forfatter Rapporter Del Skrevet 1. januar 2006 (endret) Du. Jeg spurte ikke om syntaksen, den fungerer, om du bruker BOOL eller bool er ett fett for Visual Studio.NET. Evt er det jo bare å slenge på et par #define BOOL bool #define TRUE true, etc... Main kan pr. C++ standard i dag returnere void. Det er noe finurlig med minneallokeringen. Takk for forsøket dog! Endret 1. januar 2006 av Atypic Lenke til kommentar
Atypic Skrevet 1. januar 2006 Forfatter Rapporter Del Skrevet 1. januar 2006 (endret) this 0x0012ff60 {m_Array=0x003a2f40 } cMinklasse * const - m_Array 0x003a2f40 long * - 1 long Problemet ligger her - som dere ser av debuggen så får m_Array kun en verdi, den blir tilegnet den første jeg setter den til, altså 1. Det som IKKE skjer er at jeg får "array-oppførsel", altså at m_Array[0] = 1 og m_Array[1] = 2, jeg får i stedet bare m_Array = 1. Snøft. Merk at dette er debug'en rett før programmet avsluttes. Det som er noe rart er at akkurat i "gjerningsøyeblikket" når jeg tilordner m_Array verdier så viser debuggen at dette faktisk skjer og i et fattig øyeblikk så finst faktisk m_Array slik jeg vil ha det - Men jeg forandrer egnetlig ikke noe på objektet i det hele tatt, så det burde jo ikke bli "trunkert".... Hypotese: Overskrives minnet?! Edit: Selvsagt, jeg allokerer bare for lite plass. Men dette hjelper lite. PROBLEM LØST. Edit: Ja de kunne en tro. Pokker. Problem ikke løst :/ Endret 1. januar 2006 av Atypic Lenke til kommentar
christt Skrevet 1. januar 2006 Rapporter Del Skrevet 1. januar 2006 Du allokerer jo bare plass til ett element på heapen: m_Array = new long[1]; prøv med: m_Array = new long[2]; Lenke til kommentar
Atypic Skrevet 1. januar 2006 Forfatter Rapporter Del Skrevet 1. januar 2006 Ah, der kom svaret og ja. Takker - jeg så feilen rett før posten din Lenke til kommentar
christt Skrevet 1. januar 2006 Rapporter Del Skrevet 1. januar 2006 Bare hyggelig. Fort å se seg blind på sin egen kode. Lenke til kommentar
Atypic Skrevet 1. januar 2006 Forfatter Rapporter Del Skrevet 1. januar 2006 (endret) Ikke fa*? Det skjer fremdeles - det virker rett og slett som om minnet blir overskrevet, men nå allokerer jeg jo faktisk nok plass også. Dette er snodig. Kan noen kjøre en debug, sette et breakpoint rett før programmet eksiterer (før siste klammen f.eks.) og se hvile verdi m_Array sitter med da? Endret 1. januar 2006 av Atypic Lenke til kommentar
christt Skrevet 1. januar 2006 Rapporter Del Skrevet 1. januar 2006 Følgende kode funker helt fint hos meg. Kompilert med g++ under cygwin. #include <cstdio> #define BOOL bool #define TRUE true class cMinklasse { protected: long * m_Array; public: BOOL m_funksjon(); void print(); }; //outline m_funksjon() BOOL cMinklasse::m_funksjon() { m_Array = new long[2]; m_Array[0] = 1; m_Array[1] = 2; return TRUE; } void cMinklasse::print() { printf("%i\n%i\n", m_Array[0], m_Array[1]); } int main() { cMinklasse cInstans; cInstans.m_funksjon(); cInstans.print(); return 1; } Lenke til kommentar
Atypic Skrevet 1. januar 2006 Forfatter Rapporter Del Skrevet 1. januar 2006 (endret) Noe av det samme funker her. Riktig data blir printet - jeg burde godta at det er riktig. Er nok bare jeg som ikke skjønner debuggen helt 100%. #define BOOL bool #define TRUE true #include <iostream> using namespace std; class cMinklasse { protected: int *m_Array; public: cMinklasse(); ~cMinklasse(); BOOL m_funksjon(); int m_returner( int i); }; cMinklasse::cMinklasse() { cout << "er i const"; } cMinklasse::~cMinklasse() { delete[] m_Array; } //outline m_funksjon() BOOL cMinklasse::m_funksjon() { m_Array = new int[2]; m_Array[0] = 1; m_Array[1] = 2; return TRUE; } int cMinklasse::m_returner(int i) { return m_Array[i]; } void main() { cMinklasse cInstans; cInstans.m_funksjon(); cout << cInstans.m_returner(0) << "\endl"; cout << cInstans.m_returner(1) << "\endl"; } Koden over gir forventet resultat egentlig, men det er ikke så åpenbart i debuggen. Endret 1. januar 2006 av Atypic Lenke til kommentar
Atypic Skrevet 1. januar 2006 Forfatter Rapporter Del Skrevet 1. januar 2006 (endret) Bare for å konfirmere - nå fungerer også koden i mitt større prosjekt, så metoden over er absolutt gyldig. All is well in wonderland. Takk for all hjelp. Endret 1. januar 2006 av Atypic Lenke til kommentar
Peter Skrevet 1. januar 2006 Rapporter Del Skrevet 1. januar 2006 (endret) Har du en kopi av den standarden der main kan returnere void i C++? Den er jeg mildt sagt interessert i å se. Og nei, det er ikke ett fett for msvs om du bruker BOOL eller bool med mindre du enten legger inn defines, eller inkluderer windows.h Endret 1. januar 2006 av Nazgul Lenke til kommentar
kjetil7 Skrevet 1. januar 2006 Rapporter Del Skrevet 1. januar 2006 (endret) Standarden sier at main *skal* returnere en int. Se 3.6.1 i standarden: An implementation shall not predefine the main function. This function shall not be overloaded. It shall have a return type of type int, but otherwise its type is implementation-defined. Ellers er BOOL en typedef av en int og er derfor definitivt ikke det samme som bool. Du vil sannsynligvis få masse warnings hvis du blander de. Og hva med den underliggende koden for disse vektorene: int main() { std::vector<bool> realBoolVec(1000000); std::vector<BOOL> fakeBoolVec(1000000); } Det er en god sjanse for at den ene allokerer litt mer minne enn den andre... Endret 1. januar 2006 av kjetil7 Lenke til kommentar
Atypic Skrevet 3. januar 2006 Forfatter Rapporter Del Skrevet 3. januar 2006 Standarden sier at main *skal* returnere en int. Se 3.6.1 i standarden: An implementation shall not predefine the main function. This function shall not be overloaded. It shall have a return type of type int, but otherwise its type is implementation-defined. Ellers er BOOL en typedef av en int og er derfor definitivt ikke det samme som bool. Du vil sannsynligvis få masse warnings hvis du blander de. Og hva med den underliggende koden for disse vektorene: int main() { std::vector<bool> realBoolVec(1000000); std::vector<BOOL> fakeBoolVec(1000000); } Det er en god sjanse for at den ene allokerer litt mer minne enn den andre... 5368476[/snapback] Jaha, her får man smekk. Blir jo rett og slett nødt til å bytte kodestil. Angående void main(), her prøver jeg egentlig bare å trolle litt. Jeg er lite fornøyd med ANSI sin definisjon da jeg synst at c++ faktisk bør kunne ha main som ikke returnerer noe. Kikker du på ASM-instruksjonene hva return 0 angår så ser man jo at det skjer ikke en pøkk, den er ofte overflødig... Nåh, dette har jeg diskutert i uendelige lengder før. Jeg har igrunn komt frem til å la diskusjonen ligge død. En definisjon er en definisjon, og jeg liker definisjoner. Så ja. Jeg tok feil. Nei, man skal ikke lage main() funksjon som ikke returnerer noe. Ja, ANSI er flinke folk, om enn noe distanserte. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå