<?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[Verbesserungsvorschläge und Kritik]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich hoffe ich bin hier im richtigen Unterforum.<br />
Wie der Titel schon sagt, meine Anwendung läuft nicht auf anderen Rechnern.<br />
Beides 32-bit Systeme, ich vermute mal dass es daran liegt.<br />
Erstellt wurde das ganze mit MS Visual C++ 2010 Express Beta 2 (Die 2008er Version habe ich auch probiert, lief auf dasselbe hinaus - Anwendung flackert nur kurz auf und schließt sich wieder, die Tips im FAQ habe ich ausprobiert - ohne Erfolg)<br />
Code::Blocks brachte Abhilfe, das Programm ist jetzt lauffähig auf anderen PCs *freu*</p>
<p>Nachdem ich mich durch André Willms 'C++ Programmierung lernen' durchgearbeitet habe, habe ich folgendes Programm entworfen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;conio.h&gt;

using namespace std;

void creawrite(char* filename, char* name, int* line, char* secpfad)
{
	int i;
	char p[500];
	char kar[100];
	char* k=kar;
	strcpy(k,secpfad);
	strncat(k,filename,100);
	ifstream main(name);
	ofstream person(k);
	for (unsigned int i=0;i&lt;(*line);i++)
	{
		main.getline(p,500);
	}

	for (i=0; p[i] != *&quot;:&quot;; i++) {} //Abstand bis zum Doppelpunkt messen
	i++; 							// Doppelpunkt überspringen, soll ja nicht im Enddokument stehen
	if (p[i]==*&quot; &quot;)
	{
		i++;			//etwaiges Leerzeichen eliminieren
	}
	for (unsigned int z=0;z&lt;strlen(p);z++, i++)
	{
		p[z]=p[i];		//Stringcontent nach vorne 'holen'
	}
	person &lt;&lt; p &lt;&lt; endl;
	cout &lt;&lt; &quot;Datei &lt;&quot; &lt;&lt; k &lt;&lt; &quot;&gt; wurde geschrieben&quot;;

	person.close();
	main.close();
	//aufräumen =)
	cout &lt;&lt; endl &lt;&lt; &quot;Zeile &quot; &lt;&lt; *line &lt;&lt; &quot; fertig!&quot; &lt;&lt; endl;

}

char* readname(char* pfad, char* name,int* line)
{
	unsigned int i=0;
	static int count=0;
	ifstream main(pfad);
	(*line)++;
	for (unsigned int i=0;i&lt;(*line) &amp;&amp; (!main.eof()); i++)
	{
		main.getline(name, 50);
	}
	char* p = new char[50];
	cout &lt;&lt; endl &lt;&lt; endl &lt;&lt; &quot;Zeile einlesen...&quot;;
	for (i=0; name[i] != *&quot;:&quot;;i++)
	{
		p[i]=name[i];
	}
	cout &lt;&lt; endl &lt;&lt; &quot;Einlesen fertig...&quot;;
	main.close();
	p[i]   = *&quot;.&quot;;
	p[i+1] = *&quot;t&quot;;
	p[i+2] = *&quot;x&quot;;
	p[i+3] = *&quot;t&quot;;
	p[i+4] = *&quot;\0&quot;;
	return p;
}

