www.mikrocontroller.net

Forum: PC-Programmierung C++ Array dynamisch anlegen


Autor: Petty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab in C++ folgendes Problem.
Ich habe eine Klasse z.B. CBaum. Nun möchte ich in dieser Klasse ein 
Array dynamisch erstellen. Zuvor habe ich die gewünschte Array Größe 
(array_size_w und array_size_h) während der Programmlaufzeit ermittelt.
Wie kann man in C++ nun in einer Klasse ein Array mit der Größe 
array_size_w*array_size_h anlegen?

classe CBaum
{
int array_size_w;
int array_size_h;
BYTE *daten;

CBaum();
}

//Konstruktor
CBaum::CBaum()
{
daten=new BYTE[array_size_w*array_size_h];
}

//Beispiel Hauptprogramm
void main(void)
{
CBaum baum_obj;
baum_obj.daten[1]=55;
}

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bin kein C++ler, aber so vielleicht:

//Konstruktor
CBaum::CBaum(int w, int h)
{
array_size_w = w;
array_size_h = h;
daten=new BYTE[array_size_w*array_size_h];
}

//Beispiel Hauptprogramm
void main(void)
{
CBaum baum_obj(111, 222); /* Oder was auch immer */
baum_obj.daten[1]=55;
}

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wie kann man in C++ nun in einer Klasse ein Array mit der Größe
> array_size_w*array_size_h anlegen?

So wie man es an jeder anderen Stelle auch macht. Mit new. Da du das 
schon tust, verstehe ich die Frage nicht. Dein Programm hat aber noch 
einige andere Fehler, die ich unten mal kommentiert habe.
Noch was anderes: Wenn du das Array dynamisch erzeugst, mußt du es auch 
wieder freigeben, denn sonst hast du ein Speicherleck.

> classe CBaum

Du meintest sicherlich:
class CBaum

Was ist eigentlich ein C-Baum?

> {
> int array_size_w;
> int array_size_h;
> BYTE *daten;
>
> CBaum();

Diese Member sind allesamt privat, also wirst du nie darauf zugreifen 
können.

> }

Hier fehlt ein Semikolon.

> //Konstruktor
> CBaum::CBaum()
> {
> daten=new BYTE[array_size_w*array_size_h];
> }

array_size_w und array_size_h haben hier noch undefinerte Werte. 
Außerdem sollte man Membervariablen in der Initialisierungsliste mit 
Werten belegen, also eher so:
CBaum::CBaum()
    : daten(new BYTE[array_size_w*array_size_h])
{
}

> void main(void)

main muß immer int zurückgeben.

Autor: Petty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Hilfe. Wenn ich es so mache dann erscheint folgende 
Fehlermeldung:
Unbehandelte Ausnahme in Test.exe: 0xC0000005: Access Violation

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wenn ich es so mache dann erscheint folgende Fehlermeldung

Was ist denn "so"? Dein Code von oben wird so gar nicht erst durch den 
Compiler gehen. Also mußt du wohl irgendwelchen anderen Code probiert 
haben. Poste doch diesen bitte mal. Und bitte keinen für das Posting neu 
eingetippten Code mit einem Dutzend anderen Fehlern, dafür ohne den 
Fehler, um den es eigentlich geht, sondern den Originalcode, den du 
durch den Compiler geschickt hast.

Autor: Petty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das verstehe ich nicht:
CBaum::CBaum()
    : daten(new BYTE[array_size_w*array_size_h])
{
}

ist da nicht ein Fehler?

Autor: Petty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
class Chisto
{
public:
  int array_size_w;
  int array_size_h;
  BYTE *bildgrau;

  Chisto(int w, int h);

};

// Konstruktor
Chisto::Chisto(int w, int h)
{
  array_size_w = w;
  array_size_h = h;
  bildgrau[array_size_w*array_size_h];
}

// Hauptprogramm
void main (void)
{
...
Chisto histo_obj(infoheader.biWidth,infoheader.biHeight);
...
histo_obj.bildgrau[j*infoheader.biHeight+i] = gray;
}

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Das verstehe ich nicht:
>
> CBaum::CBaum()
>     : daten(new BYTE[array_size_w*array_size_h])
> {
> }
>
>
> ist da nicht ein Fehler?

