Gå til innhold

Kan en funksjon returnere en array?


Anbefalte innlegg

Skrevet

Hei, mitt andre spørsmål i dag, står bom fast!

 

Kan en funksjon i C++ returnere en array? Hvordan blir i tilfelle syntaksen?

Videoannonse
Annonse
Skrevet

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.

Skrevet

ok,

 

må man da bare la pekeren gå ett og ett steg fremover etter at funksjonen har returnert den for å få hele arrayet?

 

Når man lager et array så ligger elementene etter hverandre i minnet?

Skrevet

Du kan behandle en peker på samme måte som et array, og omvendt. Men du må være klar over at det ikke er noen sjekk om du går utover antall elementer.

Skrevet

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

}

Skrevet

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

Skrevet

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

  • 3 måneder senere...
Skrevet

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

Skrevet

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!

Skrevet

En annen og kanskje minst like aktuell er std::vector. Den er nesten helt lik å bruke også, men istedet for en en 'key' (std::map er en assosiativ container) indekserer du deg fra 0 og oppover som i en vanlig array.

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