Hilfe in C++

Gast #585989
Lesenswert?

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
Gast #586002
Lesenswert?

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?
Gast #586014
Lesenswert?

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
Gast #586040
Lesenswert?

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.
Persönliche Seite #586071
Lesenswert?

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
#586129
Lesenswert?

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.
#586245
Lesenswert?

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.



Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren