Ich habe eine Klasse mit dem Namen RS232 erstellt. In dieser Klasse habe ich unter private eine Variable und ein Array deklariert. class RS232 { private: INT TEST; CHAR buffer[TEST]; public: .... } Jetzt ist es so dass ich den Inhalt der Varible erst bekomme wenn ich eine INI Datei ausgelesen habe. Dann wird der Wert der Variable TEST übergeben. Daraufhin soll dann das Array buffer den Index dementsprechend mit der Variable Test hochsetzen. Fehler vom Compiler: Konstanter Ausdruck erwartet Reservierung eines Feldes der konstanten Groesse 0 nicht moeglich
Der buffer wird in anderen C Programmdateien verwendet. RS232 *com1; com1->buffer[1];
Deine Array Definition ist falsch. Du musst ein Array mit einer konkreten Größe definieren, also zB: char buffer[10]; Was willst du denn mit deinem Konstrukt erreichen? Willst du ein Array mit der Größe des Wertes von TEST erstellen?
Ja genau ich möchte mit dem Konstruktor das Array mit der Größe des Wertes von Test erstellen.
Die Größe vom Array weiss ich doch nur dann, wenn ich die INI Datei ausgelesen habe.
C++ sollte dazu die Klasse std::string kennen (bin mir aber nicht sicher, ob die Teil des C++-Standards ist - auf jeden Fall ist sie in der STL) Alternativ müsstest Du Dich mit malloc / free bzw. deren C++-Pendants new, delete und new[] und delete[] beschäftigen. Gruss, RSp
> RS232 *com1; > com1->buffer[1]; Beachte, dass Du buffer als private deklariert hast!
Die Methode mit der ich die Ini Datei auslese, ist in der Klasse RS232 deklariert und definiert. Wenn ich im Konstruktor die Größe vom Array festlegen will, dann weiss ich ja nicht welchen wert die Variable Test hat. Erst nach dem Konstruktor wurd die Methode ReadInI() ausgeführt.
vector aus der STL ist wahrscheinlich der Datentyp, den du suchst. Er entspricht in Aufbau und Zugriffsmethode dem normale C-Array, im Gegensatz zu diesem, kann seine Größe zur Laufzeit verändert werden. #include <vector> Der Rest steht hier: http://www.sgi.com/tech/stl/Vector.html
Du kennst zur Kompilezeit also die vorgesehene Grösse des Arrays nicht. Erst zur Laufzeit kannst du die Grösse per INI-Datei ermitteln. Dann lege den buffer nicht zur Kompilezeit als Array an, sondern nimm dir zur Laufzeit dynamisch den Speicher und lege buffer als Pointer auf diesen Speicher an. Dynamischen Speicher bekommst du bzw. gibst du frei in C mit malloc/free und in C++ mit dem bereits erwähnten new/delete bzw. über die entsprechenden Klassen wie das bereits erwähnte std::string
Wobei: new/delete (oder malloc/free (*) ) solltest du nur dann benutzen, wenn * du weist was du tust * du das Wissen hast, wie man damit umgeht * du einen extrem guten Grund hast, warum du das Memory Mangement unbedingt selbst machen willst * dein Boss das unbedingt so haben will und man ihm das auch nicht ausreden kann Ansonsten benutze entweder std::string wenn die Daten tatsächlichen 'String' Charakter haben std::vector wenn der Array-Charakter im Vordergrund steht. (*) malloc/free sollte in C++ eigentlich überhaupt nicht benutzt werden. Es mag Ausnahmen geben, wenn man Interfaces zu C Code machen muss, aber abgesehen davon, ist new/delete immer besser.
Rufus t. Firefly wrote: > Und std::string kommt ohne dynamische Speicherverwaltung aus? > Interessant. Worauf spielst du an? Natürlich kommt std::string nicht ohne dynamische Speicherverwaltung aus. Aber es ist in std::string gekapselt, von Profis geschrieben worden, getestet und funktioniert. Vor allem letzteres kann man von diversen Eigenbau malloc/free new/delete Lösungen nicht sagen.
Gut. Ein wenig hatte ich den Eindruck, daß std::string als Alternative zum generellen__Einsatz von dynamischer Speicherverwaltung empfohlen würde - das war offensichtlich (m)ein Missverständnis, es ging Dir um die Alternative zum Selbstgefrickelten. Ja, das auf jeden Fall. Unbedingt.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.