<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Mehrdimensionale Arrayklasse, wie Array erstellen?]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe eine Arrayklasse geschrieben, die mehrdimensionale Arrays erzeugen können soll. Mit arrayklasse&lt;int&gt; testarray(2, 4, NULL); kann man z.B. einen Array erstellen, dessen erste Ebene 2 Felder hat, und dessen zweite Ebene 4 Felder hat.</p>
<p>Das ganze funktioniert auch schon, die Anzahl der Felder der jeweiligen Ebene speichere ich im Array m_size. Das funktioniert bis zu dem Punkt, wo der eigentliche Array erstellt werden soll:</p>
<p>m_data = new T[m_size[0&rsqb;&rsqb;; // Erstellen des Arrays</p>
<p>Da bräuchte ich eine Anweisung wie:</p>
<pre><code>m_data = new T....

for (int i = 0; i &lt; anzahl der ebenen; i++)
	{
	...[m_size[i&rsqb;&rsqb;...
	}
</code></pre>
<p>denn ich kann ja nicht einmal schreiben<br />
m_data = new T[m_size[0&rsqb;&rsqb;;<br />
für einen eindimensionalen Array und dann das nächste Mal für einen zweidimensionalen Array<br />
m_data = new T[m_size[0&rsqb;&rsqb;[m_size[1&rsqb;&rsqb;;</p>
<p>Irgendwie brauche ich eine Methode, die die Klammern hinter &quot;new T&quot; je nach Anzahl der Arrayebenen automatisch erstellt.</p>
<p>Hier noch der Quellcode:</p>
<p>main.cpp:</p>
<pre><code>/*
#include &lt;iostream&gt;
#include &lt;windows.h&gt;
#include &lt;vector&gt;
using namespace std;
#include &quot;arrayklasse.cpp&quot;

void main()
	{
	arrayklasse&lt;int&gt; testarray(2, 3, 4, 5, NULL);
	};
</code></pre>
<p>arrayklasse.cpp:</p>
<pre><code>template&lt;class T&gt;					// Klassentemplate, damit die Klasse mit verschiedenen Datentypen benutzt werden kann
class arrayklasse
	{
	private:
		T	*m_data;				// m_data ist der Array
		int *m_size;				// Array mit der jeweiligen Feldanzahl pro Ebene

	public:
		arrayklasse(int parameterbezeichner, ...)		// Konstruktor, der Array wird mit einer bestimmten Größe erstellt (kann über Funktionen noch geändert werden)
			{
			va_list parameter;							// Anlegen eines Pointer auf die Liste der Argumente 
			va_start(parameter, parameterbezeichner);	// gehe an erste Position der übergebenen Variablenliste

			//m_data[0] = parameterbezeichner;			// der erste Parameter wird in die Stelle 0 des Arrays geschrieben

			int k = 0; // k enthält dann die Anzahl der Ebenen

			while (1) // nur zum Zählen der übergebenen Argumente
				{
				if (k == 0)
					{
					if (parameterbezeichner == NULL)	{break;};
					}
				else
					{
					if (va_arg(parameter, int) == NULL)	{break;};
					};

				k++;
				};

			m_size = new int[k];

			va_start(parameter, parameterbezeichner);	// gehe an erste Position der übergebenen Variablenliste

			for (int i = 0; i &lt; k; i++) // Anzahl der Felder für die jeweilige Ebene schreiben
				{
				if (i == 0)	{m_size[i] = parameterbezeichner;}
				else		{m_size[i] = va_arg(parameter, int);};
				};

			va_end(parameter);							// Löschen der Parameterliste

			m_data = new T[m_size[0&rsqb;&rsqb;;	// Erstellen des Arrays, das funktioniert noch nicht &lt;&lt;&lt;&lt;&lt;!!!!!!!!!!!!!!!!!!!!!!!!
			};

		~arrayklasse()				// Destruktor
			{
			delete[] m_data;		// Löschen des Arrays
			delete[] m_size;
			};

		T&amp; operator[](int index)	// Überladener Operator, ermöglicht Wertausgabe (z.B. cout&lt;&lt;arrayname[3]&lt;&lt;endl;)
			{
			return m_data[index];
			};

		int getsize() // Funktion zum Abfragen der aktuellen Arraygröße
			{
			//return m_size;
			};
	};
</code></pre>
<p>Die Arrayklasse hat noch etliche Funktionen mehr (und ich noch mehr Fragen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> ), aber eins nach dem anderen.</p>
<p>Viele Grüße,<br />
Manfred</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/173837/mehrdimensionale-arrayklasse-wie-array-erstellen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 12:57:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/173837.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 20 Feb 2007 11:49:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Mehrdimensionale Arrayklasse, wie Array erstellen? on Tue, 20 Feb 2007 11:49:42 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe eine Arrayklasse geschrieben, die mehrdimensionale Arrays erzeugen können soll. Mit arrayklasse&lt;int&gt; testarray(2, 4, NULL); kann man z.B. einen Array erstellen, dessen erste Ebene 2 Felder hat, und dessen zweite Ebene 4 Felder hat.</p>
<p>Das ganze funktioniert auch schon, die Anzahl der Felder der jeweiligen Ebene speichere ich im Array m_size. Das funktioniert bis zu dem Punkt, wo der eigentliche Array erstellt werden soll:</p>
<p>m_data = new T[m_size[0&rsqb;&rsqb;; // Erstellen des Arrays</p>
<p>Da bräuchte ich eine Anweisung wie:</p>
<pre><code>m_data = new T....

for (int i = 0; i &lt; anzahl der ebenen; i++)
	{
	...[m_size[i&rsqb;&rsqb;...
	}
</code></pre>
<p>denn ich kann ja nicht einmal schreiben<br />
m_data = new T[m_size[0&rsqb;&rsqb;;<br />
für einen eindimensionalen Array und dann das nächste Mal für einen zweidimensionalen Array<br />
m_data = new T[m_size[0&rsqb;&rsqb;[m_size[1&rsqb;&rsqb;;</p>
<p>Irgendwie brauche ich eine Methode, die die Klammern hinter &quot;new T&quot; je nach Anzahl der Arrayebenen automatisch erstellt.</p>
<p>Hier noch der Quellcode:</p>
<p>main.cpp:</p>
<pre><code>/*
#include &lt;iostream&gt;
#include &lt;windows.h&gt;
#include &lt;vector&gt;
using namespace std;
#include &quot;arrayklasse.cpp&quot;

void main()
	{
	arrayklasse&lt;int&gt; testarray(2, 3, 4, 5, NULL);
	};
</code></pre>
<p>arrayklasse.cpp:</p>
<pre><code>template&lt;class T&gt;					// Klassentemplate, damit die Klasse mit verschiedenen Datentypen benutzt werden kann
class arrayklasse
	{
	private:
		T	*m_data;				// m_data ist der Array
		int *m_size;				// Array mit der jeweiligen Feldanzahl pro Ebene

	public:
		arrayklasse(int parameterbezeichner, ...)		// Konstruktor, der Array wird mit einer bestimmten Größe erstellt (kann über Funktionen noch geändert werden)
			{
			va_list parameter;							// Anlegen eines Pointer auf die Liste der Argumente 
			va_start(parameter, parameterbezeichner);	// gehe an erste Position der übergebenen Variablenliste

			//m_data[0] = parameterbezeichner;			// der erste Parameter wird in die Stelle 0 des Arrays geschrieben

			int k = 0; // k enthält dann die Anzahl der Ebenen

			while (1) // nur zum Zählen der übergebenen Argumente
				{
				if (k == 0)
					{
					if (parameterbezeichner == NULL)	{break;};
					}
				else
					{
					if (va_arg(parameter, int) == NULL)	{break;};
					};

				k++;
				};

			m_size = new int[k];

			va_start(parameter, parameterbezeichner);	// gehe an erste Position der übergebenen Variablenliste

			for (int i = 0; i &lt; k; i++) // Anzahl der Felder für die jeweilige Ebene schreiben
				{
				if (i == 0)	{m_size[i] = parameterbezeichner;}
				else		{m_size[i] = va_arg(parameter, int);};
				};

			va_end(parameter);							// Löschen der Parameterliste

			m_data = new T[m_size[0&rsqb;&rsqb;;	// Erstellen des Arrays, das funktioniert noch nicht &lt;&lt;&lt;&lt;&lt;!!!!!!!!!!!!!!!!!!!!!!!!
			};

		~arrayklasse()				// Destruktor
			{
			delete[] m_data;		// Löschen des Arrays
			delete[] m_size;
			};

		T&amp; operator[](int index)	// Überladener Operator, ermöglicht Wertausgabe (z.B. cout&lt;&lt;arrayname[3]&lt;&lt;endl;)
			{
			return m_data[index];
			};

		int getsize() // Funktion zum Abfragen der aktuellen Arraygröße
			{
			//return m_size;
			};
	};
</code></pre>
<p>Die Arrayklasse hat noch etliche Funktionen mehr (und ich noch mehr Fragen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> ), aber eins nach dem anderen.</p>
<p>Viele Grüße,<br />
Manfred</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1231851</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1231851</guid><dc:creator><![CDATA[Manfred2]]></dc:creator><pubDate>Tue, 20 Feb 2007 11:49:42 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrdimensionale Arrayklasse, wie Array erstellen? on Tue, 20 Feb 2007 13:16:20 GMT]]></title><description><![CDATA[<p>Du mußt intern ein mehrdimensionales Array als ein eindimensionales Array darstellen und dann entsprechend die Indizes berechnen.<br />
Bei 2 Dimensionen z.B.</p>
<pre><code class="language-cpp">int Z = X*Y;
array = new T[Z];
</code></pre>
<p>Für mehrere Dimensionen berechnest du &quot;Z&quot; einfach in einer Schleife.<br />
Um auf die einzelnen Element dann zuzugreifen, mußt du dann die Indizes bestimmen, z.b.</p>
<pre><code class="language-cpp">T t = array[y*X+x];
</code></pre>
<p>Für mehrere Diemnsionen dann analog multiplizieren und addieren...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1231933</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1231933</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Tue, 20 Feb 2007 13:16:20 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrdimensionale Arrayklasse, wie Array erstellen? on Tue, 20 Feb 2007 14:17:02 GMT]]></title><description><![CDATA[<p>Hmm,</p>
<p>das hab ich schon fast befürchtet <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":-/"
      alt="😕"
    /></p>
<p>Schön wärs wie oben halt gewesen, weils dann einfach zum ansteuern und der Code leicht zu lesen gewesen wäre. Ausserdem benötige ich verschiedene Typen, d.h. es wird wohl auf einen langsamen Array mit Pointern auf andere Arrays hinauslaufen, in dem oberen Konstrukt wär das auch möglich gewesen, ohne zusätzliche Arrays zu erstellen (bei mehreren 'T's). Nur das array[][][][][][] Problem ist halt nicht dynamisch zu lösen.</p>
<p>Ich könnt aber noch sagen, daß ich halt bis zu 5-dimensionale Arrays erlaube und dann den Array in entsprechenden if-Abfragen für die Ebenenanzahl erstelle <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> nur ist das halt nicht dynamisch...</p>
<p>Viele Grüße,<br />
Manfred</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1231998</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1231998</guid><dc:creator><![CDATA[Manfred2]]></dc:creator><pubDate>Tue, 20 Feb 2007 14:17:02 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrdimensionale Arrayklasse, wie Array erstellen? on Tue, 20 Feb 2007 18:28:44 GMT]]></title><description><![CDATA[<p>Manfred2 schrieb:</p>
<blockquote>
<p>... Nur das array[][][][][][] Problem ist halt nicht dynamisch zu lösen.<br />
Manfred</p>
</blockquote>
<p>Hi!<br />
Das Problem ist zu lösen. Du musst mittels Hilfsklassen den operator[]<br />
so oft überschreiben wie du Dimensionen haben willst.</p>
<p>Kleines Beispiel für dynamische zweidimensionale Arrays:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
class Proxy
{
protected:       
        Proxy(size_t x, size_t y) 
                : dim2(y), dim1(x), dim(0),  Myptr(NULL){}
        virtual ~Proxy(){}
        T* Myptr;
        size_t dim;
public:        
        T&amp; operator[](const size_t y) 
	    {
                return Myptr[dim*dim2+y];
        }
        size_t dim2;
        size_t dim1;
};

template&lt;class T&gt;
class Array :  public Proxy&lt;T&gt;
{
public:

        Array(size_t x, size_t y) :  Proxy&lt;T&gt;(x, y)  
        {
            Myptr = new T [x*y];
        }
        ~Array() { delete[] Myptr; }

        Proxy&lt;T&gt;&amp; operator[](const size_t x) 
        {
                dim = x;
                return *this;
        }  
private:
        Array(const Array&amp; a){}
        Array&amp; Array::operator=(const Array&amp; a){}    
};

#include &lt;iostream&gt;
#include &lt;string&gt;
using namespace std;

int main()
{
    size_t x = 4, y = 5;

    Array&lt;string&gt; a(x, y); //dynamisches zweidimensionales Array

    a[2][1] = &quot;Ein zweidimensionales &quot;;
    a[3][4] = &quot;dynamisches Array!&quot;;
    a[0][1] = a[2][1];
    cout &lt;&lt; a[0][1]  &lt;&lt; a[3][4] &lt;&lt; endl;
    return 0;
}
</code></pre>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1232178</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1232178</guid><dc:creator><![CDATA[Helmut S.]]></dc:creator><pubDate>Tue, 20 Feb 2007 18:28:44 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrdimensionale Arrayklasse, wie Array erstellen? on Wed, 21 Feb 2007 14:48:00 GMT]]></title><description><![CDATA[<p>Man könnte sich auch das Ganze sparen und <a href="http://www.boost.org/libs/multi_array/doc/index.html" rel="nofollow">boost::multi_array</a> nutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1232653</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1232653</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Wed, 21 Feb 2007 14:48:00 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrdimensionale Arrayklasse, wie Array erstellen? on Thu, 22 Feb 2007 08:31:50 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>erstmal vielen Dank für die Antworten, ich bin leider noch nicht dazugekommen, werde mir aber jetzt die Beispiele mal ansehen, schau ma mal was es wird <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Viele Grüße,<br />
Manfred</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1232994</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1232994</guid><dc:creator><![CDATA[Manfred2]]></dc:creator><pubDate>Thu, 22 Feb 2007 08:31:50 GMT</pubDate></item></channel></rss>