int main(){

	int line=0, lines;

	char pfad[100], name[50], secpfad[100];
	cout &lt;&lt; &quot;Abikommentarreader/-writer v 0.3&quot; &lt;&lt; endl
		 &lt;&lt; &quot;-----------------------------------------------------------------------&quot; &lt;&lt; endl &lt;&lt; endl;

		cout &lt;&lt; &quot;Pfad zu der zu bearbeitenden Datei (.txt): &quot;;
		cin.getline(pfad, 100);
		ifstream main(pfad);

		while (!main)
		{
			cout &lt;&lt; &quot;!!! Die Datei konnte nicht geoeffnet werden !!!&quot; &lt;&lt; endl;
			cout &lt;&lt; &quot;Pfad zu der zu bearbeitenden Datei (.txt): &quot;;
			cin.getline(pfad, 100);
			ifstream main(pfad);
		}

	cout &lt;&lt; endl &lt;&lt; &quot;Speicherort der erstellten Dateien (Backslash nicht vergessen): &quot;;
	cin.getline(secpfad,100);
	if(secpfad[strlen(secpfad)] != *&quot;\ &quot;)
	{
		strncat(secpfad,&quot;\\0 &quot;, 1);
	} //Pfad vervollständigen, falls noch nicht getan

	char* p = new char [501];
	for (lines=-1; !main.eof();lines++)
	{
		main.getline(p,500);
		}		//Zeilen zählen, hier muss was besseres her
	cout &lt;&lt; endl &lt;&lt; &quot;Zeilen: &quot; &lt;&lt; lines;
	delete [] p;
	for (unsigned int x=0;x &lt;= lines;x++)
	{
		creawrite(readname(pfad, name, &amp;line), pfad, &amp;line, secpfad);
		 //Dateiname und Speicherpfad zusammenfügen         ^ 
                //dateiname bestimmen und datei erstellen, beschreiben,schließen

	main.close(); //zu
	getch();
	return 0;
}
</code></pre>
<p>Das Programm soll Mitarbeitern des Abizeitungsteams helfen, die Datenmenge schneller zu verarbeiten.<br />
Jedes Stufenmitglied schickt eine txt-Datei mit folgender Formatierung an den Verwalter:<br />
[...]<br />
Name: Beschreibung<br />
Name: Beschreibung<br />
[...]</p>
<p>Das Programm öffnet nun eine Datei mit dem Namen des Schülers und schreibt das hinein, was hinter dem Doppelpunkt nach dem Namen stand - so lange bis die Datei eben zu Ende ist.</p>
<p>Eine Frage zum Code habe ich aber:</p>
<p>in creawrite():<br />
der Funktion wird ja ein pointer zu einem mit new erstellten Feld übergeben.<br />
Wenn ich der Funktion jetzt sage, sie soll nachdem der Pointer die Notwendigkeit verloren hat, den Pointer deleten [],<br />
wird darauf leider nichts - Fehlermeldung...weshalb?</p>
<p>Über Optimierungen und andere Vorschläge würde ich mich freuen <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/topic/256648/verbesserungsvorschläge-und-kritik</link><generator>RSS for Node</generator><lastBuildDate>Fri, 11 Sep 2026 03:46:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/256648.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 15 Dec 2009 21:44:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Verbesserungsvorschläge und Kritik on Tue, 15 Dec 2009 21:44:58 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich hoffe ich bin hier im richtigen Unterforum.<br />
Wie der Titel schon sagt, meine Anwendung läuft nicht auf anderen Rechnern.<br />
Beides 32-bit Systeme, ich vermute mal dass es daran liegt.<br />
Erstellt wurde das ganze mit MS Visual C++ 2010 Express Beta 2 (Die 2008er Version habe ich auch probiert, lief auf dasselbe hinaus - Anwendung flackert nur kurz auf und schließt sich wieder, die Tips im FAQ habe ich ausprobiert - ohne Erfolg)<br />
Code::Blocks brachte Abhilfe, das Programm ist jetzt lauffähig auf anderen PCs *freu*</p>
<p>Nachdem ich mich durch André Willms 'C++ Programmierung lernen' durchgearbeitet habe, habe ich folgendes Programm entworfen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;conio.h&gt;

using namespace std;

void creawrite(char* filename, char* name, int* line, char* secpfad)
{
	int i;
	char p[500];
	char kar[100];
	char* k=kar;
	strcpy(k,secpfad);
	strncat(k,filename,100);
	ifstream main(name);
	ofstream person(k);
	for (unsigned int i=0;i&lt;(*line);i++)
	{
		main.getline(p,500);
	}

	for (i=0; p[i] != *&quot;:&quot;; i++) {} //Abstand bis zum Doppelpunkt messen
	i++; 							// Doppelpunkt überspringen, soll ja nicht im Enddokument stehen
	if (p[i]==*&quot; &quot;)
	{
		i++;			//etwaiges Leerzeichen eliminieren
	}
	for (unsigned int z=0;z&lt;strlen(p);z++, i++)
	{
		p[z]=p[i];		//Stringcontent nach vorne 'holen'
	}
	person &lt;&lt; p &lt;&lt; endl;
	cout &lt;&lt; &quot;Datei &lt;&quot; &lt;&lt; k &lt;&lt; &quot;&gt; wurde geschrieben&quot;;

	person.close();
	main.close();
	//aufräumen =)
	cout &lt;&lt; endl &lt;&lt; &quot;Zeile &quot; &lt;&lt; *line &lt;&lt; &quot; fertig!&quot; &lt;&lt; endl;

}

char* readname(char* pfad, char* name,int* line)
{
	unsigned int i=0;
	static int count=0;
	ifstream main(pfad);
	(*line)++;
	for (unsigned int i=0;i&lt;(*line) &amp;&amp; (!main.eof()); i++)
	{
		main.getline(name, 50);
	}
	char* p = new char[50];
	cout &lt;&lt; endl &lt;&lt; endl &lt;&lt; &quot;Zeile einlesen...&quot;;
	for (i=0; name[i] != *&quot;:&quot;;i++)
	{
		p[i]=name[i];
	}
	cout &lt;&lt; endl &lt;&lt; &quot;Einlesen fertig...&quot;;
	main.close();
	p[i]   = *&quot;.&quot;;
	p[i+1] = *&quot;t&quot;;
	p[i+2] = *&quot;x&quot;;
	p[i+3] = *&quot;t&quot;;
	p[i+4] = *&quot;\0&quot;;
	return p;
}

int main(){

	int line=0, lines;

	char pfad[100], name[50], secpfad[100];
	cout &lt;&lt; &quot;Abikommentarreader/-writer v 0.3&quot; &lt;&lt; endl
		 &lt;&lt; &quot;-----------------------------------------------------------------------&quot; &lt;&lt; endl &lt;&lt; endl;

		cout &lt;&lt; &quot;Pfad zu der zu bearbeitenden Datei (.txt): &quot;;
		cin.getline(pfad, 100);
		ifstream main(pfad);

		while (!main)
		{
			cout &lt;&lt; &quot;!!! Die Datei konnte nicht geoeffnet werden !!!&quot; &lt;&lt; endl;
			cout &lt;&lt; &quot;Pfad zu der zu bearbeitenden Datei (.txt): &quot;;
			cin.getline(pfad, 100);
			ifstream main(pfad);
		}

	cout &lt;&lt; endl &lt;&lt; &quot;Speicherort der erstellten Dateien (Backslash nicht vergessen): &quot;;
	cin.getline(secpfad,100);
	if(secpfad[strlen(secpfad)] != *&quot;\ &quot;)
	{
		strncat(secpfad,&quot;\\0 &quot;, 1);
	} //Pfad vervollständigen, falls noch nicht getan

	char* p = new char [501];
	for (lines=-1; !main.eof();lines++)
	{
		main.getline(p,500);
		}		//Zeilen zählen, hier muss was besseres her
	cout &lt;&lt; endl &lt;&lt; &quot;Zeilen: &quot; &lt;&lt; lines;
	delete [] p;
	for (unsigned int x=0;x &lt;= lines;x++)
	{
		creawrite(readname(pfad, name, &amp;line), pfad, &amp;line, secpfad);
		 //Dateiname und Speicherpfad zusammenfügen         ^ 
                //dateiname bestimmen und datei erstellen, beschreiben,schließen

	main.close(); //zu
	getch();
	return 0;
}
</code></pre>
<p>Das Programm soll Mitarbeitern des Abizeitungsteams helfen, die Datenmenge schneller zu verarbeiten.<br />
Jedes Stufenmitglied schickt eine txt-Datei mit folgender Formatierung an den Verwalter:<br />
[...]<br />
Name: Beschreibung<br />
Name: Beschreibung<br />
[...]</p>
<p>Das Programm öffnet nun eine Datei mit dem Namen des Schülers und schreibt das hinein, was hinter dem Doppelpunkt nach dem Namen stand - so lange bis die Datei eben zu Ende ist.</p>
<p>Eine Frage zum Code habe ich aber:</p>
<p>in creawrite():<br />
der Funktion wird ja ein pointer zu einem mit new erstellten Feld übergeben.<br />
Wenn ich der Funktion jetzt sage, sie soll nachdem der Pointer die Notwendigkeit verloren hat, den Pointer deleten [],<br />
wird darauf leider nichts - Fehlermeldung...weshalb?</p>
<p>Über Optimierungen und andere Vorschläge würde ich mich freuen <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/1823182</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1823182</guid><dc:creator><![CDATA[n0stradamus]]></dc:creator><pubDate>Tue, 15 Dec 2009 21:44:58 GMT</pubDate></item><item><title><![CDATA[Reply to Verbesserungsvorschläge und Kritik on Tue, 15 Dec 2009 23:18:09 GMT]]></title><description><![CDATA[<p>Was mir gerade auffällt:</p>
<ul>
<li>Der Code erinnert viel eher an C als an C++. Die ganzen <code>str...()</code> -Funktionen, die <code>char</code> -Arrays und -Zeiger, die manuelle Speicherverwaltung. In C++ hast du die STL, <code>std::string</code> und Konsorten, welche dir viele Arbeit und Mühe abnehmen. Vielleicht hilft dir <a href="http://magazin.c-plusplus.net/artikel/Aufbau%20der%20STL%20-%20Teil%201%3A%20Container" rel="nofollow">das</a> als Einstieg.</li>
<li>Du hast Memory Leaks. Der Speicher, den die Funktion <code>readname()</code> für <code>p</code> belegt, wird nirgends freigegeben.</li>
<li>Magic Numbers im Code sind schlecht, weil sie die Wartbarkeit erschweren und Fehler fördern. Nimm eine aussagekräftige Konstante statt 500, oder – noch besser – lege dich nicht auf eine fixe Grösse fest (siehe dafür Punkt 1), weil dich das in der Flexibilität einschränkt und langfristig nur Probleme bringt (was ist, wenn plötzlich 502 Zeichen benötigt werden? Oder nur drei? Sinnlos Speicher verschwenden?).</li>
<li><code>*&quot;x&quot;</code> – sowas hab ich noch nie gesehen. Nimm für <code>char</code> -Literale einfache Anführungszeichen, also <code>'x'</code> .</li>
<li><code>main</code> ist ein schlechter Bezeichner.</li>
</ul>
]]></description><link>https://www.c-plusplus.net/forum/post/1823228</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1823228</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 15 Dec 2009 23:18:09 GMT</pubDate></item><item><title><![CDATA[Reply to Verbesserungsvorschläge und Kritik on Wed, 16 Dec 2009 13:51:39 GMT]]></title><description><![CDATA[<p>Danke für die Antwort, werde mir das mit deinen Link mal anschauen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /><br />
Die Problematik des Memory Leaks war mir bewusst, aber jedesmal wenn ich<br />
delete [] p in creawrite()<br />
eingebaut habe, gab es nach einem Durchgang (Zeile) jede Menge Fehlermeldungen...<br />
Was mich bisher vor der Verwendung von strings abgehalten hat, war die Tatsache dass ich nicht wusste, wie groß ein String ist. Wächst und schrumpft er dynamisch mit seinem Inhalt, mal etwas doof gefragt ?</p>
<p>Andere Funktionen als die str...() kenne ich nicht. Gibt es denn noch andere Möglichkeiten die Länge eines Strings zu bestimmen. Zeiger finde ich dafür ganz praktisch, weil man schon das ein oder andere Byte, als auch Zeit damit spart.<br />
Aneinanderhängen ist ja bei Strings mit += möglich.</p>
<p>Vielen Dank soweit,</p>
<p>n0stradamus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1823498</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1823498</guid><dc:creator><![CDATA[n0stradamus]]></dc:creator><pubDate>Wed, 16 Dec 2009 13:51:39 GMT</pubDate></item><item><title><![CDATA[Reply to Verbesserungsvorschläge und Kritik on Wed, 16 Dec 2009 13:58:47 GMT]]></title><description><![CDATA[<p>std::string ist vollautomatisch in jeder Hinsicht, das ist ja gerade das praktische daran.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1823505</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1823505</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 16 Dec 2009 13:58:47 GMT</pubDate></item><item><title><![CDATA[Reply to Verbesserungsvorschläge und Kritik on Wed, 16 Dec 2009 14:05:38 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>std::string ist vollautomatisch in jeder Hinsicht, das ist ja gerade das praktische daran.</p>
</blockquote>
<p>Ist ja genial, warum wird das dann mit keinem Wort in dem Buch erwähnt ?...<br />
Aber deswegen bin ich ja im Forum, danke für den Hinweis^^</p>
<p>Woran liegt es eigentlich, dass mit MS Visual Studio Express 2008/2010 Beta 2 erstellte Programme nur auf meinem Rechner laufen?<br />
Sobald ich Code::Blocks verwende, ist das kein Problem mehr</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1823507</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1823507</guid><dc:creator><![CDATA[n0stradamus]]></dc:creator><pubDate>Wed, 16 Dec 2009 14:05:38 GMT</pubDate></item><item><title><![CDATA[Reply to Verbesserungsvorschläge und Kritik on Wed, 16 Dec 2009 14:08:10 GMT]]></title><description><![CDATA[<p>n0stradamus schrieb:</p>
<blockquote>
<p>Die Problematik des Memory Leaks war mir bewusst, aber jedesmal wenn ich delete [] p in creawrite() eingebaut habe, gab es nach einem Durchgang (Zeile) jede Menge Fehlermeldungen...</p>
</blockquote>
<p>Grundsätzlich:<br />
a) Zu jedem new genau ein delete, zu jedem new[] genau ein delete[]<br />
b) Man sollte new/delete möglichst innerhalb der gleichen Funktion verwenden, nicht aber dies aufteilen (dann wird es sehr unintuitiv mit der Bearbeitung - Muss ich nun den Speicher freigeben/reservieren oder nicht?).</p>
<p>n0stradamus schrieb:</p>
<blockquote>
<p>Was mich bisher vor der Verwendung von strings abgehalten hat, war die Tatsache dass ich nicht wusste, wie groß ein String ist. Wächst und schrumpft er dynamisch mit seinem Inhalt, mal etwas doof gefragt ?</p>
</blockquote>
<p>std::string verwaltet seinen Speicher selbst und ist dynamisch. Die Stringklasse bietet diverse Methoden an (u.a. auch um die Länge zu bestimmen).</p>
<p>n0stradamus schrieb:</p>
<blockquote>
<p>Gibt es denn noch andere Möglichkeiten die Länge eines Strings zu bestimmen. Zeiger finde ich dafür ganz praktisch, weil man schon das ein oder andere Byte, als auch Zeit damit spart.</p>
</blockquote>
<p>Mache dich mit der string-Klasse und deren Methoden vertraut. Zudem sehe ich es im ersten Schritt wichtiger an, das ein Programm möglichst fehlerfrei läuft, und erst im Zweiten sollte man - sofern man sicher weiß wo die Performance verloren geht (Was nur ein Profiler sagen kann, das Bauchgefühl liegt in der Regel in 90% daneben) - dann optimieren.</p>
<p>n0stradamus schrieb:</p>
<blockquote>
<p>Aneinanderhängen ist ja bei Strings mit += möglich.</p>
</blockquote>
<p>Aber nur bei der string-Klasse, nicht bei C-Strings.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1823512</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1823512</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Wed, 16 Dec 2009 14:08:10 GMT</pubDate></item><item><title><![CDATA[Reply to Verbesserungsvorschläge und Kritik on Wed, 16 Dec 2009 14:15:44 GMT]]></title><description><![CDATA[<p>n0stradamus schrieb:</p>
<blockquote>
<p>Woran liegt es eigentlich, dass mit MS Visual Studio Express 2008/2010 Beta 2 erstellte Programme nur auf meinem Rechner laufen?</p>
</blockquote>
<p>1. Als Releaseversion linken.<br />
2. Die Runtime muss entweder statisch in das Programm gelinkt werden, oder auf dem Rechner verfügbar sein. Siehe z.B. <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=9b2da534-3e03-4391-8a4d-074b9f2bc1bf&amp;displaylang=en" rel="nofollow">dies</a> hier für den 2008er [in der Regel sollte die aber meist durch andere Programme schon vorliegen]. Beim 2010er sieht es sicherlich (da neu) Anders aus.</p>
<p>n0stradamus schrieb:</p>
<blockquote>
<p>Sobald ich Code::Blocks verwende, ist das kein Problem mehr</p>
</blockquote>
<p>Code::Blocks linkt glaube ich von Haus aus die Runtime statisch zum Programm hinzu.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1823518</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1823518</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Wed, 16 Dec 2009 14:15:44 GMT</pubDate></item><item><title><![CDATA[Reply to Verbesserungsvorschläge und Kritik on Wed, 16 Dec 2009 14:46:54 GMT]]></title><description><![CDATA[<p>n0stradamus schrieb:</p>
<blockquote>
<p>Die Problematik des Memory Leaks war mir bewusst, aber jedesmal wenn ich<br />
delete [] p in creawrite()<br />
eingebaut habe, gab es nach einem Durchgang (Zeile) jede Menge Fehlermeldungen...</p>
</blockquote>
<p>Auch, wenn du wohl lieber std::string verwenden wirst (was auch durchaus ratsam ist):</p>
<p>Das wäre ja auch ein ziemliches Durcheinander <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="😉"
    /> . Du hättest es dir also so gedacht?</p>
<p>- Speicher anfordern in readname<br />
- Speicher freigeben in creawrite</p>
<p>Damit hätte erstens der ersten Parameter von creawrite zwingend das Ergebnis des Aufrufs von readname sein müssen (du schränkst die Funktion ziemlich ein). Und zweitens dürftest du die Funktion readname niemals ohne folgende creawrite ausführen. Damit wäre ein wesentlicher Sinn von Funktionen (Unabhängigkeit, Wiederverwendbarkeit) ad absurdum geführt.</p>
<p>Zumindest &quot;richtiger&quot; wäre es, hinter die (getrennten) Aufrufe von readname und creawrite ein delete[] zu packen. Aber sowas ist auch schlecht, wurde ja schon erwähnt. Früher oder später vergisst man einfach mal, dass dem Aufruf von readname immer zwingend ein delete[] folgen muss. Ein Funktionsaufruf sollte immer problemlos möglich und nicht an Bedingungen geknüpft sein.</p>
<p>Besser ist es, selbst genügend Speicher anzufordern, der Funktion readname einen Zeiger darauf zu übergeben, und anschließend nach weiterer Verarbeitung (z.B. durch creawrite) selbst das delete[] auszuführen. So sind new und delete immer auf derselben Ebene. Das schafft Übersicht und schont das Gedächtnis. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1823533</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1823533</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Wed, 16 Dec 2009 14:46:54 GMT</pubDate></item><item><title><![CDATA[Reply to Verbesserungsvorschläge und Kritik on Wed, 16 Dec 2009 14:47:19 GMT]]></title><description><![CDATA[<p>n0stradamus schrieb:</p>
<blockquote>
<pre><code class="language-cpp">main.close(); //zu
</code></pre>
</blockquote>
<p>Hälst du das für einen besonders hilfreichen Kommentar? Oder anders gefragt - verdeutlicht der Kommentar etwas, was man sonst nicht ohne weiteres aus dem Code lesen kann?</p>
<p>Zusätzlich solltest du dir eine einheitlichen Einrückungsstil zulegen. Das sieht bei deinem geposteten Code eher nach Zufall aus, mal ganz davon abgesehen dass die letzte for-Schleife keine schließende Klammer zu haben scheint.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1823534</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1823534</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 16 Dec 2009 14:47:19 GMT</pubDate></item><item><title><![CDATA[Reply to Verbesserungsvorschläge und Kritik on Wed, 16 Dec 2009 14:48:28 GMT]]></title><description><![CDATA[<p>Und noch was zu lesen zum Thema &quot;meine Anwendung läuft bei anderen nicht!&quot;...</p>
<p><a href="http://blog.kalmbach-software.de/de/2008/03/05/wie-man-statisch-gegen-die-c-runtime-crt-linkt/" rel="nofollow">http://blog.kalmbach-software.de/de/2008/03/05/wie-man-statisch-gegen-die-c-runtime-crt-linkt/</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1823535</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1823535</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Wed, 16 Dec 2009 14:48:28 GMT</pubDate></item><item><title><![CDATA[Reply to Verbesserungsvorschläge und Kritik on Wed, 16 Dec 2009 17:30:08 GMT]]></title><description><![CDATA[<p>_matze schrieb:</p>
<blockquote>
<p>Und noch was zu lesen zum Thema &quot;meine Anwendung läuft bei anderen nicht!&quot;...</p>
<p><a href="http://blog.kalmbach-software.de/de/2008/03/05/wie-man-statisch-gegen-die-c-runtime-crt-linkt/" rel="nofollow">http://blog.kalmbach-software.de/de/2008/03/05/wie-man-statisch-gegen-die-c-runtime-crt-linkt/</a></p>
</blockquote>
<p>Dankeschön <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>Mittlerweile habe ich die char-Arrays durch strings ersetzt, aber jetzt habe ich ein Problem mit den Filestreams:<br />
ifstream ist ja so definiert, dass es nur char-Parameter nimmt. Den String casten hielt ich für etwas rabiat (hat auch nicht funktioniert^^) und dann war ich schon mit meinem Latein am Ende. Google wollte nichts Passendes ausspucken, könnt ihr mir weiterhelfen, bitte ?</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a>: Der Kommentar ist schon etwas unnötig, aber zu Übungszwecken doch praktisch, so sehe ich es zumindest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1823622</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1823622</guid><dc:creator><![CDATA[n0stradamus]]></dc:creator><pubDate>Wed, 16 Dec 2009 17:30:08 GMT</pubDate></item><item><title><![CDATA[Reply to Verbesserungsvorschläge und Kritik on Wed, 16 Dec 2009 17:34:59 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">string s;
ifstream ifs(file);
if (ifs.good()){
	ifs.seekg (0, std::ios::end);
	size_t length = ifs.tellg();
	ifs.seekg (0, std::ios::beg);

	std::vector&lt;char&gt; buffer(length+1,0);

	ifs.read (&amp;buffer[0],length);
	s = &amp;buffer[0];
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1823624</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1823624</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Wed, 16 Dec 2009 17:34:59 GMT</pubDate></item><item><title><![CDATA[Reply to Verbesserungsvorschläge und Kritik on Wed, 16 Dec 2009 17:45:16 GMT]]></title><description><![CDATA[<p>n0stradamus schrieb:</p>
<blockquote>
<p>ifstream ist ja so definiert, dass es nur char-Parameter nimmt. Den String casten hielt ich für etwas rabiat (hat auch nicht funktioniert^^) und dann war ich schon mit meinem Latein am Ende.</p>
</blockquote>
<p>std::string::c_str(). Siehe auch hier:<br />
<a href="http://www.cplusplus.com/reference/string/string/c_str/" rel="nofollow">http://www.cplusplus.com/reference/string/string/c_str/</a></p>
<blockquote>
<p>Google wollte nichts Passendes ausspucken, könnt ihr mir weiterhelfen, bitte ?</p>
</blockquote>
<p>Nun komm, veralbern kann ich mich auch selber:<br />
<a href="http://www.google.com/#q=ifstream+string" rel="nofollow">http://www.google.com/#q=ifstream+string</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1823630</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1823630</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 16 Dec 2009 17:45:16 GMT</pubDate></item><item><title><![CDATA[Reply to Verbesserungsvorschläge und Kritik on Wed, 16 Dec 2009 21:07:58 GMT]]></title><description><![CDATA[<p>Danke für die Hilfen <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>Auch wenn es immernoch nicht funktioniert, ist es doch schick was man da so alles machen kann. Wieviele Funktionen genau denselben Fehler produzieren <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="😃"
    /><br />
Folgendes springt nach dem Zeilenzählen immer hoch:</p>
<p>Debug Assertion Failed!</p>
<p>Program:[Pfad]<br />
File:f:\dd\vctools\crt_bld\self_x86\crt\src\dbgdel.cpp<br />
Line 52</p>
<p>Expression:_BLOCK_TYPE_IS_VALID(pHead-&gt;nBlockUse)</p>
<p>For information.....</p>
<p>Mit einem schönen roten Kreuz nebendran^^</p>
<p>Hier nochmal der Quellcode:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;conio.h&gt;
#include &lt;string&gt;

using namespace std;

void creawrite(string* filename, string* name, int* line, string* secpfad)
{
	int i;
	string p,nfilename;
	char *k_cstrptr, *name_cstrptr;

	nfilename= *secpfad;
	nfilename+= *filename;

	k_cstrptr = new char[nfilename.size()+1];
	strcpy(k_cstrptr,nfilename.c_str());
	name_cstrptr = new char[(*name).size()+1];
	strcpy(name_cstrptr, (*name).c_str());

	ifstream hauptdatei(name_cstrptr);
	ofstream person(k_cstrptr);
	for (int i=0;i&lt;(*line);i++)
	{
		std::getline(hauptdatei, p);
	}

	for (i=0; p[i] != ':'; i++) {} //Abstand bis zum Doppelpunkt messen
	i++; 							// Doppelpunkt überspringen, soll ja nicht im Enddokument stehen
	if (p[i]==' ')
	{
		i++;					//etwaiges Leerzeichen eliminieren
	}
	for (unsigned int z=0;z&lt;p.length();z++, i++)
	{
		p[z]=p[i];				//Stringcontent nach vorne 'holen'
	} 
	person &lt;&lt; p &lt;&lt; endl;
	cout &lt;&lt; &quot;Datei &lt;&quot; &lt;&lt; *filename &lt;&lt; &quot;&gt; wurde geschrieben&quot;;
	//aufräumen
	delete[] name_cstrptr;
	delete[] k_cstrptr;

	person.close();
	hauptdatei.close();
	//aufräumen =)
	cout &lt;&lt; endl &lt;&lt; &quot;Zeile &quot; &lt;&lt; *line &lt;&lt; &quot; fertig!&quot; &lt;&lt; endl;

}

void readname(string* pfad, string* name, int* line)
{
	unsigned int i=0;
	string nameholder;
	char* pfad_cstr;

	pfad_cstr = new char[(*name).size()];
	strcpy(pfad_cstr, (*name).c_str());

	std::ifstream hauptdatei(pfad_cstr);
	(*line)++;

	for (int i=0;i&lt;(*line) &amp;&amp; (!hauptdatei.eof()); i++)
	{
		std::getline(hauptdatei, nameholder);
	}
	cout &lt;&lt; endl &lt;&lt; endl &lt;&lt; &quot;Zeile einlesen...&quot;;

	for (i=0; (*name)[i] != ':';i++)
	{
		(*name)[i]= nameholder[i];
	}
	cout &lt;&lt; endl &lt;&lt; &quot;Einlesen fertig...&quot;;

	delete[] pfad_cstr;
	hauptdatei.close();
}

int main(){

	int line=0, lines;

	string pfad, name, secpfad;
	cout &lt;&lt; &quot;Abikommentarreader/-writer v 0.3&quot; &lt;&lt; endl 
		 &lt;&lt; &quot;-----------------------------------------------------------------------&quot; &lt;&lt; endl &lt;&lt; endl;

		cout &lt;&lt; &quot;Pfad zu der zu bearbeitenden Datei (.txt): &quot;;
		std::getline(cin,pfad);
		std::ifstream hauptdatei(pfad.c_str());

		while (!hauptdatei)
		{
			cout &lt;&lt; endl &lt;&lt; &quot;!!! Die Datei konnte nicht geoeffnet werden !!!&quot; &lt;&lt; endl;
			cout &lt;&lt; &quot;Pfad zu der zu bearbeitenden Datei (.txt): &quot;;
			std::getline(cin, pfad);
			ifstream hauptdatei(pfad.c_str());
		}

	cout &lt;&lt; endl &lt;&lt; &quot;Speicherort der erstellten Dateien (Backslash nicht vergessen): &quot;;
	std::getline(cin, secpfad);

	string* p = new string;
	for (lines=-1; !hauptdatei.eof();lines++)
	{
		std::getline(hauptdatei, *p);
		}		//Zeilen zählen, hier muss was besseres her
	cout &lt;&lt; endl &lt;&lt; &quot;Zeilen: &quot; &lt;&lt; lines;
	delete [] p;

	for (int x=0;x &lt;= lines;x++)
	{
		readname(&amp;pfad, &amp;name, &amp;line);
		creawrite(&amp;name, &amp;pfad, &amp;line, &amp;secpfad);    
		//dateiname bestimmen und datei erstellen, beschreiben, schließen
	}					

	hauptdatei.close();
	getch();
	return 0;
}
</code></pre>
<p>Danke für die Hilfe soweit, das Forum hier ist echt toll!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1823733</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1823733</guid><dc:creator><![CDATA[n0stradamus]]></dc:creator><pubDate>Wed, 16 Dec 2009 21:07:58 GMT</pubDate></item><item><title><![CDATA[Reply to Verbesserungsvorschläge und Kritik on Wed, 16 Dec 2009 22:57:23 GMT]]></title><description><![CDATA[<p>Zeile 52 kann keine Assertion geworfen werden, da steht nämlich eine Funktionsdefinition.</p>
<p>Du hantierst immer noch viel zu viel mit manueller Speicherverwaltung und Zeigern, hast die Ratschläge überhaupt berücksichtigt? Falls du das für unnötig hältst, lerne wenigstens mit dem Debugger umzugehen. Das musst du so oder so einmal lernen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1823783</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1823783</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 16 Dec 2009 22:57:23 GMT</pubDate></item><item><title><![CDATA[Reply to Verbesserungsvorschläge und Kritik on Wed, 16 Dec 2009 23:26:34 GMT]]></title><description><![CDATA[<p>n0stradamus schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a>: Der Kommentar ist schon etwas unnötig, aber zu Übungszwecken doch praktisch, so sehe ich es zumindest.</p>
</blockquote>
<p>Für mich ist das einfach &quot;noise&quot;. Total unnötig und verwirrend. Wer nicht weiss was &quot;close()&quot; macht, wird auch vom &quot;zu&quot; Kommentar nix haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1823794</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1823794</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 16 Dec 2009 23:26:34 GMT</pubDate></item><item><title><![CDATA[Reply to Verbesserungsvorschläge und Kritik on Thu, 17 Dec 2009 06:28:23 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Zeile 52 kann keine Assertion geworfen werden, da steht nämlich eine Funktionsdefinition.</p>
</blockquote>
<p>Ist ja auch keine Assertion in <em>seiner</em> Datei...</p>
<p>Sieh im Callstack (Aufrufliste) nach, welche Zeile in deinem Code für die Assertion verantwortlich ist. Um da vernünftige Infos zu bekommen, musst du dein Programm natürlich als Debug-Version erstellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1823828</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1823828</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Thu, 17 Dec 2009 06:28:23 GMT</pubDate></item><item><title><![CDATA[Reply to Verbesserungsvorschläge und Kritik on Thu, 17 Dec 2009 18:41:32 GMT]]></title><description><![CDATA[<p>_matze schrieb:</p>
<blockquote>
<p>Nexus schrieb:</p>
<blockquote>
<p>Zeile 52 kann keine Assertion geworfen werden, da steht nämlich eine Funktionsdefinition.</p>
</blockquote>
<p>Ist ja auch keine Assertion in <em>seiner</em> Datei...</p>
<p>Sieh im Callstack (Aufrufliste) nach, welche Zeile in deinem Code für die Assertion verantwortlich ist. Um da vernünftige Infos zu bekommen, musst du dein Programm natürlich als Debug-Version erstellen.</p>
</blockquote>
<p>Also ich habe mal unten auf den Call Stack geschaut, die msvcr100d.dll sei schuld.<br />
Kann ja wohl nicht sein, also muss da irgendwas in meinem Programm falsch sein.<br />
Nach ganz vielen Klicks auf 'Ignore' oder 'Continue' lande ich in 'output.c', Zeile 1643...?!</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@Nexus</a>: Mittlerweile habe ich die char-Arrays durch strings ersetzt und brav mit new und delete [] gearbeitet. Was kann ich denn noch tun um den Speicher dynamischer zu verwalten ?</p>
<p>Tut mir echt leid, falls ich hier blöde Fragen stelle, aber so richtig viel Praxiserfahrung haben mir meine beiden Bücher nicht vermittelt <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1824115</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1824115</guid><dc:creator><![CDATA[n0stradamus]]></dc:creator><pubDate>Thu, 17 Dec 2009 18:41:32 GMT</pubDate></item><item><title><![CDATA[Reply to Verbesserungsvorschläge und Kritik on Thu, 17 Dec 2009 18:45:18 GMT]]></title><description><![CDATA[<p>n0stradamus schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@Nexus</a>: Mittlerweile habe ich die char-Arrays durch strings ersetzt und brav mit new und delete [] gearbeitet. Was kann ich denn noch tun um den Speicher dynamischer zu verwalten ?</p>
</blockquote>
<p>Nexus schrieb:</p>
<blockquote>
<p>In C++ hast du die <strong>STL</strong>, <code>std::string</code> und Konsorten, welche dir viele Arbeit und Mühe abnehmen. Vielleicht hilft dir <a href="http://magazin.c-plusplus.net/artikel/Aufbau%20der%20STL%20-%20Teil%201%3A%20Container" rel="nofollow"><strong>das</strong></a> als Einstieg.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1824117</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1824117</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 17 Dec 2009 18:45:18 GMT</pubDate></item><item><title><![CDATA[Reply to Verbesserungsvorschläge und Kritik on Thu, 17 Dec 2009 18:57:08 GMT]]></title><description><![CDATA[<p>Hm...dumm von mir, das nicht anzuwenden.<br />
Wie groß ist die Wahrscheinlichkeit, dass beispielsweise ein Vektor mein Programm zum Laufen bringt ?^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1824121</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1824121</guid><dc:creator><![CDATA[n0stradamus]]></dc:creator><pubDate>Thu, 17 Dec 2009 18:57:08 GMT</pubDate></item><item><title><![CDATA[Reply to Verbesserungsvorschläge und Kritik on Thu, 17 Dec 2009 18:57:24 GMT]]></title><description><![CDATA[<p>n0stradamus schrieb:</p>
<blockquote>
<p>Wie groß ist die Wahrscheinlichkeit, dass es mein Programm zum Laufen bringt ?^^</p>
</blockquote>
<p>Kann ich so nicht sagen, aber ein Blick auf die STL lohnt sich auf alle Fälle. <code>new</code> und <code>delete</code> solltest du jedoch mit der Zeit auch verstehen, auch wenn manuelle Speicherverwaltung im Anwendungscode eher selten vorkommen sollte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1824122</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1824122</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 17 Dec 2009 18:57:24 GMT</pubDate></item><item><title><![CDATA[Reply to Verbesserungsvorschläge und Kritik on Fri, 18 Dec 2009 17:11:07 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>habe das Problem mit einer Queue gelöst, hat der Übersichtlichkeit halber eine Funktion mehr gefordert aber jetzt läuft das Programm schön und stabil <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="😃"
    /><br />
Vielen Dank für Eure Hilfe, irgendwann bin ich ja vllt auch so weit, dass ich euch mal helfen kann :p</p>
<p>Eines hat mich allerdings doch gestört:</p>
<p>Angenommen, vorher wurde definiert:</p>
<pre><code class="language-cpp">string *real;
real = new string;
</code></pre>
<p>//Über den Sinn lässt sich jetzt streiten</p>
<p>Dann produziert diese Zeile einen Fehler, wenn ich den Pointer durch einen richtigen String ersetze allerdings nicht:</p>
<pre><code class="language-cpp">if((*real).find(' ')==0)
	{
		for(int o=0;0&lt;(*real).size();o++)
			{(*real)[o] = (*real)[o+1];} //Leerstelle an erster Stelle eliminieren, wenn es eins gibt
	}
//Zum besseren Verständnis:
//real ist der String, der die fertig bearbeitete Beschreibung der Person enthält
</code></pre>
<p>Warum ist das so?<br />
delete habe ich hinterher natürlich benutzt <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/1824584</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1824584</guid><dc:creator><![CDATA[n0stradamus]]></dc:creator><pubDate>Fri, 18 Dec 2009 17:11:07 GMT</pubDate></item><item><title><![CDATA[Reply to Verbesserungsvorschläge und Kritik on Fri, 18 Dec 2009 17:28:47 GMT]]></title><description><![CDATA[<p>Da du jetzt keinen Zeiger mehr hast, musst du auch nichts dereferenzieren, bevor du auf Memberfunktionen zugreifen willst.</p>
<pre><code class="language-cpp">// Zeiger auf dynamisch angelegtes Objekt
std::string* ptr = new std::string(&quot;hallo&quot;);
(*ptr).clear();  // Zugriff über (*ptr).
ptr-&gt;clear();    // oder über ptr-&gt;
delete ptr;

// Automatisches Objekt
std::string obj(&quot;hallo&quot;);
obj.clear();     // Zugriff über obj.
</code></pre>
<p>Bei automatischen Objekten hast du hoffentlich kein <code>delete</code> benutzt. <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>
<p>Ausserdem ist der folgende Code ziemlich ineffizient.</p>
<pre><code class="language-cpp">if((*real).find(' ')==0)
	{
		for(int o=0;0&lt;(*real).size();o++)
			{(*real)[o] = (*real)[o+1];} //Leerstelle an erster Stelle eliminieren, wenn es eins gibt
	}
</code></pre>
<p>Wenn du wissen willst, ob an erster Stelle ein Leerzeichen ist, schaust du doch dort nach. Was du machst, ist aber den ganzen String nach Leerzeichen durchsuchen und überprüfen, ob das erste Vorkommen an der Position 0 steht. Fürs Löschen gibt es auch bereits vorhandene Funktionalität. Schau zuerst <a href="http://www.cplusplus.com/reference/string/string/" rel="nofollow">hier</a>, ob du nicht etwas nochmal von neu erfindest, <code>std::string</code> hat sehr viele Methoden (etwas zu viele...) und ausserdem gibts noch die generischen STL-Algorithmen.</p>
<p>Eine schnellere und einfachere Implementierung sähe so aus:</p>
<pre><code class="language-cpp">if (real[0] == ' ')
    real.erase(0);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1824588</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1824588</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 18 Dec 2009 17:28:47 GMT</pubDate></item><item><title><![CDATA[Reply to Verbesserungsvorschläge und Kritik on Fri, 18 Dec 2009 17:39:50 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Da du jetzt keinen Zeiger mehr hast, musst du auch nichts dereferenzieren, bevor du auf Memberfunktionen zugreifen willst.</p>
<pre><code class="language-cpp">// Zeiger auf dynamisch angelegtes Objekt
std::string* ptr = new std::string(&quot;hallo&quot;);
(*ptr).clear();  // Zugriff über (*ptr).
ptr-&gt;clear();    // oder über ptr-&gt;
delete ptr;

// Automatisches Objekt
std::string obj(&quot;hallo&quot;);
obj.clear();     // Zugriff über obj.
</code></pre>
<p>Bei automatischen Objekten hast du hoffentlich kein <code>delete</code> benutzt. <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>
</blockquote>
<p>Dereferenziert und -d habe ich bei dem automatischen Objekt nicht^^<br />
Dann muss ich meine Frage nochmal anders formulieren:<br />
So wie du den Code oben siehst, als dereferezierte Version mit der geltenden Annahme, dass real ein Zeiger auf einen dynamisch angelegten String ist, so produziert das einen Fehler.</p>
<p>Hebe ich allerdings die Dereferenzierung auf und mache</p>
<pre><code>real
</code></pre>
<p>zu einem automatischen Objekt, so läuft das Ganze fehlerfrei. Warum?<br />
Einen Unterscheid beim Verbrauch von Speicher gibt es doch nicht oder ?</p>
<p>real wird beim Schließen der Funktion in der es sich befindet ja wieder gelöscht.</p>
<p>PS:<br />
Aber Danke für den Hinweis, dass es meine Funktion schon in anderer Form gibt^^<br />
Wenn es so viele Extrabefehle gibt, muss man ja gar nicht mehr basteln <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/1824589</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1824589</guid><dc:creator><![CDATA[n0stradamus]]></dc:creator><pubDate>Fri, 18 Dec 2009 17:39:50 GMT</pubDate></item><item><title><![CDATA[Reply to Verbesserungsvorschläge und Kritik on Fri, 18 Dec 2009 17:45:43 GMT]]></title><description><![CDATA[<p>n0stradamus schrieb:</p>
<blockquote>
<p>So wie du den Code oben siehst, als dereferezierte Version mit der geltenden Annahme, dass real ein Zeiger auf einen dynamisch angelegten String ist, so produziert das einen Fehler.</p>
</blockquote>
<p>Was für einen Fehler? Kannst du den momentanen Code nochmals posten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1824603</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1824603</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 18 Dec 2009 17:45:43 GMT</pubDate></item><item><title><![CDATA[Reply to Verbesserungsvorschläge und Kritik on Fri, 18 Dec 2009 17:52:10 GMT]]></title><description><![CDATA[<p>Klaro,</p>
<p>Das hier läuft schief:</p>
<pre><code class="language-cpp">if((*real).find(' ')==0)
    {
        for(int o=0;0&lt;(*real).size();o++)
            {(*real)[o] = (*real)[o+1];} //Leerstelle an erster Stelle eliminieren, wenn es eins gibt
    }
//Zum besseren Verständnis:
//real ist der String, der die fertig bearbeitete Beschreibung der Person enthält
</code></pre>
<p>Diese Variante hingegen läuft problemlos:</p>
<pre><code class="language-cpp">if(real.find(' ')==0)
	{
		for (int l=0;l&lt;real.size();l++)
		{
			real[l]=real[l+1];
		}
		//Leerstelle an erster Stelle eliminieren, wenn es eine gibt
	}
</code></pre>
<p>Der restliche Funktionsaufbau ist <strong>genau</strong> gleich (mal von der Initialisierung von real abgesehen)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1824605</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1824605</guid><dc:creator><![CDATA[n0stradamus]]></dc:creator><pubDate>Fri, 18 Dec 2009 17:52:10 GMT</pubDate></item></channel></rss>