JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=69a1a65eacd48366f528833fc7379f43Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

new mit zweidimensionalem Array

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Robrunner
Mini JLI'ler


Alter: 32
Anmeldedatum: 08.07.2007
Beiträge: 44
Wohnort: Passau
Medaillen: Keine

BeitragVerfasst am: 19.10.2007, 16:07    Titel: new mit zweidimensionalem Array Antworten mit Zitat

Ich habe eine doppelte Pointer-Variable
CPP:
int **array;

und möchte bei beiden Dimensionen des Arrays seperat die Größe angeben. Wie funktioniert das??
Das geht nämlich nicht:
CPP:
array=new int[2][3];

_________________
Wer einen Rechtschreibfehler findet darf ihn behalten.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 19.10.2007, 16:19    Titel: Antworten mit Zitat

Mach ne Schleife zum erstellen und freigeben.
Erst legt du 50 Pointer an und dann in ner Schleife für jeden der Pointer dein einzelnes Array.
Beim freigeben genau umgekehrt.
Ist etwas mehr Aufwand aber naja anders gehts net wirklich (es sei den du benutzt irgendwelche Containerklassen oder Hilfskonstrukte).
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Robrunner
Mini JLI'ler


Alter: 32
Anmeldedatum: 08.07.2007
Beiträge: 44
Wohnort: Passau
Medaillen: Keine

BeitragVerfasst am: 19.10.2007, 16:35    Titel: Antworten mit Zitat

Danke für die schnelle Antwort!!

Kennst du eine Containerklasse, mit der das funktionieren würde?
_________________
Wer einen Rechtschreibfehler findet darf ihn behalten.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 19.10.2007, 17:18    Titel: Antworten mit Zitat

Für 2d nicht direkt aber für 1d ist std::vector halt gut. Damit kann man natürlich den selben Trick machen und ist dann etwas konfortabler.
Aber für 2D Sollte es auch Vereinfachungen geben, musst du im zweifelsfalle mal das Netz durchsuchen.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Deviloper
Junior JLI'ler



Anmeldedatum: 31.05.2006
Beiträge: 77

Medaillen: Keine

BeitragVerfasst am: 19.10.2007, 23:29    Titel: Antworten mit Zitat

Also ...
Ansonsten:
1.1 C++ Container Class (std::vector)
(Ein Vector von Vectoren von Integern)
CPP:
std::vector< std::vector<int> > array;


1.2 2D Array Klasse
(nicht-optimierte Version; ungetestet; unvollständig)

CPP:
template<typename T>
class second_dimension_array
{
    T** m_data;
    std::size_t m_x;
    std::size_t m_y;

public:
    second_dimension_array(std::size_t x, std::size_t y) : m_y(y), m_x(x)
    {
        m_data = new T*[x];
        for (std::size_t i = 0; i < x; ++i) m_data[i] = new T[y];
    }
    ~second_dimension_array()
    {
        for (std::size_t i = 0; i < m_x; ++i) delete [] m_data[i];
        delete [] m_data;
    }
   
public:
    std::size_t size() const { return m_x * m_y; }
    T const& at(std::size_t x, std::size_t y) const { if (x >= m_x || y >= m_y) throw std::out_of_range("x and/or y"); return m_data[x][y]; }
    T& at(std::size_t x, std::size_t y) { if (x >= m_x || y >= m_y) throw std::out_of_range("x and/or y"); return m_data[x][y]; }
 
public:
    T const& operator[](std::size_t x) const { return m_data[x]; }
    T& operator[](std::size_t x) { return m_data[x]; }
};


2.1 Von 2D auf 1D
Formel: x + y * length_x
Beispiel:
geg.: Array(10, 20);
ges.: data(x = 5, y = 2)
data = 5 + 2 * 20

2.2 2D Array Klasse (1D Basis)
(nicht-optimierte Version; ungetestet; unvollständig)

