Funktion, die 'nen Array returnt?
-
int do_Something(void) { int a = 123; return a; }
gibt einen Integer zurück. Schön und gut, aber wie muss eine Funktion aussehen, die einen Array zurückliefert (int[100][100])?
-
Hi, das geht nicht so einfach.
Am besten ist, wenn du dir ne Matrix selbst definierst in form einer Klasse.
Zum Beispiel so in der Art:
#include <vector> #include<functional> #include <string> #include <fstream> #include <iterator> #include <iostream> //--------------------------------------------------------------------------- template<class T>class Slice_iter { private: std::vector<T>* v; std::slice s; size_t akt; T& ref(size_t i)const {return (*v)[s.start()+i*s.stride()];} public: Slice_iter(std::vector<T>* vv,std::slice ss):v(vv),s(ss),akt(0){} Slice_iter end() const { VSlize_iter t=*this; t.akt=s.size(); return t; } Slice_iter& operator++(){akt++; return *this;} Slice_iter operator++(int){Slice_iter t=*this; akt++;return t;} //T operator+(size_ti, T t){return *ref(i)*t; } T& operator[](size_t i){return ref(i);} T& operator()(size_t i){return ref(i);} T& operator*(){return ref(akt);} // aktuelles Element friend bool operator ==<>(const Slice_iter& p,const Slice_iter& q) { return p.akt==q.akt && p.s.stride()== q.s.stride() && p.s.start()== q.s.start(); } friend bool operator !=<>(const Slice_iter& p,const Slice_iter& q) { return !(P==q); } friend bool operator < <>(const Slice_iter& p,const Slice_iter& q) { return p.akt<q.akt && p.s.stride()== q.s.stride() && p.s.start()== q.s.start(); } }; //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- template <class T> class TMLMatrix { private: std::vector<T>* v; std::size_t FColCount,FRowCount; public: typedef T value_type; typedef Slice_iter<value_type> SLICE; typedef const SLICE CONST_SLICE; typedef std::vector<value_type> MatrixSource; typedef MatrixSource::const_iterator Const_MatrixIter; typedef MatrixSource::iterator MatrixIter; TMLMatrix(std::size_t maxcols=1, std::size_t maxrows=1) { FColCount=maxcols;FRowCount=maxrows; v=new MatrixSource(maxcols*maxrows); }; TMLMatrix(const TMLMatrix& AMatrix) { FColCount= AMatrix.ColCount(); FRowCount= AMatrix.RowCount(); v=new MatrixSource(AMatrix.array()); }; TMLMatrix(const MatrixSource& AVector, size_t AColCount, size_t ARowCount) { FColCount= AColCount; FRowCount= ARowCount; v=new MatrixSource(AVector); }; TMLMatrix& operator=(const TMLMatrix& AMatrix) { clear(); FColCount= AMatrix.ColCount(); RowCount()= AMatrix.RowCount(); delete v; v=new MatrixSource(AMatrix.Source()); }; ~TMLMatrix() { clear(); delete v; }; void clear() { v->clear(); } size_t size() const {return ColCount()*RowCount();} inline size_t ColCount() const {return FColCount;} inline size_t RowCount() const {return FRowCount;} void SetSize(size_t AColCount,size_t ARowCount) {FColCount=AColCount;FRowCount=ARowCount;} void SetColCount(size_t Cols) {FColCount=Cols;} void SetRowCount(size_t Rows) {FRowCount=Rows;} void add(const value_type& Value) {v->push_back(Value);} void resize(size_t newsize) {v->resize(newsize);}; void resize(size_t newsize,value_type Default) {v->resize(newsize,Default);}; void erase(Const_MatrixIter Pos) {v-> erase(Pos)} SLICE zeile(size_t i) {return Slice_iter<value_type>(v,std::slice(i,ColCount(),RowCount())); } SLICE zeile(size_t i) const {return Slice_iter<value_type>(v,std::slice(i,dim1(),RowCount())); } SLICE spalte(size_t i) {return Slice_iter<value_type>(v,std::slice(i*RowCount(),RowCount(),1)); } SLICE spalte(size_t i) const {return Slice_iter<value_type>(v,std::slice(i*RowCount(),RowCount(),1)); } value_type& operator()(size_t col, size_t row) {return spalte(col)[row];}; value_type& operator()(size_t col, size_t row) const {return spalte(col)[row];}; value_type& Cells(size_t col, size_t row) {return spalte(col)[row];}; CONST_SLICE operator()(size_t col) {return spalte(col);} CONST_SLICE operator()(size_t col)const {return spalte(col);} CONST_SLICE operator[](size_t col) {return spalte(col);} CONST_SLICE operator[](size_t col)const {return spalte(col);} MatrixSource* Source(){return v;} }; //---------------------------------------------------------------------------
ist zwar nicht perfekt, aber schon ok. Und übrigens sauschnell.
-
Danke aber das ist mir zu kompliziert. Ich hab die Funktion etwas umgeschrieben:
int create_Array(int x, int y) { // Prozedur zur erzeugung des Arrays int arr[100][100]; . . . // gibt verlangten Wert zurück return arr[x][y]; }
Das ist wohl die langsamste Möglichkeit wenn man mehr als einen Wert aus dem Array braucht.
Falls das bei mir je der Fall sein sollte, werd' ich auf deine Version zurückgreifen.