matheraum.de
Raum für Mathematik
Offene Informations- und Nachhilfegemeinschaft

Für Schüler, Studenten, Lehrer, Mathematik-Interessierte.
Hallo Gast!einloggen | registrieren ]
Startseite · Forum · Wissen · Kurse · Mitglieder · Team · Impressum
Forenbaum
^ Forenbaum
Status Mathe
  Status Schulmathe
    Status Primarstufe
    Status Mathe Klassen 5-7
    Status Mathe Klassen 8-10
    Status Oberstufenmathe
    Status Mathe-Wettbewerbe
    Status Sonstiges
  Status Hochschulmathe
    Status Uni-Analysis
    Status Uni-Lin. Algebra
    Status Algebra+Zahlentheo.
    Status Diskrete Mathematik
    Status Fachdidaktik
    Status Finanz+Versicherung
    Status Logik+Mengenlehre
    Status Numerik
    Status Uni-Stochastik
    Status Topologie+Geometrie
    Status Uni-Sonstiges
  Status Mathe-Vorkurse
    Status Organisatorisches
    Status Schule
    Status Universität
  Status Mathe-Software
    Status Derive
    Status DynaGeo
    Status FunkyPlot
    Status GeoGebra
    Status LaTeX
    Status Maple
    Status MathCad
    Status Mathematica
    Status Matlab
    Status Maxima
    Status MuPad
    Status Taschenrechner

Gezeigt werden alle Foren bis zur Tiefe 2

Navigation
 Startseite...
 Neuerdings beta neu
 Forum...
 vorwissen...
 vorkurse...
 Werkzeuge...
 Nachhilfevermittlung beta...
 Online-Spiele beta
 Suchen
 Verein...
 Impressum
Das Projekt
Server und Internetanbindung werden durch Spenden finanziert.
Organisiert wird das Projekt von unserem Koordinatorenteam.
Hunderte Mitglieder helfen ehrenamtlich in unseren moderierten Foren.
Anbieter der Seite ist der gemeinnützige Verein "Vorhilfe.de e.V.".
Partnerseiten
Dt. Schulen im Ausland: Mathe-Seiten:Weitere Fächer:

Open Source FunktionenplotterFunkyPlot: Kostenloser und quelloffener Funktionenplotter für Linux und andere Betriebssysteme
StartseiteMatheForenSoftwaretechnik und ProgrammierungOOP, dynamisches Array in C++
Foren für weitere Schulfächer findest Du auf www.vorhilfe.de z.B. Informatik • Physik • Technik • Biologie • Chemie
Forum "Softwaretechnik und Programmierung" - OOP, dynamisches Array in C++
OOP, dynamisches Array in C++ < Softwaretechnik+Pro < Praktische Inform. < Hochschule < Informatik < Vorhilfe
Ansicht: [ geschachtelt ] | ^ Forum "Softwaretechnik und Programmierung"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien

OOP, dynamisches Array in C++: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 18:57 Mo 29.12.2014
Autor: kolja21

Aufgabe
Das Klasseninterface:
class GameOfLife{
public:
GameOfLife(int rows, int cols);
~GameOfLife();
// weitere Methoden
};

Implementieren Sie den Konstruktor GameOfLife(int rows, int cols). Dieser soll den für ein Spielfeld mit rows Reihen und cols Spalten benötigten Speicher automatisch allozieren. Legen Sie die für den Zugriff auf das Spielfeld nötigen Variablen im private Bereich der Klasse an. Implementieren Sie außerdem den Destruktor ~GameOfLife(), der den für das Spielfeld allozierten Speicher wieder frei gibt.

Wie ich die Aufgabe verstehe soll man für das genannte "Spielfeld" eine Matrix erstellen. Diese würde dann in dem private Bereich der Klasse deklariert werden. Da man bei C++ schon bei der Deklaration die Größe, also Anzahl der Elemente nennen muss, diese aber noch unbekannt sind, muss man Zeiger/Pointer benutzen. Die Definition erfolgt dann im Konstruktor. Und wenn im Konstruktor mit "new" Speicher alloziiert wird, muss er im Destruktor freigegeben werden. Woran es bei mir hängt ist, dass ich diese Fehlermeldung bekomme: "deleting array '((GameOfLife*)this)->GameOfLife::Matrix' [enabled by default]"
hier mein Code:

