Gå til innhold

Kan en funksjon returnere en array?


Anbefalte innlegg

Videoannonse
Annonse

Et array er en peker som peker på et kjent antall elementer, så du kan returnere arrayet som peker. Men en std::vector vil vel være å foretrekke?

Edit: Forresten, hvis du skal opprette et array i en funksjon og returnere det må du opprette det ved hjelp av new []. Ellers vil minnet bli frigjort automatisk ved slutten av funksjonen.

Lenke til kommentar

#include <iostream>



char *enfunk()

{

char *s1 = new char[30];

std::cout << "Skriv inn streng: ";

std::cin.getline(s1, 30);

return s1;

}



int main(void)

{

char *enstring = enfunk();

std::cout << "Streng verdi er: " << enstring << "n";

delete enstring;»·»··»··»··»··// For å renske opp

return 0;

}

Lenke til kommentar

Du må huske å bruke delete[] og ikke delete når du bruker new til å allokere en array. Slik:

 


char *myArray = new char[666];

delete[] myArray;

 

Som nevnt i tidligere post så er absolutt std::vector å anbefale. std::vector garanterer at elementene ligger etterhverandre i minnet (som i en vanlig array).

Lenke til kommentar

Her er et lite eksempel på bruk av std::vector:


#include <vector>



class MyClass

{

  typedef std::vector<int> NumberVectorType;

  NumberVectorType numberVector_;

public:

  //standard initialisering av vectoren (ikke fastsatt størrelse)

  MyClass()

  {

  }



  //bruk denne c'tor for å sette den initielle størrelsen på vektoren

  MyClass(const NumberVectorType::size_type size) : numberVector(size)

  {

  }



  //returnerer en konstant referanse til vectoren

  const NumberVectorType& getVector() const

  {

     return numberVector_;

  }

};



void somewhere(MyClass& obj)

{

  //den raske måten (kun lese tilgang)

  const std::vector<int>& myVectorA = obj.getVector();   



  //lager en kopi av vectoren

  std::vector<int> myVectorB(obj.getVector() );

}

 

Du kunne strengt tatt også laget en ikke-konstant medlemsfunksjon i MyClass som returnerer en ikke-konstant referanse til vectoren. Men dette blir ofte sett på som dårlig design. Hvis du trenger å manipulere den interne vectoren i MyClass, bør dette gjøres gjennom andre spesialtilpassede medlemsfunksjoner.

 

Hadde desverre ikke kompilator for hånd, så jeg beklager hvis det har sneket seg inn noen trykkleifer i koden...

Lenke til kommentar
  • 3 måneder senere...

Trenger ikke new til det, du kan bruke std::map og noen enkle typedefs:

 

#include <iostream>

#include <map>



using namespace std;



typedef map<int, map<int, int> > Tabell2D;

typedef map<int, map<int, map<int, int> > >Tabell3D;



int main()

{

Tabell2D tabell2D; // lager en 2-dimensjonell tabell med int'er

Tabell3D tabell3D; // lager en 3-dimensjonell tabell

tabell2D[2][2] = 123;

tabell3D[1][2][3] = 123;

cerr << tabell3D[1][2][3] << endl;

return(0);

}

 

Paster en template-basert versjon, kanskje bedre altså, om 5 minutter .. :)

 

En ting:

Nå har ikke jeg så kjennskap til matte og slikt, men er Tabell2D egentlig 3dimensjonal sånn av definisjon? ..og Tabell3D 4dimensjonal?

Jeg roter sikkert .. :)

Lenke til kommentar

Edit:

La til denne som en kodesnutt, gå hit for event. siste versjon!

 

#include <iostream>

#include <map>



using namespace std;



template<int ndim, typename T, typename DIM = int>

class Tabell;



// 2 Dimensjoner

template<typename T, typename DIM>

class Tabell<2, T, DIM> : public std::map<DIM, std::map<DIM, T> > {

};





// 3 Dimensjoner

template<typename T, typename DIM>

class Tabell<3, T, DIM> : public std::map<DIM, std::map<DIM, std::map<DIM, T> > > {

};





// 4 Dimensjoner

template<typename T, typename DIM>

class Tabell<4, T, DIM> : public std::map<DIM, std::map<DIM, std::map<DIM, std::map<DIM, T> > > > {

};





// osv.  .5, 6, .. 1000 dimensjoner.. :)







int main()

{

Tabell<2, char> tabell2Da; // 2-dimensjonell tabell som lagrer char'er ved hjelp av templates (lagret på akser av den defaulte typen int)



int const xMax = 20;

int const yMax = 10;



// lager er "spillebrett" 

for(int y = 0; y < yMax; y++)

 for(int x = 0; x < xMax; x++)

 	tabell2Da[x][y] = '.';





cerr <<  "tegner brettet" << endl;

for(int y = 0; y < yMax; y++) {

 for(int x = 0; x < xMax; x++)

 	cerr << tabell2Da[x][y];

 cerr << endl;

}

cerr << endl;



cerr << "setter et kryss" << endl;

tabell2Da[2][3] = 'X';





cerr <<  "tegner brettet" << endl;	

for(int y = 0; y < yMax; y++) {

 for(int x = 0; x < xMax; x++)

 	cerr << tabell2Da[x][y];

 cerr << endl;

}

cerr << endl;



cerr << "setter en sirkel" << endl;

tabell2Da[3][4] = 'O';



cerr <<  "tegner brettet" << endl;	

for(int y = 0; y < yMax; y++) {

 for(int x = 0; x < xMax; x++)

 	cerr << tabell2Da[x][y];

 cerr << endl;

}

cerr << endl;	

 



// andre eksempler på ting man kan lagre i disse flerdimensjonale tabellene:

Tabell<2, int, double> tabell2Db; // 2-dimensjonell tabell med inter ved hjelp av templates lagret på akser av typed double

Tabell<3, int, double> tabell3Da; // 3-dimensjonell tabell med inter lagret på akser av typen double

Tabell<3, double> tabell3Db; // 3-dimensjonell tabell med double'r (lagret på akser av den defaulte typen int)



return(0);

}

 

Når jeg kjører programmet får jeg denne utskriften:

 

tegner brettet

....................

....................

....................

....................

....................

....................

....................

....................

....................

....................

 

setter et kryss

tegner brettet

....................

....................

....................

..X.................

....................

....................

....................

....................

....................

....................

 

setter en sirkel

tegner brettet

....................

....................

....................

..X.................

...O................

....................

....................

....................

....................

....................

 

 

Edit:

La til denne som en kodesnutt, gå hit for event. siste versjon!

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å
×
×
  • Opprett ny...