Jump to content
Sign in to follow this  
Atypic

Array-aksessering i instantiert klasse.

Recommended Posts

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.

Edited by Atypic

Share this post


Link to post

* 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 a

a.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;
}

Edited by dayslepr

Share this post


Link to post

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!

Edited by Atypic

Share this post


Link to post


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 :/

Edited by Atypic

Share this post


Link to post

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?

Edited by Atypic

Share this post


Link to post

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;
}

Share this post


Link to post

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.

Edited by Atypic

Share this post


Link to post

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.

Edited by Atypic

Share this post


Link to post

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

Edited by Nazgul

Share this post


Link to post

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...

Edited by kjetil7

Share this post


Link to post
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.

Share this post


Link to post

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

×
×
  • Create New...