<?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[Dynamisches Array kann nicht in einer Funktion genutzt werden?]]></title><description><![CDATA[<p>Servus,</p>
<p>ich möchte die einzelnen Zeichen aus einer Textdatei einlesen, und diese in ein Array speicher. Da man im Vorhinein nicht weiß, wie viele Zeichen darin enthalten sind, muss das Array dynamisch sein.</p>
<p>Folgendermaßen habe ich das Array initialisiert (ist das überhaupt eine Initialisierung, da kein Wert zugewießen wird, denn das passiert dann nur zur Runtime):</p>
<pre><code class="language-cpp">char* pArray = new char [anzahl]
</code></pre>
<p>Diese Zuweisung hier passiert aber erst nachdem ich die wirkliche Anzahl der Zeichen abgefragt habe. Diese Anzahl speichere ich in die Variable anzahl.</p>
<p>Nun, weiße ich innerhalb einer Schleife - welche sich in einer Funktion befindet - jedes Zeichen, das die Datei enthält dem Array zu ( while (!fileInput.eof())... ).</p>
<p>Compilieren kann ich problemlos, jedoch beschwert sich Windows und beendet das Programm (üblicher windows-weiß-nicht-warum-sende-mal-eine-meldung-an-ms-fehler, den ich dann mit &quot;Nicht senden&quot; quittiere)<br />
Mithilfe von Textdebugging weiß ich, dass sich Windows immer bei der Zuweisung von pArray[i] mit einem Zeichen beschwert.<br />
Das passiert aber nur, wenn diese Zuweisung in einer Funktion abläuft.</p>
<p>Folgender Code z.B funktioniert:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

char* pArray;
int anzahl;

int main()
{
	cin &gt;&gt; anzahl;
	char* pArray = new char [anzahl];
	int i (0);
	while (i &lt; anzahl)
	{
		cin &gt;&gt; pArray[i];
		i++;
	}
	cout &lt;&lt; &quot;\n\n&quot;;
	i = 0;
	while (i &lt; anzahl)
	{
		cout &lt;&lt; pArray[i];
		i++;
	}
}
</code></pre>
<p>Wenn ich die ganze Zuweisung aber in eine Funktion auslagere, hackts wieder:</p>
<pre><code class="language-cpp">´#include &lt;iostream&gt;
using namespace std;

char* pArray;
int anzahl;
void read_chars();

int main()
{

	cin &gt;&gt; anzahl;
	char* pArray = new char [anzahl];
	read_chars();	

}

void read_chars()
{
	int i (0);
	while (i &lt; anzahl)
	{
		cin &gt;&gt; pArray[i];
		i++;
	}
	cout &lt;&lt; &quot;\n\n&quot;;
	i = 0;
	while (i &lt; anzahl)
	{
		cout &lt;&lt; pArray[i];
		i++;
	}
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/272870/dynamisches-array-kann-nicht-in-einer-funktion-genutzt-werden</link><generator>RSS for Node</generator><lastBuildDate>Fri, 28 Aug 2026 10:48:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/272870.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 26 Aug 2010 15:37:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Dynamisches Array kann nicht in einer Funktion genutzt werden? on Thu, 26 Aug 2010 15:46:56 GMT]]></title><description><![CDATA[<p>Servus,</p>
<p>ich möchte die einzelnen Zeichen aus einer Textdatei einlesen, und diese in ein Array speicher. Da man im Vorhinein nicht weiß, wie viele Zeichen darin enthalten sind, muss das Array dynamisch sein.</p>
<p>Folgendermaßen habe ich das Array initialisiert (ist das überhaupt eine Initialisierung, da kein Wert zugewießen wird, denn das passiert dann nur zur Runtime):</p>
<pre><code class="language-cpp">char* pArray = new char [anzahl]
</code></pre>
<p>Diese Zuweisung hier passiert aber erst nachdem ich die wirkliche Anzahl der Zeichen abgefragt habe. Diese Anzahl speichere ich in die Variable anzahl.</p>
<p>Nun, weiße ich innerhalb einer Schleife - welche sich in einer Funktion befindet - jedes Zeichen, das die Datei enthält dem Array zu ( while (!fileInput.eof())... ).</p>
<p>Compilieren kann ich problemlos, jedoch beschwert sich Windows und beendet das Programm (üblicher windows-weiß-nicht-warum-sende-mal-eine-meldung-an-ms-fehler, den ich dann mit &quot;Nicht senden&quot; quittiere)<br />
Mithilfe von Textdebugging weiß ich, dass sich Windows immer bei der Zuweisung von pArray[i] mit einem Zeichen beschwert.<br />
Das passiert aber nur, wenn diese Zuweisung in einer Funktion abläuft.</p>
<p>Folgender Code z.B funktioniert:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

char* pArray;
int anzahl;

int main()
{
	cin &gt;&gt; anzahl;
	char* pArray = new char [anzahl];
	int i (0);
	while (i &lt; anzahl)
	{
		cin &gt;&gt; pArray[i];
		i++;
	}
	cout &lt;&lt; &quot;\n\n&quot;;
	i = 0;
	while (i &lt; anzahl)
	{
		cout &lt;&lt; pArray[i];
		i++;
	}
}
</code></pre>
<p>Wenn ich die ganze Zuweisung aber in eine Funktion auslagere, hackts wieder:</p>
<pre><code class="language-cpp">´#include &lt;iostream&gt;
using namespace std;

char* pArray;
int anzahl;
void read_chars();

int main()
{

	cin &gt;&gt; anzahl;
	char* pArray = new char [anzahl];
	read_chars();	

}

void read_chars()
{
	int i (0);
	while (i &lt; anzahl)
	{
		cin &gt;&gt; pArray[i];
		i++;
	}
	cout &lt;&lt; &quot;\n\n&quot;;
	i = 0;
	while (i &lt; anzahl)
	{
		cout &lt;&lt; pArray[i];
		i++;
	}
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1944694</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1944694</guid><dc:creator><![CDATA[RungAaz]]></dc:creator><pubDate>Thu, 26 Aug 2010 15:46:56 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamisches Array kann nicht in einer Funktion genutzt werden? on Thu, 26 Aug 2010 16:07:42 GMT]]></title><description><![CDATA[<p>Gah! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>Nimm doch einfach std::string! Alle Probleme gelöst.</p>
<p>P.S.: Und lass die globalen Variablen sein!</p>
<p>edit: Und dein Fehler ist übrigens, dass du zwei Variablen pArray hast, eine lokal in main, die andere lokal. Dazu:<br />
1. Das wäre nicht passiert, hättest du keine globalen Variablen<br />
2. Davor sollte dich dein Compiler davor warnen. Gerade als Anfänger solltest du unbedingt immer mit allen Warnoptionen und strengster Standardeinhaltung compilieren. Naja, eigentlich nicht nur als Anfänger, sondern immer. Wie das geht steht in deinem Compiler-/IDE-Handbuch oder wenn du dieses nicht findest können wir dir bestimmt auch weiterhelfen, wenn du uns deinen Compiler verrätst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1944697</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1944697</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 26 Aug 2010 16:07:42 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamisches Array kann nicht in einer Funktion genutzt werden? on Thu, 26 Aug 2010 16:09:55 GMT]]></title><description><![CDATA[<p>mh probier mal eine temporäre variable</p>
<pre><code class="language-cpp">char c;
while (...)
cin &gt;&gt; c;
pArray[i] = c;
</code></pre>
<p>nach dem schema<br />
wenn das auch nicht klappt, weiss ich leider auch nichts...<br />
der code sollte eigentlich richtig sein<br />
(ausser das das delte [] pArray am ende fehlt)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1944710</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1944710</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Thu, 26 Aug 2010 16:09:55 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamisches Array kann nicht in einer Funktion genutzt werden? on Thu, 26 Aug 2010 16:14:30 GMT]]></title><description><![CDATA[<p>Dein Problem ist, dass pArray nicht pArray ist. Du legst eine Globale an, mit der du arbeiten willst. In deiner main-Funktion legst du aber einen lokalen Zeiger mit gleichem Namen an, dem du dann auch brav Speicher zuweist. Das ändert dann aber leider nix am globalen Zeiger, der zeigt noch weiterhin ins Nirwana.</p>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /> Ein Debugger hätte helfen können, den Sachverhalt gleich aufzuklären. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1944712</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1944712</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Thu, 26 Aug 2010 16:14:30 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamisches Array kann nicht in einer Funktion genutzt werden? on Thu, 26 Aug 2010 18:34:29 GMT]]></title><description><![CDATA[<p>Heilige Mutter Theresa! Bin ich Blöd. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>Vielen vielen Dank, ich wars irgendwie so von den Funktionen gewöht. Die deklariere ich am Anfang immer (void foo();) und nach der main-Funktion definiere ich sie (void foo(){...}) und jetzt habe ich auch bei der Zuweisung (char* pArray = new char [anzahl]) mein char* noch dabei.<br />
Und der globale Pointer zeigt, wie shcon erwähnt, in Nirvana. Was warschienlich auch der Grund dafür ist, dass der Compiler dazu nichts gesagt hat.<br />
Den Pointer musste ich allerdings global deklarieren, um ihn auch in einer Funktion nutzen zu können - oder?</p>
<p>Wie auch immer, vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1944755</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1944755</guid><dc:creator><![CDATA[RungAaz]]></dc:creator><pubDate>Thu, 26 Aug 2010 18:34:29 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamisches Array kann nicht in einer Funktion genutzt werden? on Thu, 26 Aug 2010 18:47:35 GMT]]></title><description><![CDATA[<p>RungAaz schrieb:</p>
<blockquote>
<p>Den Pointer musste ich allerdings global deklarieren, um ihn auch in einer Funktion nutzen zu können - oder?</p>
</blockquote>
<p>Nein, es gibt dazu Parameterlisten. Globale Variablen sind selten nötig (ich habe nur in ganz wenigen Projekten je eine verwendet).</p>
<p>Die Frage bleibt aber weiterhin warum du nicht mit std::string (oder notfalls einem std::vector&lt;char&gt;) arbeitest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1944760</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1944760</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 26 Aug 2010 18:47:35 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamisches Array kann nicht in einer Funktion genutzt werden? on Thu, 26 Aug 2010 18:53:02 GMT]]></title><description><![CDATA[<blockquote>
<p>Nein, es gibt dazu Parameterlisten. Globale Variablen sind selten nötig (ich habe nur in ganz wenigen Projekten je eine verwendet).</p>
</blockquote>
<p>Stimmt auch wieder.</p>
<blockquote>
<p>Die Frage bleibt aber weiterhin warum du nicht mit std::string (oder notfalls einem std::vector&lt;char&gt;) arbeitest.</p>
</blockquote>
<p>Nun, ich hatte das ganze früher mit dem Vector-Template (wie von dir schon erwähnt) gemacht, aber warum eine zusätzliche Header-Datei einbinden wenn es bei C++ schon standartmäßig den new-Operator gibt?<br />
std::string habe ich nicht verwendet, da ich die Buchstaben einzeln brauche.<br />
Wobei ich die Zeichen, die ein String enthält auch einzeln Manipulieren kann - oder?<br />
Naja, warum einfach, wenn es auch kompliziert geht <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/1944762</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1944762</guid><dc:creator><![CDATA[RungAaz]]></dc:creator><pubDate>Thu, 26 Aug 2010 18:53:02 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamisches Array kann nicht in einer Funktion genutzt werden? on Thu, 26 Aug 2010 19:08:22 GMT]]></title><description><![CDATA[<p>Ungetestet (aber absichtlich noch relativ einfach gehalten):</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;

int main()
{
    int anzahl;
    std::cin &gt;&gt; anzahl;
    std::vector&lt;char&gt; array(anzahl);
    read_chars(array);
}

void read_chars(std::vector&lt;char&gt; &amp; array)
{
    typedef std::vector&lt;char&gt;::iterator TIterator;
    for(TIterator pos = array.begin(), end = array.end(); pos &lt; end; ++pos)
        std::cin &gt;&gt; *pos;
    std::cout &lt;&lt; &quot;\n\n&quot;;
    for(TIterator pos = array.begin(), end = array.end(); pos &lt; end; ++pos)
        std::cout &lt;&lt; *pos;
}
</code></pre>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;

int main()
{
    int anzahl;
    std::cin &gt;&gt; anzahl;
    std::string array(anzahl, '\0');
    read_chars(array);
}

void read_chars(std::string &amp; array)
{
    for(std::string::iterator it pos = array.begin(), end = array.end(); pos &lt; end; ++pos)
        std::cin &gt;&gt; *pos;
    std::cout &lt;&lt; &quot;\n\n&quot;;
    for(std::string::iterator it pos = array.begin(), end = array.end(); pos &lt; end; ++pos)
        std::cout &lt;&lt; *pos;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1944766</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1944766</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 26 Aug 2010 19:08:22 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamisches Array kann nicht in einer Funktion genutzt werden? on Thu, 26 Aug 2010 19:49:21 GMT]]></title><description><![CDATA[<p>OK, also das ist etwas zu hoch für mich...<br />
Ich habe früher Vector benutzt, hat super funktioniert, habe aber anders als du, die Methode vector::push_back(char chr) oder so ähnlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1944782</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1944782</guid><dc:creator><![CDATA[RungAaz]]></dc:creator><pubDate>Thu, 26 Aug 2010 19:49:21 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamisches Array kann nicht in einer Funktion genutzt werden? on Thu, 26 Aug 2010 19:54:43 GMT]]></title><description><![CDATA[<p>RungAaz schrieb:</p>
<blockquote>
<p>OK, also das ist etwas zu hoch für mich...<br />
Ich habe früher Vector benutzt, hat super funktioniert, habe aber anders als du, die Methode vector::push_back(char chr) oder so ähnlich.</p>
</blockquote>
<p>Da du mit einer fixen Länge hantierst, habe ich die Größe im jeweiligen Konstruktor angegeben. Und anschließend habe ich die Iteratoren (eines der Themen die man von der STL kennen sollte) zum durchlaufen benutzt. Wirklich komplizierter als dein Code ist es auch nicht (nur noch ungewohnt für dich). Du kannst natürlich auch mit dem Indexoperator arbeiten...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1944785</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1944785</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 26 Aug 2010 19:54:43 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamisches Array kann nicht in einer Funktion genutzt werden? on Thu, 26 Aug 2010 20:00:54 GMT]]></title><description><![CDATA[<pre><code>eines der Themen die man von der STL kennen sollte
</code></pre>
<p>Ich glaube, das sollte ich mir mal demnächst anschauen.<br />
Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1944786</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1944786</guid><dc:creator><![CDATA[RungAaz]]></dc:creator><pubDate>Thu, 26 Aug 2010 20:00:54 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamisches Array kann nicht in einer Funktion genutzt werden? on Fri, 27 Aug 2010 07:43:33 GMT]]></title><description><![CDATA[<p>RungAaz schrieb:</p>
<blockquote>
<pre><code>eines der Themen die man von der STL kennen sollte
</code></pre>
<p>Ich glaube, das sollte ich mir mal demnächst anschauen.<br />
Danke.</p>
</blockquote>
<p>An sich ist das Konzept recht einfach. Einen Iterator kannst du dir wie einen Zeiger vorstellen, der immer eine Position weiter gesetzt wird (Bei linear aufgebauten Datencontainern kann dies auch tatsächlich ein Zeiger sein, aber spätestens bei dynamischen Listen ist es eine Klasse).</p>
<p>Jeder STL-Container (std::string, std::vector, std::list, std::map...) hat die Typdefinitionen iterator und const_iterator (letztere wenn du keine Änderungen am Element durchführen willst, habe ich aber hier ignoriert, die zweite Schleife hätte ein solchen verwenden können).</p>
<p>Das heißt <em>std::vector&lt;char&gt;::iterator</em> ist beispielsweise eine Typdefinition des Iterators der im std::vector&lt;char&gt; verwendet wird.</p>
<p>begin() liefert den Iterator auf das erste, end() den auf das Element HINTER dem letzten (Sprich: ein ungültiges!). Die Abbruchbedingung ist also, das man, wenn dieses erreicht wird, nichts mehr damit anstellt <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="😉"
    /></p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;

int main()
{
    int anzahl;
    std::cin &gt;&gt; anzahl;
    std::vector&lt;char&gt; array(anzahl); // Konstruktor mit &quot;anzahl&quot; Elementen.
    read_chars(array);
}

void read_chars(std::vector&lt;char&gt; &amp; array) // Als Referenz, um es direkt zu
{                                          // manipulieren
    // Zur Verkürzung habe ich ein typdef verwendet.
    typedef std::vector&lt;char&gt;::iterator TIterator;

    // Stell dir den TIterator erst einmal als Zeiger vor. &quot;pos&quot; wird auf
    // den ersten Eintrag, end auf den Eintrag HINTER dem letzten gelegt.
    //
    // Dieser Iterator wird mit jedem Durchlauf um ein Element weiter gesetzt,
    // und es wird abgebrochen wenn pos==end ist.
    for(TIterator pos = array.begin(), end = array.end(); pos != end; ++pos)
        std::cin &gt;&gt; *pos; // *&lt;iterator&gt; liefert den Wert.

    std::cout &lt;&lt; &quot;\n\n&quot;;
    for(TIterator pos = array.begin(), end = array.end(); pos != end; ++pos)
        std::cout &lt;&lt; *pos;
}
</code></pre>
<p>Der Vorteil an Iterator ist, das sie auch auf Klassen funktionieren, deren Speicher nicht linear aufgebaut ist, und es gibt sogar Iteratoren für das einlesen aus Streams etc.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1944893</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1944893</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Fri, 27 Aug 2010 07:43:33 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamisches Array kann nicht in einer Funktion genutzt werden? on Fri, 27 Aug 2010 10:55:13 GMT]]></title><description><![CDATA[<p>Danke, jetzt peil ich besser durch.</p>
<p>Was aber, wenn ich zwei Pointer erstellen würde:</p>
<pre><code class="language-cpp">std::vector&lt;char&gt;* pPos = NULL, pEnd = NULL;
</code></pre>
<p>Die dann jeweils auf den Anfang und das Element hinter dem letzten Element zeigen:</p>
<pre><code class="language-cpp">pPos = array.begin();
pEnd = array.end();
</code></pre>
<p>Und dann in folgende Schleife einfügt:</p>
<pre><code class="language-cpp">int i (0);
while (i != pEnd)
{
    std::cin &gt;&gt; *(pPos+i);
    i++;
}
</code></pre>
<p>Würde das auf funktionieren?<br />
Oder funktioniert das nicht, weil es ganz normale Pointer sind?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1944955</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1944955</guid><dc:creator><![CDATA[RungAaz]]></dc:creator><pubDate>Fri, 27 Aug 2010 10:55:13 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamisches Array kann nicht in einer Funktion genutzt werden? on Fri, 27 Aug 2010 11:09:07 GMT]]></title><description><![CDATA[<p>Du kannst im Falle von std::vector Pointer äquivalent zu Iteratoren benutzen, ja. Der Vorteil der Iteratoren ist, dass du später einfach mal den Container wechseln kannst, ohne irgendwo im Programm etwas zu ändern.</p>
<p>Dein kleines Beispiel wird jedoch nicht funktionieren, da du nicht einen Iterator einem Pointer zuweisen kannst, du musst schon die Adressen der Objekte nehmen auf die sich die Iteratoren beziehen.</p>
<p>P.S.: Und was soll denn das geNULLe bei den Pointern? Das deutet irgendwie darauf hin, dass du Pointer nicht richtig verstanden hast und da lieber erstmal die Finger von lassen solltest. Mit Iteratoren fährst du wesentlich fehlerrobuster und anfängerfreundlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1944963</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1944963</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 27 Aug 2010 11:09:07 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamisches Array kann nicht in einer Funktion genutzt werden? on Fri, 27 Aug 2010 11:32:35 GMT]]></title><description><![CDATA[<p>RungAaz schrieb:</p>
<blockquote>
<p>Was aber, wenn ich zwei Pointer erstellen würde:</p>
<pre><code class="language-cpp">std::vector&lt;char&gt;* pPos = NULL, pEnd = NULL;
</code></pre>
</blockquote>
<p>Warum nimmst du nicht die beschriebenen Iteratoren, und versuchst dich krampfhaft an den Zeigern aufzuhängen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1944979</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1944979</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Fri, 27 Aug 2010 11:32:35 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamisches Array kann nicht in einer Funktion genutzt werden? on Fri, 27 Aug 2010 18:00:11 GMT]]></title><description><![CDATA[<blockquote>
<p>P.S.: Und was soll denn das geNULLe bei den Pointern? Das deutet irgendwie darauf hin, dass du Pointer nicht richtig verstanden hast und da lieber erstmal die Finger von lassen solltest. Mit Iteratoren fährst du wesentlich fehlerrobuster und anfängerfreundlich.</p>
</blockquote>
<p>Laut einem Tutorial sollte man Pointer, sofern man sie nicht gleich zuweist immer auf NULL setzten, weil die sonst irgendwo hindeuten - oder nicht?</p>
<blockquote>
<p>Warum nimmst du nicht die beschriebenen Iteratoren, und versuchst dich krampfhaft an den Zeigern aufzuhängen?</p>
</blockquote>
<p>Keine Angst, ich nehme schon die Iteratoren. Mich hat es lediglich interessiert, ob es auch auf eine andere Weise geht, da du ja schon vorher erwähnt hast, dass diese Teile einem Pointer sehr ähnlich sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1945180</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1945180</guid><dc:creator><![CDATA[RungAaz]]></dc:creator><pubDate>Fri, 27 Aug 2010 18:00:11 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamisches Array kann nicht in einer Funktion genutzt werden? on Fri, 27 Aug 2010 18:17:42 GMT]]></title><description><![CDATA[<p>RungAaz schrieb:</p>
<blockquote>
<blockquote>
<p>P.S.: Und was soll denn das geNULLe bei den Pointern? Das deutet irgendwie darauf hin, dass du Pointer nicht richtig verstanden hast und da lieber erstmal die Finger von lassen solltest. Mit Iteratoren fährst du wesentlich fehlerrobuster und anfängerfreundlich.</p>
</blockquote>
<p>Laut einem Tutorial sollte man Pointer, sofern man sie nicht gleich zuweist immer auf NULL setzten, weil die sonst irgendwo hindeuten - oder nicht?</p>
</blockquote>
<p>Schlechtes Tutorial. Du als Programmierer musst bei solcher Art von Zeigerbenutzung jederzeit selber wissen ob dein Zeiger auf ein gültiges Objekt zeigt. Das geNULLe ist Cargo Cult von Leuten die das mal bei gewissen Datenstrukturen wie verketteten Listen gesehen haben, aber nicht verstanden haben, warum das dort Sinn macht.</p>
<p>Die Technik mit dem NULLen von ungültigen Zeigern bewährt dich zwar vor sofortigem Programmabsturz im Fehlerfall, aber dennoch ist in diesem Fall ein Fehler in der Programmlogik aufgetreten. Und das schlimmste ist: Nun bekommst du es noch nicht einmal mit und dein Programm bleibt fehlerhaft!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1945186</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1945186</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 27 Aug 2010 18:17:42 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamisches Array kann nicht in einer Funktion genutzt werden? on Fri, 27 Aug 2010 21:10:22 GMT]]></title><description><![CDATA[<p>Ok, das stimmt auch wieder.<br />
Also ist und bleibt die sinnvollste Verwendung von einem NULL-Wert, die Parameterübergabe bei Funktionen. Falls in der Parameterliste ein Pointer existiert, den man beim Aufruf grade nicht braucht - oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1945235</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1945235</guid><dc:creator><![CDATA[RungAaz]]></dc:creator><pubDate>Fri, 27 Aug 2010 21:10:22 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamisches Array kann nicht in einer Funktion genutzt werden? on Fri, 27 Aug 2010 21:15:53 GMT]]></title><description><![CDATA[<p>Es gibt viele sinnvolle Anwendungen von Nullpointern und ich kenne sicherlich nicht alle. Ich wollte bloß klarstellen, dass dies hier keine ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1945236</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1945236</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 27 Aug 2010 21:15:53 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamisches Array kann nicht in einer Funktion genutzt werden? on Sat, 28 Aug 2010 12:28:02 GMT]]></title><description><![CDATA[<p>Achso, ok, dann werde ich mir das mal merken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1945349</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1945349</guid><dc:creator><![CDATA[RungAaz]]></dc:creator><pubDate>Sat, 28 Aug 2010 12:28:02 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamisches Array kann nicht in einer Funktion genutzt werden? on Sun, 29 Aug 2010 05:45:48 GMT]]></title><description><![CDATA[<p>RungAaz schrieb:</p>
<blockquote>
<p>Nun, ich hatte das ganze früher mit dem Vector-Template (wie von dir schon erwähnt) gemacht, aber warum eine zusätzliche Header-Datei einbinden wenn es bei C++ schon standartmäßig den new-Operator gibt?</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /><br />
new[] und delete[] sind &quot;low level&quot; Operationen. Ein vektor ist ein &quot;high level&quot; Konzept. Da gibt es schon genug Unterschiede, die für vektor sprechen, zB:<br />
- Verwaltung des reservierten Speichers übernimmt der Vektor<br />
- C++ Implementierungen bieten oft einen &quot;STL Debug-Modus&quot; mit &quot;sicheren Iteratoren&quot; und zusätzlichen Bereichsüberprüfungen an.</p>
<p>RungAaz schrieb:</p>
<blockquote>
<p>std::string habe ich nicht verwendet, da ich die Buchstaben einzeln brauche.<br />
Wobei ich die Zeichen, die ein String enthält auch einzeln Manipulieren kann - oder?<br />
Naja, warum einfach, wenn es auch kompliziert geht <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>
</blockquote>
<p>Genau. Das ist die Frage. Warum new[]/delete[] benutzen, wenn Du auch vector oder string hättest nehmen können? Dass Du einen zusätzlichen Header einbinden musst ist kein guter Grund.</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1945550</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1945550</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 29 Aug 2010 05:45:48 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamisches Array kann nicht in einer Funktion genutzt werden? on Sun, 29 Aug 2010 11:36:35 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>new[] und delete[] sind &quot;low level&quot; Operationen. Ein vektor ist ein &quot;high level&quot; Konzept.</p>
</blockquote>
<p>low und high levels sollten nie ein Entscheidungskriterium sein, weil wie hier bei Vorliegen weiterer Gründe völlig irrelevant, und bei Nichtvorliegen stets zu Fehlschlüssen führend.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1945642</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1945642</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 29 Aug 2010 11:36:35 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamisches Array kann nicht in einer Funktion genutzt werden? on Sun, 29 Aug 2010 19:57:33 GMT]]></title><description><![CDATA[<p>Also, auch wenn ich mir das Leben mit <em>new</em> und <em>delete</em> schwerer mache als es ist, bleibt die Erfahrung, die ich damit mache, und daruaf kommt es doch hauptsächlich an - oder nicht?</p>
<p>Beispielsweise habe ich dadurch erfahren, dass ein Grund für das Verrecken des Programms während der Runtime das Nicht- bzw. Reinitialisieren eines Pointers sein kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1945860</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1945860</guid><dc:creator><![CDATA[RungAaz]]></dc:creator><pubDate>Sun, 29 Aug 2010 19:57:33 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamisches Array kann nicht in einer Funktion genutzt werden? on Mon, 30 Aug 2010 06:41:10 GMT]]></title><description><![CDATA[<p>RungAaz schrieb:</p>
<blockquote>
<p>Also, auch wenn ich mir das Leben mit <em>new</em> und <em>delete</em> schwerer mache als es ist, bleibt die Erfahrung, die ich damit mache, und daruaf kommt es doch hauptsächlich an - oder nicht?</p>
<p>Beispielsweise habe ich dadurch erfahren, dass ein Grund für das Verrecken des Programms während der Runtime das Nicht- bzw. Reinitialisieren eines Pointers sein kann.</p>
</blockquote>
<p>Lass dir nichts einreden. Natürlich sind STL-Container normalerweise einfacher, weniger fehleranfällig und daher sinnvoller. Das heißt aber nicht, dass hier ständig Anfängern geraten werden muss, bloß nie - und sei es auch in Übungsprogrammen - new/delete/new[]/delete[] zu benutzen. Egal, mit wievielen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> - Smileys das hier immer unterstrichen wird, diesen Weg sollte man schon kennenlernen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1945979</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1945979</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Mon, 30 Aug 2010 06:41:10 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamisches Array kann nicht in einer Funktion genutzt werden? on Tue, 31 Aug 2010 15:27:54 GMT]]></title><description><![CDATA[<p>Wichtig ist, dass du zwischen Herumexperimentieren/Lernen/Erfahrung sammeln und produktivem Einsatz unterscheidest. Der erste Teil darf keineswegs zu kurz kommen. Doch wenn es für eine konkrete Problemstellung darum geht, mehrere Objekte gemeinsam zu verwalten, sind die STL-Container im Allgemeinen die bessere Wahl, da sie genau diese Anforderung erfüllen und dich von hintergründigen Aufgaben wie Speicherverwaltung entlasten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1946629</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1946629</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 31 Aug 2010 15:27:54 GMT</pubDate></item></channel></rss>