<?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[Array initialisieren]]></title><description><![CDATA[<p>Hi Leute!</p>
<p>Warum kann ich arrays nicht so initialiseren?</p>
<pre><code>int **graph1 = {{0,1,1,0,0,0,1,0,0},
						{0,0,0,1,0,0,0,0,0},
						{1,0,0,1,1,0,0,0,0},
						{0,0,0,0,0,0,1,0,0},
						{1,0,0,0,0,1,0,0,1},
						{0,0,1,1,1,0,0,1,0},
						{0,0,0,0,0,0,0,1,0},
						{0,0,0,1,0,0,0,0,1},
						{0,0,0,0,0,1,0,0,0}};
</code></pre>
<p>Eine Initialisierung der Form</p>
<pre><code>graph1[9][9]
</code></pre>
<p>funktioniert aber so. Warum geht das so mit Pointern nicht?</p>
<p>Dann hab ich noch eine Funktion</p>
<pre><code>void bfs(**graph1)
</code></pre>
<p>deklariert, die das int-Array erhalten soll. Wie bewerkstellige ich das am Besten?</p>
<p>Wenn ich das als</p>
<pre><code>graph1[9][9]
</code></pre>
<p>deklarierte int-Array an</p>
<pre><code>void bfs(graph1[9][9])
</code></pre>
<p>übergebe, dann klappt das nämlich auch wieder!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/317552/array-initialisieren</link><generator>RSS for Node</generator><lastBuildDate>Tue, 28 Jul 2026 18:48:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/317552.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 12 Jun 2013 14:42:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Array initialisieren on Wed, 12 Jun 2013 14:42:40 GMT]]></title><description><![CDATA[<p>Hi Leute!</p>
<p>Warum kann ich arrays nicht so initialiseren?</p>
<pre><code>int **graph1 = {{0,1,1,0,0,0,1,0,0},
						{0,0,0,1,0,0,0,0,0},
						{1,0,0,1,1,0,0,0,0},
						{0,0,0,0,0,0,1,0,0},
						{1,0,0,0,0,1,0,0,1},
						{0,0,1,1,1,0,0,1,0},
						{0,0,0,0,0,0,0,1,0},
						{0,0,0,1,0,0,0,0,1},
						{0,0,0,0,0,1,0,0,0}};
</code></pre>
<p>Eine Initialisierung der Form</p>
<pre><code>graph1[9][9]
</code></pre>
<p>funktioniert aber so. Warum geht das so mit Pointern nicht?</p>
<p>Dann hab ich noch eine Funktion</p>
<pre><code>void bfs(**graph1)
</code></pre>
<p>deklariert, die das int-Array erhalten soll. Wie bewerkstellige ich das am Besten?</p>
<p>Wenn ich das als</p>
<pre><code>graph1[9][9]
</code></pre>
<p>deklarierte int-Array an</p>
<pre><code>void bfs(graph1[9][9])
</code></pre>
<p>übergebe, dann klappt das nämlich auch wieder!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2330601</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2330601</guid><dc:creator><![CDATA[vip*r]]></dc:creator><pubDate>Wed, 12 Jun 2013 14:42:40 GMT</pubDate></item><item><title><![CDATA[Reply to Array initialisieren on Wed, 12 Jun 2013 14:44:25 GMT]]></title><description><![CDATA[<p>vip@r schrieb:</p>
<blockquote>
<p>Warum geht das so mit Pointern nicht?</p>
</blockquote>
<p>Weil Pointer böse sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2330603</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2330603</guid><dc:creator><![CDATA[amme]]></dc:creator><pubDate>Wed, 12 Jun 2013 14:44:25 GMT</pubDate></item><item><title><![CDATA[Reply to Array initialisieren on Wed, 12 Jun 2013 14:45:29 GMT]]></title><description><![CDATA[<p>Btw: Mach graph1 global, das ist am wenigsten Stress.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2330605</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2330605</guid><dc:creator><![CDATA[amme]]></dc:creator><pubDate>Wed, 12 Jun 2013 14:45:29 GMT</pubDate></item><item><title><![CDATA[Reply to Array initialisieren on Wed, 12 Jun 2013 14:45:36 GMT]]></title><description><![CDATA[<p>Sehr gut! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> Lange schon nicht mehr so gelacht! <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="😃"
    /> Den kannte ich noch gar nicht <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2330607</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2330607</guid><dc:creator><![CDATA[vip*r]]></dc:creator><pubDate>Wed, 12 Jun 2013 14:45:36 GMT</pubDate></item><item><title><![CDATA[Reply to Array initialisieren on Wed, 12 Jun 2013 14:46:42 GMT]]></title><description><![CDATA[<p>ich hab graph1 momentan in der aufrufende main Funktion deklariert. Die Methoden (FUnktionen) kommen bei mir hier ja aus einer Klasse!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2330608</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2330608</guid><dc:creator><![CDATA[vip*r]]></dc:creator><pubDate>Wed, 12 Jun 2013 14:46:42 GMT</pubDate></item><item><title><![CDATA[Reply to Array initialisieren on Wed, 12 Jun 2013 14:47:44 GMT]]></title><description><![CDATA[<p>Brignts was wenn ich die Deklaration von graph1 in den Konstruktor schiebe?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2330610</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2330610</guid><dc:creator><![CDATA[vip*r]]></dc:creator><pubDate>Wed, 12 Jun 2013 14:47:44 GMT</pubDate></item><item><title><![CDATA[Reply to Array initialisieren on Wed, 12 Jun 2013 14:51:52 GMT]]></title><description><![CDATA[<p>vip@r schrieb:</p>
<blockquote>
<p>Eine Initialisierung der Form</p>
<pre><code>graph1[9][9]
</code></pre>
<p>funktioniert aber so. Warum geht das so mit Pointern nicht?</p>
</blockquote>
<p>** bedeutet nicht 2d-Array. Viele Leute denken fälschlicherweise, hinter ** steckt immer ein **, das ist Unsinn. ** ==&gt; Zeiger auf Zeiger, nicht mehr und nicht weniger.</p>
<p>vip@r schrieb:</p>
<blockquote>
<p>Dann hab ich noch eine Funktion</p>
<pre><code>void bfs(**graph1)
</code></pre>
<p>deklariert, die das int-Array erhalten soll. Wie bewerkstellige ich das am Besten?</p>
</blockquote>
<p>Nutze einfach array-to-pointer-decay: int-Array ==&gt; int*</p>
<p>Wie du siehst, ist das gar nicht so einfach und stark fehleranfällig. Wieso machst du dir das Leben dann nicht mit std::array, std::tr1::array oder std::vector einfacher?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2330614</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2330614</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Wed, 12 Jun 2013 14:51:52 GMT</pubDate></item><item><title><![CDATA[Reply to Array initialisieren on Wed, 12 Jun 2013 14:53:52 GMT]]></title><description><![CDATA[<p>out schrieb:</p>
<blockquote>
<p>vip@r schrieb:</p>
<blockquote>
<p>Eine Initialisierung der Form</p>
<pre><code>graph1[9][9]
</code></pre>
<p>funktioniert aber so. Warum geht das so mit Pointern nicht?</p>
</blockquote>
<p>** bedeutet nicht 2d-Array. Viele Leute denken fälschlicherweise, hinter ** <s>steckt immer ein **</s>, das ist Unsinn.</p>
</blockquote>
<p>...steckt immer ein 2d-Array...<br />
<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="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2330616</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2330616</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Wed, 12 Jun 2013 14:53:52 GMT</pubDate></item><item><title><![CDATA[Reply to Array initialisieren on Wed, 12 Jun 2013 14:57:02 GMT]]></title><description><![CDATA[<p>vip@r schrieb:</p>
<blockquote>
<p>Die Methoden (FUnktionen) kommen bei mir hier ja aus einer Klasse!</p>
</blockquote>
<p>Klasse! Ja, dann mach doch eine Klasse draus.</p>
<pre><code class="language-cpp">struct Graph {
  adj[9][9];
};

void bfs(Graph&amp; graph);

Graph graph1 = {{{0,1,1,0,0,0,1,0,0},
                        {0,0,0,1,0,0,0,0,0},
                        {1,0,0,1,1,0,0,0,0},
                        {0,0,0,0,0,0,1,0,0},
                        {1,0,0,0,0,1,0,0,1},
                        {0,0,1,1,1,0,0,1,0},
                        {0,0,0,0,0,0,0,1,0},
                        {0,0,0,1,0,0,0,0,1},
                        {0,0,0,0,0,1,0,0,0}}};

bfs(graph1);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2330618</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2330618</guid><dc:creator><![CDATA[Klasse!]]></dc:creator><pubDate>Wed, 12 Jun 2013 14:57:02 GMT</pubDate></item><item><title><![CDATA[Reply to Array initialisieren on Wed, 12 Jun 2013 15:01:59 GMT]]></title><description><![CDATA[<p>mit vorgefertigten Bibliotheken möchte ich an dieser STelle nicht arbeiten.</p>
<p>Ich hab mich nun dafür entschieden, dass ich mit der Initialisierung graph1[9][9] arbeite. Jetzt hab ich aber ein weiteres Problem: Ich hab mich nun auch dafür entschieden, dass array, also graph1 im Konstruktor deklarieren zu lassen.</p>
<p>Das sieht nun so aus:</p>
<pre><code>class graphAlgo
{
private:
	int graph1[9][9];
	int graph2[9][9];

	void bfs(int **graph1);	//Breitensuche
	void dfs(int **graph2);	//Tiefensuche

public:
	graphAlgo();
	~graphAlgo();

	void breitensuche();	//Breitensuche
	void tiefensuche();	//Tiefensuche

};
</code></pre>
<pre><code>//Konstruktor
graphAlgo::graphAlgo()
{
	//deklaration des gerichteten und ungewichteten Graphen
		graph1[9][9] = {{0,1,1,0,0,0,1,0,0},
						{0,0,0,1,0,0,0,0,0},
						{1,0,0,1,1,0,0,0,0},
						{0,0,0,0,0,0,1,0,0},
						{1,0,0,0,0,1,0,0,1},
						{0,0,1,1,1,0,0,1,0},
						{0,0,0,0,0,0,0,1,0},
						{0,0,0,1,0,0,0,0,1},
						{0,0,0,0,0,1,0,0,0}};

	//deklaration des gerichteten und gewichteten Graphen
	graph2[9][9] = {{0,1,2,0,0,0,5,0,0},
						{0,0,0,6,0,0,0,0,0},
						{2,0,0,5,4,0,0,0,0},
						{0,0,0,0,0,0,2,0,0},
						{3,0,0,0,0,2,0,0,4},
						{0,0,1,7,2,0,0,2,0},
						{0,0,0,0,0,0,0,1,0},
						{0,0,0,3,0,0,0,0,5},
						{0,0,0,0,0,3,0,0,0}};
}
</code></pre>
<p>Ich kann aber hier jetzt nicht auf die private Variablen graph1 und graph2 zugreifen. Muss ich diese dann publich setzen? Was muss ich machen, damit ich diese Variablen dennoch unter private deklarieren kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2330623</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2330623</guid><dc:creator><![CDATA[vip*r]]></dc:creator><pubDate>Wed, 12 Jun 2013 15:01:59 GMT</pubDate></item><item><title><![CDATA[Reply to Array initialisieren on Wed, 12 Jun 2013 15:37:58 GMT]]></title><description><![CDATA[<p>Zur Erklärung, warum das mit int **graph nicht so funktioniert, wie du es dir denkst:</p>
<p><strong>Typsystem 102: Arrays (und der Zusammenhang mit Zeigern)</strong></p>
<p>Ein Array ist ein Aggregattyp, der aus einer festen Anzahl von Objekten eines anderen Typs besteht. Diese Teilobjekte liegen im Speicher direkt hintereinander, ihre Gesamtheit ist das Array, und die Einzelobjekte sind über einen Index ansprechbar:</p>
<pre><code>int arr[4] = { 3, 1, 4, 1 };

führt zu:

| &lt;------- arr--- ----&gt; |
+-----+-----+-----+-----+
|  3  |  1  |  4  |  1  |
+-----+-----+-----+-----+
   ^     ^     ^     ^
   |     |     |     |
 arr[0]  |     |     |
       arr[1]  |     |
             arr[2]  |
                   arr[3]
</code></pre>
<p>Zwei- und mehrdimensionale Arrays sind Arrays von Arrays, also:</p>
<pre><code>int arr[3][2] = { { 3, 1 }, { 4, 1 }, { 5, 9 } };

führt zu:

  | &lt;------------- arr -------------&gt; |
  |   arr[0]  |   arr[1]  |   arr[2]  |
  +-----+-----+-----+-----+-----+-----+
  |  3  |  1  |  4  |  1  |  5  |  9  |
  +-----+-----+-----+-----+-----+-----+
     ^     ^     ^     ^     ^     ^
     |     |     |     |     |     |
arr[0][0]| |     |     |     |     |
      arr[0][1]  |     |     |     |
            arr[1][0]  |     |     |
                  arr[1][1]  |     |
                        arr[2][0]  |
                              arr[2][1]
</code></pre>
<p>In diesem Fall sind arr[0], arr[1] und arr[2] jeweils vom Typ int[2]. So ist</p>
<pre><code class="language-cpp">// param ist eine Referenz auf ein int-Array der Länge 2
void foo(int (&amp;param)[2]) {
}

int main() {
  int arr[3][2] = { { 3, 1 }, { 4, 1 }, { 5, 9 } };
  foo(arr[0]);
}
</code></pre>
<p>völlig in Ordnung. std::end(arr[0]) etc. werden ebenfalls funktionieren.</p>
<p>Als <strong>Besonderheit</strong> zerfallen Arrays in der Verwendung in einen Zeiger auf den Typ, den es beinhaltet. So kann ich</p>
<pre><code class="language-cpp">int arr[4] = { 3, 1, 4, 1 };
int *ptr = arr;

assert(*(ptr + 2) == 4);
</code></pre>
<p>schreiben, oder</p>
<pre><code class="language-cpp">int arr[3][2] = { { 3, 1 }, { 4, 1 }, { 5, 9 } };
int (*ptr)[2] = arr;

assert((*(ptr + 2))[0] == 5 &amp;&amp; (*(ptr + 2))[1] == 9);
</code></pre>
<p>Dieser Zerfall geschieht übrigens auch bei</p>
<pre><code class="language-cpp">arr[2]
</code></pre>
<p>, welches als</p>
<pre><code class="language-cpp">(*(arr + 2))
</code></pre>
<p>ausgewertet wird.</p>
<p>Gleichwohl ist ein Array etwas anderes als ein Zeiger, und ein Array von Arrays etwas anderes als ein Array von Zeigern. In C (und schlechtem C++) sieht man manchmal Code der Art</p>
<pre><code class="language-cpp">int **arr;

arr = malloc(sizeof(int*) * x); // bzw. das selbe mit new[]
for(int i = 0; i &lt; x; ++x) {
  arr[i] = malloc(sizeof(int) * y);
}

arr[0][1] = foo();

// Später Aufräumen nicht vergessen, und Exceptionsicherheit...also besser
// mit std::vector&lt;std::vector&lt;foo&gt; &gt;, wenn es denn unbedingt sein muss.
</code></pre>
<p>Dies sieht im Speicher dann etwa so aus:</p>
<pre><code class="language-cpp">arr           [0] [1] [2] [3]
+---+         +---+---+---+---+
|   |--------&gt;|   |   |   |   |
+---+         +---+---+---+---+
                |   |   |   |    +---+---+---+
                |   |   |   +---&gt;| 3 | 1 | 4 |
                |   |   |        +---+---+---+
                |   |   |
                |   |   |        +---+---+---+
                |   |   +-------&gt;| 1 | 5 | 9 |
                |   |            +---+---+---+
                |   |
                |   |            +---+---+---+
                |   +-----------&gt;| 2 | 6 | 5 |
                |                +---+---+---+
                |
                |                +---+---+---+
                +---------------&gt;| 3 | 5 | 8 |
                                 +---+---+---+
</code></pre>
<p>Hierbei ist arr vom Typ int**, und arr[0], arr[1] etc. sind int* (nicht int[3]!). Es handelt sich um ein gänzlich anderes (und komplexeres) Biest als ein einfaches zweidimensionales Array, und deshalb kann man einen Zeiger auf Zeiger nicht initialisieren wie ein mehrdimensionales Array.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2330633</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2330633</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Wed, 12 Jun 2013 15:37:58 GMT</pubDate></item><item><title><![CDATA[Reply to Array initialisieren on Wed, 12 Jun 2013 15:50:41 GMT]]></title><description><![CDATA[<p>vip@r schrieb:</p>
<blockquote>
<p>mit vorgefertigten Bibliotheken möchte ich an dieser STelle nicht arbeiten.</p>
</blockquote>
<p>Tust du ja auch nicht. Das ist Teil der c++ Standardbibliothek. Was nutzt du denn zur Bildschirmausgabe? Garantiert std::cout. Und wenn du das nicht nutzt, wirst du die WinAPI nutzen müssen oder etwas vergleichbares. Du kommst um Bibliotheken nicht herum; erfinde das Rad nicht unnötig neu.<br />
Und std::vector ist was tolles. Dynamisch wachsende Arrays, die soviel Speicher haben, wie du brauchst. Kein Gefriemel (?) mehr mit new[] oder new.</p>
<blockquote>
<p>Das sieht nun so aus:</p>
<pre><code>...
</code></pre>
<p>Ich kann aber hier jetzt nicht auf die private Variablen graph1 und graph2 zugreifen. Muss ich diese dann publich setzen? Was muss ich machen, damit ich diese Variablen dennoch unter private deklarieren kann?</p>
</blockquote>
<p>Doch kannst du.<br />
In allen Memberfunktionen kannst du auf private Variablen zugreifen.<br />
Und deine Aufteilung bfs(int**) und breitensuche ist auch relativ sinnfrei. Nutze gleich breitensuche und arbeite dort direkt mit dem Member.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2330637</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2330637</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Wed, 12 Jun 2013 15:50:41 GMT</pubDate></item></channel></rss>