Problem mit einem Template [SOLVED]
-
Du solltest dir wirklich dringend mal Klassen ansehen. Tut mir Leid das so sagen zu müssen, aber den Code zu lesen tut weh wenn man weiß was Destruktoren sind.

-
Ich weis schon was Klassen sind im moment gehts mir erstmal darum die Funktionen laufend zu bekommen. Dann kann ich das Ganze immernoch in eine Klasse einkapseln, und btw. lehn dich zurück und schau dir mal den Code aus deiner Aanfangszeit an, und dann bedenke das ich grade mal seit 2-3 Wochen in c++ code, und davor zu 80% nur mit Sriptsprachen gearbeitet habe die nicht über Zeiger verfügt haben und bei weitem nicht so anspruchsvoll mit den Datentypen waren.
template <typename T> void copy_to_matrix(T* dBuffer, T** dArray, int arrayrange) { bool split = false; int a, b, c = 0; for(a = 0; a < arrayrange; a++) { for(b = 0; b < arrayrange; b++) { if((split == false)&&(dBuffer[c] != '\0')) { dArray[a][b] = dBuffer[c]; c++; } else { split = true; dArray[a][b] = '\0'; } } } }Des Rätzels Lösung, nun sieht der Dump auch so aus wie er aussehen sollte. Bleibt nur noch meine Frage zu den Variablen.
-
Videonauth schrieb:
Ich weis schon was Klassen sind im moment gehts mir erstmal darum die Funktionen laufend zu bekommen. Dann kann ich das Ganze immernoch in eine Klasse einkapseln, und btw. lehn dich zurück und schau dir mal den Code aus deiner Aanfangszeit an, und dann bedenke das ich grade mal seit 2-3 Wochen in c++ code, und davor zu 80% nur mit Sriptsprachen gearbeitet habe die nicht über Zeiger verfügt haben und bei weitem nicht so anspruchsvoll mit den Datentypen waren.
Eine Skriptsprache ohne Zeiger, gibt es so etwas?
Gerade weil C++ so "anspruchsvoll" ist, benutzt man Klassen. Lern was eine Klasse ist und vergiss dennew[]-Operator ganz schnell. Du suchst eigentlichvector.
-
Videonauth schrieb:
Ich weis schon was Klassen sind im moment gehts mir erstmal darum die Funktionen laufend zu bekommen.
Klassen sind nicht irgendwelcher Syntaxzucker, die werden dein Problem quasi von alleine Lösen, weil alles so viel übersichtlicher wird. Du musst ja nicht gleich alles mit Templates machen. Einfach nur:
class matrix { std::vector<std::vector<double>> data_; public: matrix(std::size_t x, std::size_t y) : data_(x, std::vector<double>(y)) {} // ... };Und darauf aufbauen. Ist zwar verdammt langsam etc., aber immerhin ein Anfang. Dein doppeltes Pointer gefrickel ist das schlimmste, unübersichtlichste und gleichzeitig auch noch mehr oder weniger langsamste was man machen kann. Guck dir Klassen an, es lohnt sich.

-
Naja hab das erste part nun mal eingekapselt und umgeschrieben, ich mein ich entwickel mich ja auch weiter mit jeder Zeile Code die ich schreibe, der File Handler sieht nun z.b. so aus:
class File { private: std::string m_sFilename; std::fstream m_fFilestream; int m_nFilesize; public: File() { } File(std::string sFilename) { this->m_sFilename = sFilename; this->set_filesize(); } ~File() { } void set_name(std::string sFilename) { this->m_sFilename = sFilename; this->set_filesize(); } std::string get_name(void) { return this->m_sFilename; } int get_filesize(void) { return this->m_nFilesize; } void set_filesize(void) { this->m_fFilestream.open(this->m_sFilename.c_str(), std::fstream::in | std::fstream::binary); if(this->m_fFilestream.is_open()) { this->m_fFilestream.seekg(0, std::fstream::end); this->m_nFilesize = this->m_fFilestream.tellg(); this->m_fFilestream.seekg(0, std::fstream::beg); this->m_fFilestream.close(); } } std::vector<char> load(void) { std::vector<char> buffer(this->m_nFilesize); this->m_fFilestream.open(this->m_sFilename.c_str(), std::fstream::in | std::fstream::binary); if(this->m_fFilestream.is_open()) { this->m_fFilestream.read(&buffer[0], this->m_nFilesize); this->m_fFilestream.close(); } return buffer; } void save(std::vector<char> vBuffer) { this->m_fFilestream.open(this->m_sFilename.c_str(), std::fstream::out | std::fstream::binary | std::fstream::trunc) if(this->m_fFilestream.is_open()) { this->m_fFilestream.write(&vBuffer[0], vBuffer.size()); this->m_fFilestream.close(); } } void save(std::vector<char> vBuffer, bool bTrunc) { if(bTrunc == false) { this->m_fFilestream.open(this->m_sFilename.c_str(), std::fstream::out | std::fstream::binary); } if(bTrunc == true) { this->m_fFilestream.open(this->m_sFilename.c_str(), std::fstream::out | std::fstream::binary | std::fstream::trunc); } if(this->m_fFilestream.is_open()) { this->m_fFilestream.write(&vBuffer[0], vBuffer.size()); this->m_fFilestream.close(); } } };Frage: gibt es für ...
this->m_fFilestream.write(&vBuffer[0], vBuffer.size());ne bessere schreibweise also das man das &vBuffer[] ansers auflösen kann ?
Komme da mit den tutorials und der Referenz nicht unbedingt weiter.
-
Videonauth schrieb:
Frage: gibt es für ...
this->m_fFilestream.write(&vBuffer[0], vBuffer.size());ne bessere schreibweise also das man das &vBuffer[] ansers auflösen kann ?
Komme da mit den tutorials und der Referenz nicht unbedingt weiter.Nein, gibt es nicht.
Du hast den Fall vergessen, dass der Puffer leer ist.
-
Oops, danke das hab ich übersehen, das hier ...
if(this->m_fFilestream.is_open() && vBuffer.size() != NULL)... sollte es lösen.
-
Videonauth schrieb:
Oops, danke das hab ich übersehen, das hier ...
if(this->m_fFilestream.is_open() && vBuffer.size() != NULL)... sollte es lösen.
NULL ist eigentlich für Zeiger, hier wäre einfach 0 besser.
-
Danke, habs korrigiert. So mal weiter am rest arbeiten, werde dann nochmal Updates posten.
-
Videonauth schrieb:
Danke, habs korrigiert. So mal weiter am rest arbeiten, werde dann nochmal Updates posten.
Noch ein paar Tipps:
- Lass die ungarische Notation. (Dieses int nFoo, std::string sFoo etc.)
- Schreib nicht this->, es sei denn es ist nötig. (Wenn der Name zweideutig ist.)
- Schreibe nicht (void), sondern (). Das (void) sieht so nach C aus.
- Lies dir mal was zu Pointern/Referenzen durch. Das ist jetzt zwar noch nicht soo wichtig, aber es dauert auch nicht lange.
- Deine File Klasse hat ja nicht mal eine write Methode! Diese solltest du erst machen. Diese save() Methode im allgemeinen könnte man zum flushen nutzen, aber du kannst doch nicht einfach so die Datei schließen!PS: Nimm doch ein C-Handle, dann sieht das nicht ganz so sinnlos aus.
