Forum: PC-Programmierung Hilfe in C++


von CUSER (Gast)


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

von CUSER (Gast)


Lesenswert?

Der buffer wird in anderen C Programmdateien verwendet.

RS232 *com1;
com1->buffer[1];

von Timo (Gast)


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?

von CUSER (Gast)


Lesenswert?

Ja genau ich möchte mit dem Konstruktor das Array mit der Größe des 
Wertes von Test erstellen.

von CUSER (Gast)


Lesenswert?

Die Größe vom Array weiss ich doch nur dann, wenn ich die INI Datei 
ausgelesen habe.

von duselbaer (Gast)


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

von duselbaer (Gast)


Lesenswert?

> RS232 *com1;
> com1->buffer[1];

Beachte, dass Du buffer als private deklariert hast!

von CUSER (Gast)


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.

von yalu (Gast)


Lesenswert?

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

von Stefan B. (stefan) Benutzerseite


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

von Karl H. (kbuchegg)


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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Und std::string kommt ohne dynamische Speicherverwaltung aus? 
Interessant.

von Karl H. (kbuchegg)


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.




von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.