Gå til innhold

Array-aksessering i instantiert klasse.


Anbefalte innlegg

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 av Atypic
Lenke til kommentar
Videoannonse
Annonse

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

Endret av dayslepr
Lenke til kommentar

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 av Atypic
Lenke til kommentar


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 av Atypic
Lenke til kommentar

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 av Atypic
Lenke til kommentar

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

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 av Atypic
Lenke til kommentar

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 av Nazgul
Lenke til kommentar

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 av kjetil7
Lenke til kommentar
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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...