<?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 und Pointer]]></title><description><![CDATA[<p>Hallo sitze gerade vor einer Übung und habe ein Problem...</p>
<p>Aufgabe:<br />
*Ermitteln Sie den maximalen Abstand zweier Punkte des Feldes, das Sie mit<br />
neuesPunktFeld() erzeugt haben. Prototyp der Prozedur:<br />
double maxAbstand(Punkt **, Punkt *, Punkt <em>);<br />
Der erste Parameter ist für die Übergabe des Feldes, mit dem zweiten und dritten<br />
Parameter sollen die ermittelten Punkte zurückgegeben werden.</em></p>
<p>Folgendes habe ich ausgearbeitet:</p>
<pre><code>...
cout &lt;&lt; &quot;\n*dynamische Punkt Feld Erzeugung*\n&quot;;
	Punkt **arrPunkt = neuesPunktFeld(ARRAY_GROESSE);
	for(int i=0; i&lt;ARRAY_GROESSE; i++)
	{
		printPunkt( *(arrPunkt[i]) );
	}

	cout &lt;&lt; &quot;\n*Ermittelter maximaler Abstand zwischen 2 Punkten aus dem Feld*\n&quot;;
	Punkt *tmp1, *tmp2;
	cout &lt;&lt; tmp1 &lt;&lt; &quot;\t&quot; &lt;&lt; tmp2 &lt;&lt; endl;
	cout &lt;&lt; &quot;Maximaler Abstand ist bei:&quot; &lt;&lt; endl;
	cout &lt;&lt; maxAbstand(arrPunkt, tmp1, tmp2) &lt;&lt; endl;
	cout &lt;&lt; tmp1 &lt;&lt; &quot;\t&quot; &lt;&lt; tmp2 &lt;&lt; endl;
	printPunkt(*tmp1);
	printPunkt(*tmp2);
	return 0;
}
</code></pre>
<pre><code>double maxAbstand(Punkt **arrPunkt, Punkt *p1, Punkt *p2)
{
	double nMax = 0;
	double nTempCalc; 
	//arrPunkt ist übergebenes Feld
	//über p1 und p2 werden die Punkte zurückgegeben welche den größten abstand haben
	//double abstand(Punkt p1, Punkt p2) 
	for(int x=0; x&lt;ARRAY_GROESSE; x++)
	{
		nTempCalc = abstand( *(arrPunkt[x]), *(arrPunkt[ARRAY_GROESSE-1-x]) );

		if( nMax &lt; nTempCalc) {
			p1 = arrPunkt[x];
			p2 = arrPunkt[ARRAY_GROESSE-x-1];
			nMax = nTempCalc;
		}
	}

	return nMax;
}
</code></pre>
<p><strong>Problem:</strong><br />
Der Inhalt der Punkt Pointer &quot;tmp1&quot; und &quot;tmp2&quot; ist nur Müll auch die Referenzierte Adresse ändert sich nicht von den beiden Variablen.</p>
<p><strong>Frage</strong><br />
Muss ich für die Punkt Pointer Variablen tmp1 und tmp2 ein Extra speicher mit new anlegen? Eigentlich will ich die ja nur auf einen bereits vorhandenen Speicher referenzieren <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=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/320542/array-und-pointer</link><generator>RSS for Node</generator><lastBuildDate>Thu, 23 Jul 2026 18:37:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/320542.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 02 Oct 2013 12:43:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Array und Pointer on Wed, 02 Oct 2013 12:43:56 GMT]]></title><description><![CDATA[<p>Hallo sitze gerade vor einer Übung und habe ein Problem...</p>
<p>Aufgabe:<br />
*Ermitteln Sie den maximalen Abstand zweier Punkte des Feldes, das Sie mit<br />
neuesPunktFeld() erzeugt haben. Prototyp der Prozedur:<br />
double maxAbstand(Punkt **, Punkt *, Punkt <em>);<br />
Der erste Parameter ist für die Übergabe des Feldes, mit dem zweiten und dritten<br />
Parameter sollen die ermittelten Punkte zurückgegeben werden.</em></p>
<p>Folgendes habe ich ausgearbeitet:</p>
<pre><code>...
cout &lt;&lt; &quot;\n*dynamische Punkt Feld Erzeugung*\n&quot;;
	Punkt **arrPunkt = neuesPunktFeld(ARRAY_GROESSE);
	for(int i=0; i&lt;ARRAY_GROESSE; i++)
	{
		printPunkt( *(arrPunkt[i]) );
	}

	cout &lt;&lt; &quot;\n*Ermittelter maximaler Abstand zwischen 2 Punkten aus dem Feld*\n&quot;;
	Punkt *tmp1, *tmp2;
	cout &lt;&lt; tmp1 &lt;&lt; &quot;\t&quot; &lt;&lt; tmp2 &lt;&lt; endl;
	cout &lt;&lt; &quot;Maximaler Abstand ist bei:&quot; &lt;&lt; endl;
	cout &lt;&lt; maxAbstand(arrPunkt, tmp1, tmp2) &lt;&lt; endl;
	cout &lt;&lt; tmp1 &lt;&lt; &quot;\t&quot; &lt;&lt; tmp2 &lt;&lt; endl;
	printPunkt(*tmp1);
	printPunkt(*tmp2);
	return 0;
}
</code></pre>
<pre><code>double maxAbstand(Punkt **arrPunkt, Punkt *p1, Punkt *p2)
{
	double nMax = 0;
	double nTempCalc; 
	//arrPunkt ist übergebenes Feld
	//über p1 und p2 werden die Punkte zurückgegeben welche den größten abstand haben
	//double abstand(Punkt p1, Punkt p2) 
	for(int x=0; x&lt;ARRAY_GROESSE; x++)
	{
		nTempCalc = abstand( *(arrPunkt[x]), *(arrPunkt[ARRAY_GROESSE-1-x]) );

		if( nMax &lt; nTempCalc) {
			p1 = arrPunkt[x];
			p2 = arrPunkt[ARRAY_GROESSE-x-1];
			nMax = nTempCalc;
		}
	}

	return nMax;
}
</code></pre>
<p><strong>Problem:</strong><br />
Der Inhalt der Punkt Pointer &quot;tmp1&quot; und &quot;tmp2&quot; ist nur Müll auch die Referenzierte Adresse ändert sich nicht von den beiden Variablen.</p>
<p><strong>Frage</strong><br />
Muss ich für die Punkt Pointer Variablen tmp1 und tmp2 ein Extra speicher mit new anlegen? Eigentlich will ich die ja nur auf einen bereits vorhandenen Speicher referenzieren <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=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357301</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357301</guid><dc:creator><![CDATA[DKlay13]]></dc:creator><pubDate>Wed, 02 Oct 2013 12:43:56 GMT</pubDate></item><item><title><![CDATA[Reply to Array und Pointer on Wed, 02 Oct 2013 12:55:42 GMT]]></title><description><![CDATA[<p>Mein aufrichtiges Beileid, dass du dich mit solch bescheuerten Übrungen von Leuten, die offensichtlich wenig C++ Erfahrung haben, beschäftigen musst.</p>
<p>Wie dem auch sei, tmp1 und tmp2 sind bei dir zwei uninitialisierte Zeiger, mit denen du einfach arbeitest, als würden die schon irgendwohin zeigen, wo es POINT-Objekte gibt.</p>
<p>Wie der code unter den Voraussetzungen auszusehen hat, kann ich Dir nicht sagen, weil ich die Aufgabenstellung nicht wirklich verstanden habe. Ich finde sie unpräzise. Vielleicht fehlt mir da auch etwas Kontext.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357304</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357304</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 02 Oct 2013 12:55:42 GMT</pubDate></item><item><title><![CDATA[Reply to Array und Pointer on Wed, 02 Oct 2013 13:03:53 GMT]]></title><description><![CDATA[<p>Evtl. zur Ergänzung</p>
<pre><code>typedef struct {
	double x;
	double y;
} Punkt;

double abstand(Punkt p1, Punkt p2) 
{
	return sqrt( (p2.y-p1.y)*(p2.y-p1.y) + (p2.x-p1.x)*(p2.x-p1.x) );
}
</code></pre>
<p>Tja, finde sie auch nicht ganz Toll aber das Semester hat erst begonnen und das ist nun die erste Aufgabe...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357307</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357307</guid><dc:creator><![CDATA[DKlay13]]></dc:creator><pubDate>Wed, 02 Oct 2013 13:03:53 GMT</pubDate></item><item><title><![CDATA[Reply to Array und Pointer on Wed, 02 Oct 2013 13:16:14 GMT]]></title><description><![CDATA[<p>Kannst du mal die Funktion neuesPunktFeld zeigen?</p>
<p>BTW in C++ schreibt man</p>
<pre><code class="language-cpp">struct Punkt {
    double x;
    double y;
};
</code></pre>
<p>Die Version mit typedef ist in C notwendig, wenn man den so definierten Datentyp <code>Punkt</code> nennen will statt immer ausführlich <code>struct Punkt</code> schreiben zu müssen, in C++ heißt der Typ von vornherein nur <code>Punkt</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357315</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357315</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Wed, 02 Oct 2013 13:16:14 GMT</pubDate></item><item><title><![CDATA[Reply to Array und Pointer on Wed, 02 Oct 2013 13:20:52 GMT]]></title><description><![CDATA[<p>Aufruf der Funktion mit Hilfe des Adressoperators:</p>
<pre><code class="language-cpp">Punkt tmp1, tmp2;
cout &lt;&lt; tmp1 &lt;&lt; &quot;\t&quot; &lt;&lt; tmp2 &lt;&lt; endl;
cout &lt;&lt; &quot;Maximaler Abstand ist bei:&quot; &lt;&lt; endl;
cout &lt;&lt; maxAbstand(arrPunkt, &amp;tmp1, &amp;tmp2) &lt;&lt; endl;
</code></pre>
<p>Besser wären jedoch Referenzen als Parameter (aber die Aufgabenstellung ist ja leider anders).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357317</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357317</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Wed, 02 Oct 2013 13:20:52 GMT</pubDate></item><item><title><![CDATA[Reply to Array und Pointer on Wed, 02 Oct 2013 13:23:57 GMT]]></title><description><![CDATA[<p>Bashar schrieb:</p>
<blockquote>
<p>Die Version mit typedef ist in C notwendig, wenn man den so definierten Datentyp <code>Punkt</code> nennen will statt immer ausführlich <code>struct Punkt</code> schreiben zu müssen, in C++ heißt der Typ von vornherein nur <code>Punkt</code> .</p>
</blockquote>
<p>Apropos C und C++: Da das einzige an dem Code, was kein typisches<sup>*</sup> C ist, das cout ist, würde ich doch gerne vom Threadersteller erfahren, ob die couts vielleicht von ihm auf eigene Faust eingebaut wurden. Wenn das nämlich ein C-Kurs ist und die couts vom TE stammen, dann würde das so einiges erklären. Und man könnte auch produktiver helfen, als nur zu sagen, dass das ganz besch...eidenes C++ ist.</p>
<p><sup>*</sup>: Damit meine ich nicht &quot;gut&quot;. Bloß typisch für C-Anfängerkurse.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357319</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357319</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 02 Oct 2013 13:23:57 GMT</pubDate></item><item><title><![CDATA[Reply to Array und Pointer on Wed, 02 Oct 2013 13:25:07 GMT]]></title><description><![CDATA[<p>Bashar schrieb:</p>
<blockquote>
<p>Kannst du mal die Funktion neuesPunktFeld zeigen?</p>
<p>BTW in C++ schreibt man</p>
<pre><code class="language-cpp">struct Punkt {
    double x;
    double y;
};
</code></pre>
<p>Die Version mit typedef ist in C notwendig, wenn man den so definierten Datentyp <code>Punkt</code> nennen will statt immer ausführlich <code>struct Punkt</code> schreiben zu müssen, in C++ heißt der Typ von vornherein nur <code>Punkt</code> .</p>
</blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/904">@Bashar</a><br />
Danke für den Tip mit der &quot;typedef&quot; wusste ich nicht <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>
<pre><code>Punkt **neuesPunktFeld(int nDim)
{
	Punkt **arrPunkt = new Punkt*[nDim];
	for(int i=0; i&lt;nDim; i++) {
		arrPunkt[i] = neuerPunkt();
	}
	return arrPunkt;
}
</code></pre>
<p>@Th6<br />
Leider, gibt es da wohl kein Spielraum für den Funktionsaufbau...aber trotzdem Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357321</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357321</guid><dc:creator><![CDATA[DKlay13]]></dc:creator><pubDate>Wed, 02 Oct 2013 13:25:07 GMT</pubDate></item><item><title><![CDATA[Reply to Array und Pointer on Wed, 02 Oct 2013 13:28:14 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Bashar schrieb:</p>
<blockquote>
<p>Die Version mit typedef ist in C notwendig, wenn man den so definierten Datentyp <code>Punkt</code> nennen will statt immer ausführlich <code>struct Punkt</code> schreiben zu müssen, in C++ heißt der Typ von vornherein nur <code>Punkt</code> .</p>
</blockquote>
<p>Apropos C und C++: Da das einzige an dem Code, was kein typisches<sup>*</sup> C ist, das cout ist, würde ich doch gerne vom Threadersteller erfahren, ob die couts vielleicht von ihm auf eigene Faust eingebaut wurden. Wenn das nämlich ein C-Kurs ist und die couts vom TE stammen, dann würde das so einiges erklären. Und man könnte auch produktiver helfen, als nur zu sagen, dass das ganz besch...eidenes C++ ist.</p>
<p><sup>*</sup>: Damit meine ich nicht &quot;gut&quot;. Bloß typisch für C-Anfängerkurse.</p>
</blockquote>
<p>Ne das ist ein C++ kurs, C hatten wir bereits und du hast recht ausser cout und &lt;iostream&gt; ist hier C++ sehr gering</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357322</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357322</guid><dc:creator><![CDATA[DKlay13]]></dc:creator><pubDate>Wed, 02 Oct 2013 13:28:14 GMT</pubDate></item><item><title><![CDATA[Reply to Array und Pointer on Wed, 02 Oct 2013 13:29:44 GMT]]></title><description><![CDATA[<p>Mit einer einfachen Schleife wirst du kaum alle Punkte miteinander vergleichen können.<br />
Denn du musst ja den<br />
1. mit dem 2. Punkt vergleichen<br />
1. mit dem 3.<br />
1. mit dem 4.<br />
....<br />
1. mit dem ARRAY_GROESSE.<br />
2. mit dem 3.<br />
2. mit dem 4.<br />
...<br />
2. mit dem ARRAY_GROESSE.<br />
...<br />
ARRAY_GROESSE-1 mit dem ARRAY_GROESSE. Punkt vergleichen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357325</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357325</guid><dc:creator><![CDATA[DirkB]]></dc:creator><pubDate>Wed, 02 Oct 2013 13:29:44 GMT</pubDate></item><item><title><![CDATA[Reply to Array und Pointer on Wed, 02 Oct 2013 13:32:22 GMT]]></title><description><![CDATA[<p>DirkB schrieb:</p>
<blockquote>
<p>Mit einer einfachen Schleife wirst du kaum alle Punkte miteinander vergleichen können.<br />
Denn du musst ja den<br />
1. mit dem 2. Punkt vergleichen<br />
1. mit dem 3.<br />
1. mit dem 4.<br />
....<br />
1. mit dem ARRAY_GROESSE.<br />
2. mit dem 3.<br />
2. mit dem 4.<br />
...<br />
2. mit dem ARRAY_GROESSE.<br />
...<br />
ARRAY_GROESSE-1 mit dem ARRAY_GROESSE. Punkt vergleichen</p>
</blockquote>
<p>Ja ist mir bewusst, habe die Funktion aber aufgrund des Problems nicht mehr weiter ausgebaut...Werde noch ein innere Schleife einbauen die von oben nach unten -1 zählt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357328</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357328</guid><dc:creator><![CDATA[DKlay13]]></dc:creator><pubDate>Wed, 02 Oct 2013 13:32:22 GMT</pubDate></item><item><title><![CDATA[Reply to Array und Pointer on Wed, 02 Oct 2013 13:55:09 GMT]]></title><description><![CDATA[<p>Ich habe das nun so gelöst, obwohl ich mit dieser Lösung nicht zufrieden bin, da ich einen neuen Speicher reserviere...</p>
<pre><code>...
    Punkt *tmp1 = new Punkt;
	Punkt *tmp2 = new Punkt;

	cout &lt;&lt; &quot;Maximaler Abstand ist bei:&quot; &lt;&lt; endl;
	cout &lt;&lt; maxAbstand(arrPunkt, tmp1, tmp2) &lt;&lt; endl;
	printPunkt(*tmp1);
	printPunkt(*tmp2);
	return 0;
}
</code></pre>
<pre><code>double maxAbstand(Punkt **arrPunkt, Punkt *p1, Punkt *p2)
{
	double nMax = 0;
	double nTempCalc; 

	for(int x=0; x&lt;ARRAY_GROESSE; x++)
	{
		for(int y=ARRAY_GROESSE-1; y&gt;0; y--)
		{
			nTempCalc = abstand( *(arrPunkt[x]), *(arrPunkt[y]) );

			if( nMax &lt; nTempCalc) {
				*p1 = *arrPunkt[x];
				*p2 = *arrPunkt[ARRAY_GROESSE-x-1];
				nMax = nTempCalc;
			}
		}
	}

	return nMax;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2357339</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357339</guid><dc:creator><![CDATA[DKlay13]]></dc:creator><pubDate>Wed, 02 Oct 2013 13:55:09 GMT</pubDate></item><item><title><![CDATA[Reply to Array und Pointer on Wed, 02 Oct 2013 13:56:31 GMT]]></title><description><![CDATA[<p>Th69 hatte dir doch schon eine bessere Lösung vorgeschlagen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357341</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357341</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Wed, 02 Oct 2013 13:56:31 GMT</pubDate></item><item><title><![CDATA[Reply to Array und Pointer on Wed, 02 Oct 2013 13:58:30 GMT]]></title><description><![CDATA[<p>Wozu new?</p>
<pre><code>Punkt tmp1, tmp2;

    cout &lt;&lt; &quot;Maximaler Abstand ist bei:&quot; &lt;&lt; endl;
    cout &lt;&lt; maxAbstand(arrPunkt, &amp;tmp1, &amp;tmp2) &lt;&lt; endl;
</code></pre>
<p>Ist zwar immer noch grauenhaft, aber wenigstens ohne direktes Speicherloch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357342</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357342</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 02 Oct 2013 13:58:30 GMT</pubDate></item><item><title><![CDATA[Reply to Array und Pointer on Wed, 02 Oct 2013 13:59:00 GMT]]></title><description><![CDATA[<blockquote>
<p>Ich habe das nun so gelöst, obwohl ich mit dieser Lösung nicht zufrieden bin, da ich einen neuen Speicher reserviere...</p>
</blockquote>
<p>Wieso also reservierst du selbst Speicher? Die richtige Lösung wäre, eine automatische Stack-Variabe zu nehmen:</p>
<pre><code>Punkt tmp1;
    Punkt tmp2;
</code></pre>
<p>Edit: Sei verdammt, SeppJ!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357343</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357343</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Wed, 02 Oct 2013 13:59:00 GMT</pubDate></item><item><title><![CDATA[Reply to Array und Pointer on Wed, 02 Oct 2013 14:01:15 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<blockquote>
<p>Ich habe das nun so gelöst, obwohl ich mit dieser Lösung nicht zufrieden bin, da ich einen neuen Speicher reserviere...</p>
</blockquote>
<p>Wieso also reservierst du selbst Speicher? Die richtige Lösung wäre, eine automatische Stack-Variabe zu nehmen:</p>
<pre><code>Punkt tmp1;
    Punkt tmp2;
</code></pre>
<p>Edit: Sei verdammt, SeppJ!</p>
</blockquote>
<p>Stimmt auch wieder, bin irgendwie bei den ganzne Pointer und Adresse Variablen hängengeblieben...Danke <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357344</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357344</guid><dc:creator><![CDATA[DKlay13]]></dc:creator><pubDate>Wed, 02 Oct 2013 14:01:15 GMT</pubDate></item><item><title><![CDATA[Reply to Array und Pointer on Wed, 02 Oct 2013 15:17:28 GMT]]></title><description><![CDATA[<p>@DKlay13:<br />
Nur mal so eine Frage bezüglich des Programmierstils:</p>
<p>Ist zufälligerweise der Begriff Jürgen Wolf in deinem Bekanntenkreis gefallen?</p>
<p>Übrigens: Sagt dir der Begriff Speicherloch was?</p>
<p>PS:<br />
Ich bin überhaupt kein Freund von Zeigern auf Zeigern...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357375</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357375</guid><dc:creator><![CDATA[Bitte ein Bit]]></dc:creator><pubDate>Wed, 02 Oct 2013 15:17:28 GMT</pubDate></item><item><title><![CDATA[Reply to Array und Pointer on Wed, 02 Oct 2013 18:55:18 GMT]]></title><description><![CDATA[<p>@Bitte ein Bit</p>
<p><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=":confused:"
      alt="😕"
    /> ka wer das sein soll...sollte man Jürgen Wolf kennen? und was ist an meinem Programmierstill nicht in Ordnung?</p>
<p>Memoryleaks sagt mir was, aber da das eine &quot;Übung&quot; habe ich mir keine gedanken gemacht über delete von Variablen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357450</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357450</guid><dc:creator><![CDATA[DKlay13]]></dc:creator><pubDate>Wed, 02 Oct 2013 18:55:18 GMT</pubDate></item><item><title><![CDATA[Reply to Array und Pointer on Wed, 02 Oct 2013 19:15:43 GMT]]></title><description><![CDATA[<p>DKlay13 schrieb:</p>
<blockquote>
<p>@Bitte ein Bit</p>
<p><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=":confused:"
      alt="😕"
    /> ka wer das sein soll...sollte man Jürgen Wolf kennen? und was ist an meinem Programmierstill nicht in Ordnung?</p>
</blockquote>
<p>Nein, Jürgen Wolf sollte man nicht kennen. Der ist Autor von den schlechtesten C/C++* Lehrbüchern überhaupt.<br />
Und was deinen Programmierstil angeht:<br />
In C++ nutzt man beispielsweise Referenzen für pass-by-reference, nicht Pointer.<br />
Und Arrays übergibt man nach dem Iteratorenprinzip, ein Zeiger auf das erste Element und eins hinter das letzte Element, dann kann man folgende Schleifen schreiben:</p>
<pre><code>for (; begin != end; ++begin)
    // tu was mit *begin
</code></pre>
<p>Dann muss man auch nicht viel ändern, um den Code für STL-Container (die man eh bevorzugen sollte) anzupassen.</p>
<p>*Man, meine versteckten Witze werden immer besser. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357457</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357457</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Wed, 02 Oct 2013 19:15:43 GMT</pubDate></item><item><title><![CDATA[Reply to Array und Pointer on Wed, 02 Oct 2013 19:26:25 GMT]]></title><description><![CDATA[<blockquote>
<p>Und Arrays übergibt man nach dem Iteratorenprinzip, ein Zeiger auf das erste Element und eins hinter das letzte Element</p>
</blockquote>
<p>Um den Vorteil hier noch ein wenig deutlicher zu machen: Man muss nicht das komplette Array angeben, auch Untermengen sind möglich.</p>
<p>Die Funktion (oder besser das Funktionstemplate) ist so nicht an den Containertyp oder den Iterator gebunden, und kann praktisch über alle Mengen iterieren. Extrem Flexibel.</p>
<blockquote>
<p>das erste Element und eins hinter das letzte Element</p>
</blockquote>
<p>Beiläufig werfe ich für den TE noch den Begriff <em>rechtsoffenes Intervall</em> ein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357461</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357461</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Wed, 02 Oct 2013 19:26:25 GMT</pubDate></item><item><title><![CDATA[Reply to Array und Pointer on Wed, 02 Oct 2013 19:31:03 GMT]]></title><description><![CDATA[<p>Hmm ok das kannte ich zwar aber selten bis nie verwendet, aber wieso wird mein Programmierstill runtergemacht? Die Funktionprototypen sind ja nicht von mir gemacht sondern vorgegeben und evtl. ist das ja auch der Sinn der ganzen Übung <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>
<p>Trotzdem Danke an alle</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357465</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357465</guid><dc:creator><![CDATA[DKlay13]]></dc:creator><pubDate>Wed, 02 Oct 2013 19:31:03 GMT</pubDate></item><item><title><![CDATA[Reply to Array und Pointer on Wed, 02 Oct 2013 19:35:04 GMT]]></title><description><![CDATA[<p>Ach so, ist mir gar nicht aufgefallen.<br />
Trotzdem das dann als Hinweis für die Zukunft.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357467</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Wed, 02 Oct 2013 19:35:04 GMT</pubDate></item><item><title><![CDATA[Reply to Array und Pointer on Fri, 04 Oct 2013 08:03:03 GMT]]></title><description><![CDATA[<blockquote>
<p>Nein, Jürgen Wolf sollte man nicht kennen. Der ist Autor von den schlechtesten C/C++* Lehrbüchern überhaupt.</p>
</blockquote>
<p>Genau deswegen frage ich ja nach. Sein Code hat eine gewisse Ähnlichkeit zu JW. Und man möchte ja vermeiden dass er einen solchen Stil anschlägt.</p>
<p>@DKlay13:</p>
<blockquote>
<p>Hmm ok das kannte ich zwar aber selten bis nie verwendet, aber wieso wird mein Programmierstill runtergemacht?</p>
</blockquote>
<p>Tut mir Leid, ich möchte dich oder deinen Programmierstil nicht runtermachen sondern nur dir einige Fehler in deinem Code aufzeigen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Wenn dein Prof. deinen neuen Code nicht akzeptiert, dann mach es halt so wie er es mag.</p>
<p>1.) Speicherloch: Wer ein new aufruft, muss auch das entsprechende delete aufrufen. Besser ist da RAII oder Smart Pointer (unique_ptr,...). Es gibt kein Argument zu sagen: soll sich das Betriebsystem um die Freigabe kümmern!<br />
2.) Zeiger sind gemein. Sie können auf die gewünschten Daten zeigen, aber auch auf nullptr, 0xCCCCCCCC oder ähnlichem. Referenzen gefallen mir da besser.<br />
3.) const ist dein Freund. Schränkt deinen Code in einer schönen Art und Weise ein, und vermeidet unerwünschte Seiteneffekte wie:</p>
<pre><code>double maxAbstand(Punkt **arrPunkt, Punkt *p1, Punkt *p2)
{
    double nMax = 0;
    double nTempCalc;
    //arrPunkt ist übergebenes Feld
    //über p1 und p2 werden die Punkte zurückgegeben welche den größten abstand haben
    //double abstand(Punkt p1, Punkt p2)
    for(int x=0; x&lt;ARRAY_GROESSE; x++)
    {
        nTempCalc = abstand( *(arrPunkt[x]), *(arrPunkt[ARRAY_GROESSE-1-x]) );

        if( nMax &lt; nTempCalc) {
            p1 = arrPunkt[x];
            p2 = arrPunkt[ARRAY_GROESSE-x-1];
            nMax = nTempCalc;
        }
    }
    // So hier bin ich gemein. Ich lösche das Punkt Array.
    DeletePointArray(arrPunkt);
    // Frage: Wohin zeigen nun p1 und p2? Und wie bemerke ich den Fehler?
    // Ist eigentlich sehr gemeiner Fall. Denn sobald jemand das Array verändert,
    // werdem deine Zeiger oder deren Inhalt p1 und p2 ungültig. (Punkt einfügen)
    // Ich glaube hier wäre es besser die Punkt Call By Value zurückzugeben!
    return nMax;
}
</code></pre>
<p>4.)</p>
<pre><code>//double abstand(Punkt p1, Punkt p2)
double abstand(const Punkt&amp; p1, const Punkt&amp; p2)  // Kein Overhead, da Call By Reference, nicht Call by Value.
// Call by Value wäre hier vermutlich auch noch ok, da Point realtiv klein ist
{
    return sqrt( (p2.y-p1.y)*(p2.y-p1.y) + (p2.x-p1.x)*(p2.x-p1.x) );
}
</code></pre>
<p>4.) Nicht ganz so wichtig: Ich bin kein Freund von Zeiger auf Zeigern. Ich habe ständig das Problem wie ich darauf zugreife:</p>
<pre><code>Punkt **arrPunkt = neuesPunktFeld(ARRAY_GROESSE);
(*arrPunkt)[0] = Punkt;
//oder 
*(arrPunkt[0]) = Punkt;
</code></pre>
<p>5.) Nicht ganz so wichtig: Um ein Array hochzählen sollte man zumindestens ein unsigned int nutzen oder besser size_t und ähnliches. Problem: Wenn die int nur 16 Bits hat, kannst du so nur 2^15 Elemente = 32768 ansprechen.</p>
<pre><code>Punkt **neuesPunktFeld(int nDim)
{
    Punkt **arrPunkt = new Punkt*[nDim];
    //for(int i = 0; i &lt; nDim; i++) // so finde ich es lesbarer
    for(unsigned int i = 0; i &lt; nDim; i++) // so finde ich es lesbarer
    {
        arrPunkt[i] = neuerPunkt();
    }
    return arrPunkt;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2357699</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357699</guid><dc:creator><![CDATA[Bitte ein Bit]]></dc:creator><pubDate>Fri, 04 Oct 2013 08:03:03 GMT</pubDate></item><item><title><![CDATA[Reply to Array und Pointer on Fri, 04 Oct 2013 09:40:00 GMT]]></title><description><![CDATA[<p>DKlay13 schrieb:</p>
<blockquote>
<pre><code>Punkt *neuerPunkt()
{
    ...
}

Punkt **neuesPunktFeld(int nDim)
{
	Punkt **arrPunkt = new Punkt*[nDim];
	for(int i=0; i&lt;nDim; i++) {
		arrPunkt[i] = neuerPunkt();
	}
	return arrPunkt;
}
</code></pre>
</blockquote>
<p>Die Funktion &quot;neuesPunktFeld&quot; erzeugt kein Feld aus Punkten sondern ein Feld aus Zeigern auf Punkten. Es ist also nicht nur gelogen sondern auch ungeschickt.</p>
<p>In gutem, modernem C++ würde das eher so aussehen:</p>
<pre><code>Punkt neuerPunkt() // &lt;-- kein Zeiger als Rückgabewert
{
    ...            // &lt;-- kein new
}

vector&lt;Punkt&gt; neuesPunktFeld(int nDim) // &lt;-- kein Zeiger als Rückgabewert
{
    vector&lt;Punkt&gt; v;                   //     hier reserviert der vector für
    v.reserve(nDim);                   // &lt;-- uns den Speicher und kümmert
    for (int i=0; i&lt;nDim; ++i) {       //     sich dann selbst um die Freigabe
        v.push_back(neuerPunkt());
    }
    // Das reserve ist optional. push_back kann von sich aus auch den
    // vector vergrößern. Aber hier wissen wir schon die finale Größe
    // und können es dem vector per reserve mitteilen. Das wird dann
    // ein kleines bisschen effizienter so.
    return v;
}
</code></pre>
<p>Man kann das auch noch etwas generischer machen, so dass die Funktion neuesPunktFeld eine nahezu beliebige schon existierende Datenstruktur befüllen kann. Aber das wäre hier wahrscheinlich Overkill.</p>
<p>Fazit: Nimm das, was man Dir da beibringen will, nicht für bare Münze. Möglicherweise kennt Dein Lehrer auch nicht die Größe seiner Wissenslücken; denn sonst könnte er Euch nicht guten Gewissens so einen schlechten Stil beibringen. <code>typedef struct</code> und Doppel-Zeiger ohne eine Spur von <a href="https://de.wikipedia.org/wiki/Ressourcenbelegung_ist_Initialisierung" rel="nofollow">RAII</a> sind leider Warnhinweise bzgl. Inkompetenz. Ich empfehle Dir ein begleitendes Selbststudium basierend auf 'nem schlauen Buch, was einen guten Ruf genießt. Achtung: guter Ruf != positive Amazon-Bewertungen. Ein Anfänger, der keine Ahnung hat, kann ein Buch höchstens hinsichtlich Schreibstil bewerten jedoch nicht die Qualität des technischen Inhalts.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357738</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357738</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 04 Oct 2013 09:40:00 GMT</pubDate></item><item><title><![CDATA[Reply to Array und Pointer on Sat, 05 Oct 2013 12:35:19 GMT]]></title><description><![CDATA[<p>Danke nochmal für die Tips werde ich mir zu Herzen nehmen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Aber das mit dem doppelt Pointer würde mich trotzdem interessieren auch wenn es schlechter Still ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2358073</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2358073</guid><dc:creator><![CDATA[DKlay13]]></dc:creator><pubDate>Sat, 05 Oct 2013 12:35:19 GMT</pubDate></item></channel></rss>