Nein (außer ich hab was übersehen).
Membervariablen werden in der Initialisierungsliste initialisiert, und 
die sieht eben so aus. Für einfache Datentypen wie int und Zeiger spielt 
es keine große Rolle, ob du sie initialisierst oder ihnen stattdessen im 
Konstruktorkörper einen Wert zuweist. Wenn du aber auch Konstanten, 
Referenzen oder Instanzen von Klassen als Member hast, macht es einen 
Unterschied. Am besten gewöhnt man sich gleich eine ordentliche 
Initialisierung an.


> Chisto::Chisto(int w, int h)
> {
>   array_size_w = w;
>   array_size_h = h;
>   bildgrau[array_size_w*array_size_h];

Wo ist denn das new hin? Die obige Zeile tut so wie sie da steht gar 
nichts.

> }

Autor: Petty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
class Chisto
{
public:
  int array_size_w;
  int array_size_h;
  BYTE *bildgrau;

  Chisto();

};

// Konstruktor
Chisto::Chisto()
   :bildgrau(new BYTE[array_size_w*array_size_h])
{
}

// Hauptprogramm
void main (void)
{
...
Chisto histo_obj(infoheader.biWidth,infoheader.biHeight);
histo_obj.array_size_w = infoheader.biWidth; 
histo_obj.array_size_h = infoheader.biHeight;
...
histo_obj.bildgrau[2] = gray;
...

Fehlermeldung: nicht genügend Speicher platz!

Autor: Petty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry hab da nich ein Fehler im Programm gesehen.

Jetzt erscheint die Fehlermeldung: Nicht genügend Speicherplatz 
vorhanden!
class Chisto
{
public:
  int array_size_w;
  int array_size_h;
  BYTE *bildgrau;

  Chisto();

};

// Konstruktor
Chisto::Chisto()
   :bildgrau(new BYTE[array_size_w*array_size_h])
{
}

// Hauptprogramm
void main (void)
{
...
Chisto histo_obj;
histo_obj.array_size_w = infoheader.biWidth; 
histo_obj.array_size_h = infoheader.biHeight;
...
histo_obj.bildgrau[2] = gray;
...

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du mußt array_size_w und array_size_h schon auch initialisieren. Deine 
Zuweisung aus main kommt ja erst nach dem Konstruktor, der diese Werte 
schon braucht. Svens Antwort kombiniert mit der Initialisierungsliste:
//Konstruktor
CBaum::CBaum(int w, int h)
    : array_size_w(w),
      array_size_h(h),
      daten(new BYTE[array_size_w*array_size_h])
{
}

Dann in main:
Chisto histo_obj(infoheader.biWidth, infoheader.biHeigt);

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh gott, wie wäre es denn mal mit einem C++ Buch?

Autor: Christoph __ (chris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erstmal: Wo ist das delete[]?
Zweitens: Warum nimmst du nicht direkt std::vector<BYTE> und sparst dir 
das ganze new/delete-Gewurschtel? Wenn du vector nicht kennst, tipp 
bitte "vector C++" in google ein bevor du hier danach fragst.

Ausserdem:
Du hast ja immer noch void main(void) da stehen, obwohl das oben schon 
mal kritisiert wurde? Wenn du Hilfe kommentarlos ignorierst, verlieren 
hier viele Leute schnell die Lust dir weiter zu antworten.


btw: Das Praefix "C" vor einer Klasse stammt uebrigens aus grauer 
Vorzeit, und genau genommen sogar aus einem Missverstaendnis: Die MFC 
(von Microsoft) hat C als Praefix fuer Klassen benutzt, damit die 
Klassen der User nicht mit den Klassen der MFC kollidieren. Die Idee 
war, dass die Klassen der MFC "C" als Praefix haben und die Klassen der 
User eben gerade kein Praefix. Ein manueller namespace, sozusagen.
Wenn nun aber normale Programmierer ihre Klassen mit demselben Praefix 
versehen wie die MFC, untergraebt das den urspruenglichen Sinn des 
Praefixes voellig. In modernem C++ nimmt man daher einen namespace und 
kein Praefix.

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.