www.vorhilfe.de
Vorhilfe

Kostenlose Kommunikationsplattform für gegenseitige Hilfestellungen.
Hallo Gast!einloggen | registrieren ]
Startseite · Forum · Wissen · Kurse · Mitglieder · Team · Impressum
Forenbaum
^ Forenbaum
Status Vorhilfe
  Status Geisteswiss.
    Status Erdkunde
    Status Geschichte
    Status Jura
    Status Musik/Kunst
    Status Pädagogik
    Status Philosophie
    Status Politik/Wirtschaft
    Status Psychologie
    Status Religion
    Status Sozialwissenschaften
  Status Informatik
    Status Schule
    Status Hochschule
    Status Info-Training
    Status Wettbewerbe
    Status Praxis
    Status Internes IR
  Status Ingenieurwiss.
    Status Bauingenieurwesen
    Status Elektrotechnik
    Status Maschinenbau
    Status Materialwissenschaft
    Status Regelungstechnik
    Status Signaltheorie
    Status Sonstiges
    Status Technik
  Status Mathe
    Status Schulmathe
    Status Hochschulmathe
    Status Mathe-Vorkurse
    Status Mathe-Software
  Status Naturwiss.
    Status Astronomie
    Status Biologie
    Status Chemie
    Status Geowissenschaften
    Status Medizin
    Status Physik
    Status Sport
  Status Sonstiges / Diverses
  Status Sprachen
    Status Deutsch
    Status Englisch
    Status Französisch
    Status Griechisch
    Status Latein
    Status Russisch
    Status Spanisch
    Status Vorkurse
    Status Sonstiges (Sprachen)
  Status Neuerdings
  Status Internes VH
    Status Café VH
    Status Verbesserungen
    Status Benutzerbetreuung
    Status Plenum
    Status Datenbank-Forum
    Status Test-Forum
    Status Fragwürdige Inhalte
    Status VH e.V.

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:

Open Source FunktionenplotterFunkyPlot: Kostenloser und quelloffener Funktionenplotter für Linux und andere Betriebssysteme
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.vorhilfe.de