torry Skrevet 18. juni 2003 Del Skrevet 18. juni 2003 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? Lenke til kommentar
A_N_K Skrevet 18. juni 2003 Del Skrevet 18. juni 2003 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
torry Skrevet 18. juni 2003 Forfatter Del Skrevet 18. juni 2003 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? Lenke til kommentar
A_N_K Skrevet 18. juni 2003 Del Skrevet 18. juni 2003 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. Lenke til kommentar
Duronator Skrevet 18. juni 2003 Del Skrevet 18. juni 2003 #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
kjetil7 Skrevet 18. juni 2003 Del Skrevet 18. juni 2003 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
kjetil7 Skrevet 18. juni 2003 Del Skrevet 18. juni 2003 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
torry Skrevet 19. juni 2003 Forfatter Del Skrevet 19. juni 2003 Takker for svar, det har vært til stor hjelp! Lenke til kommentar
torry Skrevet 10. oktober 2003 Forfatter Del Skrevet 10. oktober 2003 Hei, er det mulig ved hjelp av kommandoen 'new' å opprette en flerdimensjonal array? T Lenke til kommentar
daysleper Skrevet 10. oktober 2003 Del Skrevet 10. oktober 2003 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
daysleper Skrevet 10. oktober 2003 Del Skrevet 10. oktober 2003 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
torry Skrevet 10. oktober 2003 Forfatter Del Skrevet 10. oktober 2003 takker, jeg har ikke noe greie på map-kommandoen, men skal sette meg inn i svaret ditt etter hvert Lenke til kommentar
kjetil7 Skrevet 10. oktober 2003 Del Skrevet 10. oktober 2003 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. Lenke til kommentar
A_N_K Skrevet 10. oktober 2003 Del Skrevet 10. oktober 2003 En todimensjonal vector f.eks ville bli vector<vector<type> >. En noe enklere variant er boost::multi_array. 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å