class GameOfLife {
private:
int* Matrix[];
public:
GameOfLife(int rows, int cols);
~GameOfLife();
};
GameOfLife::GameOfLife(int r, int c) {
*Matrix = new int[r * c];
}
GameOfLife::~GameOfLife(void) {
delete [] Matrix;
}

was habe ich falsch gemacht?

PS. Ich bin ein Anfänger im Programmieren und hab Null Erfahrung in OOP.

        
Bezug
OOP, dynamisches Array in C++: Antwort
Status: (Antwort) fertig Status 
Datum: 00:48 Mi 31.12.2014
Autor: Event_Horizon

Hallo!

Du machst hier was komisches.

Zunächst mal definiert man mit

int* Matrix;

aber auch mit

int Matrix[];

einen Pointer für INTs. Ob * oder [] ist egal, ggf. deutet letzteres an, daß du vor hast, das für ein Array zu verwenden, aber für den Computer ist das einerlei.


Nun, mit

int *Matrix[];

deklarierst du einen Pointer auf einen Pointer für INTs. Du könntest das auch mit

int **Matrix;

erreichen.

Dann machst du das hier:

>  *Matrix = new int[r * c];

Denk dran, Matrix eine Pointervariable (und enthält die Adresse eines Pointers, welcher wiederum die Adresse eines INTs enthalten kann), dann ist *Matrix die Adresse dieser Pointervariable selbst. Und nun kreierst du ein Array, und verschiebst Matrix an den Anfang dieses Arrays. Das dürfte von den Datentypen her schon gar nicht funktionieren, ich bin mir grade auch nicht ganz sicher. Sauber ist das ganze aber auf keinen Fall.

Generell hast du zwei Möglichkeiten:

Entweder kreierst du ein zusammenhängendes 1D-Array

int *Matrix;
Matrix = new int[r * c];

und mußt dich fortan selbst darum kümmern, aus gegebenen 2D-Koordinaten passende 1D-Koordinaten zu machen.

Besser ist aber das:


1: int **Matrix;
2: Matrix = new *int[r]; 
3: for(int i=0; i<r; i++){
4:     Matrix[i]=new int[c]
5: }


Wie gesagt, int **Matrix ist ein pointer auf pointer auf INTs. In Zeile 2 weißt du Matrix ein Array von Pointern auf INTs der Länge r zu. Und in der FOR-Schleife wird jedem der Pointer ein INT-Array zugewiesen. Vorteil: Du kannst darauf mit Matrix[x][y] zugreifen!
Um es nochmal klar zu machen: Matrix[x] ist der Pointer auf ein INT-Array, und Matrix[x][y] ist dann der wert eines einzelnen Elements.

Das bedeutet übrigens auch, daß du hier r verschiedene Speicherbereiche reservierst. Darin unterscheidet sich das vom statischen int Matrix[5][6], welches einen einzelnen, zusammenhängenden  Bereich für 5*6 INTs reserviert. (Der Computer übernimmt dann die Umrechnung von 2D zu 1D)




Vielleicht schaust du dir erstmal das eingehend an ;-)





Bezug
                
Bezug
OOP, dynamisches Array in C++: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 14:10 Mi 31.12.2014
Autor: kolja21

Erst mal vielen Dank für die Hilfe.
Dieses Prizip (mit Pointer, die auf Pointer zeigen, und so eine Matrix bilden) kenne ich schon. Leider funktioniert es nich so wie ich es schreibe in Klassen, also OOP.
Hier der Code:

class GameOfLife {
private:
int** Matrix;
public:
GameOfLife(int rows, int cols);
~GameOfLife();
};
GameOfLife::GameOfLife(int r, int c) {
Matrix = new int[r];
for (int i=0; i<r; i++) {
Matrix[i] = new int[c];
}
}
GameOfLife::~GameOfLife(void) {
delete[] Matrix;
}

Das liefert diese Meldung: "cannot convert 'int*' to 'int**' in assignment" bei Zeile: Matrix = new int[r];

Die andere Frage ist, wie rechnet man ein 2-D Array in eine 1-D Array um? Vielleicht klappt es ja so?

Bezug
                        
