I mit tilfælde vil det være ret klodset at have enkeltstående variable for alt det som skal returneres. Kan man ikke returnere et 2 dim array som består af strenge? Det vil sige at men finder en "liste" af strenge i hvert entry i arrayet...
Den basale funktion gennemløber en tekst fil fort at finde bestemte oplysninger. For hver linie i tekstfilen (som indholder en bestemt streng) noteres linie nr., tekst, mm.
Hver linie (svarende til en struct) opsamles i en anden funktion der skal aflevere resultatet til GUI håndteringen hvor informationenerne skal tilføjes til en List Ctrl.
Okay, men så ville jeg da give funktionen en reference til en vector der kan indeholde din struct, fx:
vector<LineData> LineDataVector;
void MyFunc(vector<LineData>& vec) { vec.push_back(...); // Smid de elementer i, du skal bruge // Hvis du har nogen mulighed for at foresige hvor mange elementer der skal i vectoren, kan du med fordel (performance) bruge vec.reserve(Number), da det forhindrer en del reallokering }
Du kan naturligvis også bare lade funktionen returnere en vector af ovenstående type, men kopieres hele indholdet, hvilket ikke er særlig smart (især ikke hvis der er meget data i)
jeg tror godt jeg kan returnere en vector, det er altid det samme antal parametre i vektoren og det er nogle strenge der skal overføres... Så kan jeg vel samle det hele til et array af vektorer, når GUI'en skal opdateres...
Afhænger antallet af parametre ikke af hvor mange gange du finder "en bestemt streng"?
Jeg havde egentlig forstået, at det du skulle bruge var noget lign.:
class LineData { int nLine; string strText; ... };
vector<LineData> CheckFile() { vector<LineData> vec; // while file not at end, read line // if line OK, put into vector vec.push_back(LineData(nLineNumber, strText)); // end while
return vec; }
derfor forstår jeg ikke din sidste kommentar "Så kan jeg vel samle det hele til et array af vektorer, når GUI'en skal opdateres..."?
--------------- Constructor, evt. uinitialiseret Matrix: --------- Matrix (size_t Rows=0, size_t Cols=0) PRE : true POST: konstruerer Matrix med Rows rækker og Cols søjler Der kan konstrueres en matrix (0,0), som senere skal Resize's. Uden argumenter er det default constructor
--------------- Constructor, initialiseret Matrix: ---------- Matrix (size_t Rows, size_t Cols, const T& Value) PRE : Value def. POST: konstruerer Matrix med Rows rækker og Cols søjler og alle elementer = Value. Value skal have en default-constructor
--------------- Copy Constructor: --------------------------- Matrix (const Matrix<T>& source) PRE : source def. POST: konstruerer kopi af Matrix source
--------------- Init: --------------------------------------- void Init(const T& Value) PRE : true POST: Matrix initialiseret med Value
--------------- Operator []: -------------------------------- vector <T>& operator[] (size_t index) PRE : index < NoOfRows() POST: returnerer reference til række-vektor udpeget af index, LValue
const vector <T>& operator[] (size_t index) const PRE : index < NoOfRows() POST: returnerer reference til række-vektor udpeget af index, RValue
--------------- GetAt(..): -------------------------------- const T& GetAt (size_t Row, size_t Col) const; PRE : Row < NoOfRows(), 0 <= Col < NoOfCols() POST: returnerer en const reference til elementet i [Row][Col], RValue
--------------- Operator =: --------------------------------- Matrix<T>& operator= (const Matrix<T>& m) PRE : right-operand m defineret POST: Matrix assigned værdien af m, returnerer Matrix = m
----------------- Resize(): --------------------------------- void Resize(size_t Rows, size_t Cols); PRE : 0 < Rows, 0 < Cols POST: omdanner matrix til en Rows*Cols matrix. Nye elementer er initialiseret med default-værdi af elementtypen.
void Resize(size_t Rows, size_t Cols, const T& Value); PRE : 0 < Rows, 0 < Cols, Value def. POST: omdanner matrix til en Rows*Cols matrix. Nye elementer er initialiseret med Value.
--------------- NoOfRows (): ---------------------------- size_t NoOfRows () PRE : true POST: returnerer antal rækker i Matrix
--------------- NoOfCols (): ---------------------------- size_t NoOfCols () PRE : true POST: returnerer antal søjler i Matrix */
template <class T> Matrix<T>::Matrix (size_t Rows, size_t Cols) : rows(Rows) { for (size_t i = 0; i < Rows; i++) rows[i].aRow.resize(Cols); }
template <class T> Matrix<T>::Matrix (size_t Rows, size_t Cols, const T& Value) : rows(Rows) { for (size_t i = 0; i < Rows; i++) rows[i].aRow.resize(Cols, Value); }
template <class T> Matrix<T>::Matrix (const Matrix<T>& source) : rows(source.NoOfRows() ) { for (size_t i = 0; i < source.NoOfRows(); i++) { rows[i].aRow = source.rows[i].aRow; //vector assignment } }
template <class T> void Matrix<T>::Init (const T& Value) { size_t i, j; for (i=0; i < NoOfRows(); ++i) for (j=0; j < NoOfCols(); ++j) rows[i].aRow[j] = Value; }
template <class T> vector<T>& Matrix<T>::operator[] (size_t index) //LValue { assert (0 <= index && index < NoOfRows()); return rows[index].aRow; //aRow er en vector<T> //Ved indexering med [i][j] på en matrix, vil [i] //returnere vector<T> i den i'te række. //På denne bruges [j], således at det j'te element i den i'te række returneres. //Og det er netop element [i][j] i matrix'en! }
template <class T> Matrix<T>& Matrix<T>::operator= (const Matrix<T>& m) { if (this != &m) //check for selv-assignment { rows.resize(m.NoOfRows()); //frigiv eller alloker memory
//kopier rækkerne fra m, en række ad gangen: for (size_t i = 0; i < m.NoOfRows(); ++i) rows[i].aRow = m.rows[i].aRow; //vector assignment } return *this; }
template <class T> void Matrix<T>::Resize(size_t Rows, size_t Cols) { rows.resize(Rows); for (size_t i=0; i < Rows; ++i) rows[i].aRow.resize(Cols); }
Det har jeg ikke set før, jeg kan godt kompilere klassen, men hvordan instantierer (lille eksempel) jeg matrix klassen? Jeg ved ikke på forhånd hvor mange rækker der skal være i den...
Min ide er at lave en instans af denne klasse og så skrive i den ved hjælp af fil scanne klassen, men er det den "rigtige" måde at gøre det på
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.