mikrocontroller.net

Forum: PC-Programmierung Hilfe in C++


Autor: CUSER (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: CUSER (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der buffer wird in anderen C Programmdateien verwendet.

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

Autor: Timo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: CUSER (Gast)
Datum:

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

Autor: CUSER (Gast)
Datum:

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

Autor: duselbaer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: duselbaer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> RS232 *com1;
> com1->buffer[1];

Beachte, dass Du buffer als private deklariert hast!

Autor: CUSER (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und std::string kommt ohne dynamische Speicherverwaltung aus? 
Interessant.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.




Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.