Bezug
OOP, dynamisches Array in C++: Antwort
Status: (Antwort) fertig Status 
Datum: 16:57 Mi 31.12.2014
Autor: felixf

Moin!

> Erst mal vielen Dank für die Hilfe.
>  Dieses Prizip (mit Pointer, die auf Pointer zeigen, und so
> eine Matrix bilden) kenne ich schon. Leider funktioniert es
> nich so wie ich es schreibe in Klassen, also OOP.
>  Hier der Code:
>  
> class GameOfLife {
>  private:
>   int** Matrix;
>  public:
>   GameOfLife(int rows, int cols);
>   ~GameOfLife();
>  };
>  GameOfLife::GameOfLife(int r, int c) {
>   Matrix = new int[r];
>   for (int i=0; i<r; i++) {
>   Matrix = new int[c];
> }
> }
> GameOfLife::~GameOfLife(void) {
> delete[] Matrix;
> }
>
> Das liefert diese Meldung: "cannot convert 'int*' to
> 'int**' in assignment" bei Zeile: Matrix = new int[r];

Kein Wunder: links steht ja auch ein Array von Arrays, und du willst dem ein einfaches int-Array zuweisen.

Versuch's doch mal mit new int[][c]; oder new (int*)[c];.

> Die andere Frage ist, wie rechnet man ein 2-D Array in eine
> 1-D Array um? Vielleicht klappt es ja so?

Was meinst du mit "umrechnen"?

Wenn du ein Array $A$ mit r*c Elementen hast, kannst du auf das $(i, j)$-Element mit $A[i*c + j]$ zugreifen (mit $0 [mm] \le [/mm] i < r$ und $0 [mm] \le [/mm] j < c$).

LG Felix


Bezug
                                
Bezug
OOP, dynamisches Array in C++: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 16:51 Do 01.01.2015
Autor: kolja21

Ist das alles? Weil wenn ich das:
    Matrix = new int[c];
ersetze gegen:
    Matrix = new int[][c];
bekomme ich diese Meldung: "Multiple markers at this line
- 'c' is not a constant expression
- expected primary-expression before ']' token
- array size in operator new must be constant"

und bei Matrix = new (int*)[c];
kommt das:"Multiple markers at this line
- Syntax error
- array bound forbidden after parenthesized type-id
- try removing the parentheses around the type-id
- Missing ';'
- cannot convert 'int**' to 'int*' in assignment"

vielleicht habe ich dich auch falsch verstanden und hätte noch was anderes ändern sollen? sorry, ich bin noch zu schlecht in c++

Bezug
                                        
Bezug
OOP, dynamisches Array in C++: Antwort
Status: (Antwort) fertig Status 
Datum: 18:06 Fr 02.01.2015
Autor: felixf

Moin!

> Ist das alles? Weil wenn ich das:
>      Matrix = new int[c];
>  ersetze gegen:
>      Matrix = new int[][c];
>  bekomme ich diese Meldung: "Multiple markers at this line
> - 'c' is not a constant expression
>   - expected primary-expression before ']' token
>   - array size in operator new must be constant"
>  
> und bei Matrix = new (int*)[c];
>  kommt das:"Multiple markers at this line
>   - Syntax error
>   - array bound forbidden after parenthesized type-id
>   - try removing the parentheses around the type-id
>   - Missing ';'
>   - cannot convert 'int**' to 'int*' in assignment"

Stimmt, beides geht so nicht. Was geht, ist  Matrix = new int*[c]; . Alternativ kannst du einen typedef verwenden.

Wenn es nicht einen sehr guten Grund gibt, das ganze als Array von Arrays zu realiseren, würde ich das allerdings als "flaches" Array (mit $r * c$ Elementen) realisieren. Damit kann man einfacher umgehen (sieht man mal von der Indexarithmetik ab).

Alternativ würde ich dir empfehlen, []modernes C++ zu verwenden und nicht 90er-Jahre-C++ :-) (Siehe insbesondere []std::unique_ptr<T[]> sowie []std::make_unique<T[]>(std::size_t).)

LG Felix


Bezug
Ansicht: [ geschachtelt ] | ^ Forum "Softwaretechnik und Programmierung"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien


^ Seitenanfang ^
www.matheraum.de
[ Startseite | Forum | Wissen | Kurse | Mitglieder | Team | Impressum ]