Dateien einlesen.
-
Alternativ wollte ich das new verwendet, aber auch da habe ich leider meine Probleme mit.
C Version
unsigned char *variable = (unsigned char*) malloc(filesize+1); read(handle,&variable[0],filesize); free (variable);C++ mit new
unsigned char *variable = new unsigned char(filesize+1); read(handle,&variable[0],filesize); delete[] variable;Ergebnis: Crash in read()

C++ mit auto_ptr
auto_ptr<unsigned char> variable( new unsigned char(filesize) ); read(handle,&variable[0],filesize);Ergebnis: Binaerer Operator '[' : 'class std::auto_ptr<unsigned char>' definiert diesen Operator oder eine Konvertierung in einen für den vordefinierten Operator geeigneten Typ nicht
Ich wüsste jetzt natürlich gerne warum new und auto_ptr nicht funktionieren

-
cianner schrieb:
C++ mit new
unsigned char *variable = new unsigned char(filesize+1); read(handle,&variable[0],filesize); delete[] variable;Ergebnis: Crash in read()

...
Ich wüsste jetzt natürlich gerne warum new und auto_ptr nicht funktionieren

Deine new-Version erzeugt EIN char mit dem Wert '(filesize+1)%256', um ein Array von chars anzulegen, benötigst du eckige Klammern:
unsigned char* variable = new unsigned char[filesize+1];(und auto_ptr ist sowieso nur für Solo-Objekte vorgesehen - schau dir doch mal Boost's scoped_array an)
-
Danke! Nachdem ich den Text abgesendet hatte, ist mir das auch aufgefallen, ich wollte aber nicht direkt auf den Beitrag gleich antworten.
Ich habe mir mal boost_1_33_1 raufgehauen.
#include "boost/scoped_ptr.hpp" using namespace boost; scoped_ptr<unsigned char> variable(new unsigned char[filesize+1]); read(handle,&variable[0],filesize);Ergebnis: Binaerer Operator '[' : 'class boost::scoped_ptr<unsigned char>' definiert diesen Operator oder eine Konvertierung in einen für den vordefinierten Operator geeigneten Typ nicht

-
scoped_ptr ist ja ebenfalls für Solo-Objekte gedacht - ich sagte vorhin scoped_array (und der hat auch einen Subscript-Operator).
-
Vielen Dank!! Scheisse wenn man nicht lesen kann

Jetzt muss ich doch gleich ne Zusatzfrage stellen.
Ich will die variable in einer Klasse definieren.
Als new würde man das so machenclass bla { private: unsigned char *variable; } bla:bla() { long filesize = ...... variable = new unsigned char[filesize+1]; }Wie müsste das bei scoped_array() ausschauen? Ich bekomme es absolut nicht hin zu teilen *zu blöd dafür bin*
-
In dem Fall mußt du wohl die Initialisierungsliste des Ctors verwenden:
class test { public: test(int fsize) : filsize(fsize), filedata(new unsigned char[fsize+1] { ... } private: int filesize; scoped_array<unsigned char> filedata; //bei näherem Überlegen: hier wäre ein shared_array wohl hilfreicher };
-
Das sind um die 30 Variablen die ich benötige, die müssen alle so initialisiert werden? *igh*
-
Argh ich wollte doch "Vorschau" anklickern.
Anders gefragt... dieser Zweizeiler:
unsigned char *variable; variable = new unsigned char[filesize+1];müsste bitte wie für scoped_array aussschauen?
scoped_array<unsigned char> variable; variable(new unsigned char[filesize+1]);Hier meckert er ja das es keine Funktion ist.

Und warum sollte shared_array besser geeignet sein?
-
30 Variablen? Was soll denn das werden
?
-
scoped_array's besitzen keinen Zuweisungsoperator (und erst recht keinen op()), also mußt du sie direkt beim Erzeugen initialisieren:
scoped_array<char> var(new char[size+1];(und shared_arrays haben den Vorteil, daß sie Referenzzählung und Kopier-Operationen unterstützen)
PS: Im Magazin gibt es übrigens einen Artikel über die ganzen Boost-Smartpointer - den solltest du dir mal durchlesen

-
Schade, dann nehme ich lieber die new/delete methode oder bleibe gleich beim Original. Das macht dann auch keinen wirklichen Unterschied.