CPP:
template<typename T>
class second_dimension_array
{
    T* m_data;
    std::size_t m_x;
    std::size_t m_y;

public:
    second_dimension_array(std::size_t x, std::size_t y) : m_y(y), m_x(x)
    {
        m_data = new T[x * y];
    }
    ~second_dimension_array()
    {
        delete [] m_data;
    }
   
public:
    std::size_t size() const { return m_x * m_y; }
    T const& at(std::size_t x, std::size_t y) const { if (x >= m_x || y >= m_y) throw std::out_of_range("x and/or y"); return m_data[x + y * m_x]; }
    T& at(std::size_t x, std::size_t y) { if (x >= m_x || y >= m_y) throw std::out_of_range("x and/or y"); return m_data[x + y * m_x]; }

public:
    T const& operator[](std::size_t x) const { return m_data[x * m_y]; }
    T& operator[](std::size_t x) { return m_data[x * m_y]; }
};


2.2.Hinweiß
Es kann sein, dass ich ich bei der Formel für die Projektion eines zwei-dimensionalen Array auf einen ein-dimensionalen Array vertan habe.

Bearbeitung
(1) T const& at(std::size_t x, std::size_t y) const hinzugefügt.
(2) T& at(std::size_t x, std::size_t y) hinzugefügt.
(3) Struktur des Beitrags korrigiert.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 23.10.2007, 15:27    Titel: Antworten mit Zitat

Schau dir stattdessen lieber die Boost-Bibliothek an. Die ist quasi eine Erweiterung zu C++/STL und hat auch STL-konforme Containerklassen, unter anderem auch ein multi-array. Boost gibt es hier:

http://boost.org/
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 23.10.2007, 17:28    Titel: Antworten mit Zitat

dabei wäre dann auch tr1 (auch wunderfein, nur net so voll und umfangreich ;P ) und asio, eine Klasse net-lib für alles rund ums net und wie boost in schönstem c++

Gruß DXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Robrunner
Mini JLI'ler


Alter: 32
Anmeldedatum: 08.07.2007
Beiträge: 44
Wohnort: Passau
Medaillen: Keine

BeitragVerfasst am: 24.10.2007, 10:50    Titel: Antworten mit Zitat

OK danke euch allen!
Ich denke ich werde es einfach so machen wie es Jonathan gesagt hat.
_________________
Wer einen Rechtschreibfehler findet darf ihn behalten.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 26.10.2007, 07:56    Titel: Antworten mit Zitat

Wenn die Länge der einzelnen Zeilen konstant ist kannst du auch ein 1D Array der Größe Breite * Höhe verwenden und die einzelnen X/Y Positionen deines Feldes wie folgt ansprechen:

CPP:
std::vector<int> myArray;
myArray.resize(width * height);

// Array-Zelle ansprechen an Position (X / Y)

int PositionToIndex(x, y)
{
  return ( y*width + x );
}

// Wert 20 in die Zelle (3 / 5) schreiben
myArray[PositionToIndex(3, 5)] = 20;

_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Robrunner
Mini JLI'ler


Alter: 32
Anmeldedatum: 08.07.2007
Beiträge: 44
Wohnort: Passau
Medaillen: Keine

BeitragVerfasst am: 26.10.2007, 11:42    Titel: Antworten mit Zitat

Razz Das ist ja genial, Danke!!!
_________________
Wer einen Rechtschreibfehler findet darf ihn behalten.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Deviloper
Junior JLI'ler



Anmeldedatum: 31.05.2006
Beiträge: 77

Medaillen: Keine

BeitragVerfasst am: 26.10.2007, 12:34    Titel: Antworten mit Zitat

Ehm wenn du einfach mal gelesen hast, was ich oben geschrieben habe ... dann hättest du das schon vor einer Ewigkeit gesehen ...
Hazel: Dein Post ist unnötig ...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 26.10.2007, 13:29    Titel: Antworten mit Zitat

Deviloper hat Folgendes geschrieben:
Ehm wenn du einfach mal gelesen hast, was ich oben geschrieben habe ... dann hättest du das schon vor einer Ewigkeit gesehen ...
Hazel: Dein Post ist unnötig ...


Christian hat garnicht erwähnt, dass du der neue Bestimmer im Board bist. :D Ich schreibe immernoch was mir gefällt und wenn dir das nicht passt dann lies es halt nicht. ;) Fakt ist, dass sich der Thread-Ersteller über meine Antwort gefreut hat, und das zählt für mich.. nicht ob du das als unnötig empfindest. ;)
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum