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
|
Verfasst am: 19.10.2007, 16:07 Titel: new mit zweidimensionalem Array |
|
|
Ich habe eine doppelte Pointer-Variable
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 |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 19.10.2007, 16:19 Titel: |
|
|
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 |
|
|
Robrunner Mini JLI'ler
Alter: 32 Anmeldedatum: 08.07.2007 Beiträge: 44 Wohnort: Passau Medaillen: Keine
|
Verfasst am: 19.10.2007, 16:35 Titel: |
|
|
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 |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 19.10.2007, 17:18 Titel: |
|
|
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 |
|
|
Deviloper Junior JLI'ler
Anmeldedatum: 31.05.2006 Beiträge: 77
Medaillen: Keine
|
Verfasst am: 19.10.2007, 23:29 Titel: |
|
|
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 |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 23.10.2007, 15:27 Titel: |
|
|
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 |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 23.10.2007, 17:28 Titel: |
|
|
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 |
|
|
Robrunner Mini JLI'ler
Alter: 32 Anmeldedatum: 08.07.2007 Beiträge: 44 Wohnort: Passau Medaillen: Keine
|
Verfasst am: 24.10.2007, 10:50 Titel: |
|
|
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 |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 26.10.2007, 07:56 Titel: |
|
|
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 |
|
|
Robrunner Mini JLI'ler
Alter: 32 Anmeldedatum: 08.07.2007 Beiträge: 44 Wohnort: Passau Medaillen: Keine
|
Verfasst am: 26.10.2007, 11:42 Titel: |
|
|
Das ist ja genial, Danke!!! _________________ Wer einen Rechtschreibfehler findet darf ihn behalten. |
|
Nach oben |
|
|
Deviloper Junior JLI'ler
Anmeldedatum: 31.05.2006 Beiträge: 77
Medaillen: Keine
|
Verfasst am: 26.10.2007, 12:34 Titel: |
|
|
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 |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 26.10.2007, 13:29 Titel: |
|
|
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 |
|
|
|