<?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[Problem mit char* bei int-Zuweisung]]></title><description><![CDATA[<p>Guten Tag,</p>
<p>Folgendes Problem: Ich lese eine Datei Binär ein (funktioniert) und habe nun eine Funktion die Pixel in dieser PPM-Datei (Portable Pixmap, Bild) ändert... Schön und gut, funktioniert auch, aber nicht mit 0 oder 0x00 oder sonstiges...<br />
Es handelt sich um ein einfaches char *, wenn auch ein sehr großes, doch wenn ich ein Byte/Char = 0 setze, verschwindet der Rest dahinter !!! Das ist nicht nett <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /></p>
<p>Hoffe Ihr könnt helfen, danke im Voraus ! Falls ich Code posten soll einfach sagen, aber vielleicht ist mein Problem so trivial, dass Ihr den nicht braucht <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>Mit freundlichen Grüßen Daniel</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/250566/problem-mit-char-bei-int-zuweisung</link><generator>RSS for Node</generator><lastBuildDate>Tue, 15 Sep 2026 23:39:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/250566.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 20 Sep 2009 14:22:19 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit char* bei int-Zuweisung on Sun, 20 Sep 2009 14:22:19 GMT]]></title><description><![CDATA[<p>Guten Tag,</p>
<p>Folgendes Problem: Ich lese eine Datei Binär ein (funktioniert) und habe nun eine Funktion die Pixel in dieser PPM-Datei (Portable Pixmap, Bild) ändert... Schön und gut, funktioniert auch, aber nicht mit 0 oder 0x00 oder sonstiges...<br />
Es handelt sich um ein einfaches char *, wenn auch ein sehr großes, doch wenn ich ein Byte/Char = 0 setze, verschwindet der Rest dahinter !!! Das ist nicht nett <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /></p>
<p>Hoffe Ihr könnt helfen, danke im Voraus ! Falls ich Code posten soll einfach sagen, aber vielleicht ist mein Problem so trivial, dass Ihr den nicht braucht <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>Mit freundlichen Grüßen Daniel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1781756</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1781756</guid><dc:creator><![CDATA[Wasabi666]]></dc:creator><pubDate>Sun, 20 Sep 2009 14:22:19 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit char* bei int-Zuweisung on Sun, 20 Sep 2009 14:31:46 GMT]]></title><description><![CDATA[<p>Das ist normales Verhalten von C-Strings. (ein char* wird als C-String verwaltet). Sprich um die Länge eines solchen strins zu kennen, wir das ein 0 Zeichen als das Ende betrachtet. Und daher passiert das auch bei dir.</p>
<p>Wie du das am besten umgehst ist halt ein wenig abhängig von den Funktionen, die du benutzt. (Wenn du weisst, wie lange das Array ist, dann kannst du da auch selbst drüber iterieren und ein allfäliges 0 einfach ignorieren).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1781760</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1781760</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 20 Sep 2009 14:31:46 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit char* bei int-Zuweisung on Sun, 20 Sep 2009 14:49:10 GMT]]></title><description><![CDATA[<p>Also ich will ja praktisch die Farbe Schwarz setzen und die ist (0, 0, 0), gibt es irgendeine Art andere 0 ? <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="😃"
    /> doofe frage ich weiß, in java wird ja bsp. zwischen null und 0 unterschieden, aber irgendwie muss ich doch mein schwarz setzen können... irgendne idee?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1781768</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1781768</guid><dc:creator><![CDATA[Wasabi666]]></dc:creator><pubDate>Sun, 20 Sep 2009 14:49:10 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit char* bei int-Zuweisung on Sun, 20 Sep 2009 15:03:58 GMT]]></title><description><![CDATA[<p>Und wo genau liegt jz dein Problem?<br />
Du willst ne Farbe setzen... wozu brauchst du dann char* ?<br />
Zeig doch mal das Stück, wo du aus der Datei liest und dann die Farbe-Setz-Fkt aufrufst. So versteh zumindest ich nicht, wo genau dein Problem liegt und wieso du überhaupt char* iwo hast...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1781775</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1781775</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sun, 20 Sep 2009 15:03:58 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit char* bei int-Zuweisung on Sun, 20 Sep 2009 15:18:21 GMT]]></title><description><![CDATA[<p>Portable Pixmap: <a href="http://de.wikipedia.org/wiki/Portable_Pixmap" rel="nofollow">http://de.wikipedia.org/wiki/Portable_Pixmap</a></p>
<p>PPMReader.h</p>
<pre><code class="language-cpp">#ifndef __PPMREADER_H__
#define __PPMREADER_H__

#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;string&gt;

class PPMReader
{
	public:
		PPMReader(char *filepath);
		~PPMReader();

		char *GetPixel(int x, int y);

		void SetPixel(int x, int y, char *rgb);

		bool SaveFile(char *filename);
		bool ReadFile(char *filepath);

	protected:
		int width, height, bitdepth, pixelbytes;
		char *image;
};

#endif
</code></pre>
<p>PPMReader.cpp</p>
<pre><code class="language-cpp">#include &quot;PPMReader.h&quot;

PPMReader::PPMReader(char *filepath)
{
	ReadFile(filepath);
}

PPMReader::~PPMReader()
{
}

char *PPMReader::GetPixel(int x, int y)
{
	char *rgb = new char[3];

	rgb[0] = image[x * 3     + y * width * 3];
	rgb[1] = image[x * 3 + 1 + y * width * 3];
	rgb[2] = image[x * 3 + 2 + y * width * 3];

	return rgb;
}

void PPMReader::SetPixel(int x, int y, char *rgb)
{
	image[x * 3     + y * width * 3] = rgb[0];
	image[x * 3 + 1 + y * width * 3] = rgb[1];
	image[x * 3 + 2 + y * width * 3] = rgb[2];
}

bool PPMReader::SaveFile(char *filename)
{
	using namespace std;

	fstream out;
	out.open(filename, ios::out | ios::binary);

	if(out.good())
	{
		out &lt;&lt; &quot;P6\n&quot;;
		out &lt;&lt; width &lt;&lt; &quot; &quot; &lt;&lt; height &lt;&lt; &quot;\n&quot;;
		out &lt;&lt; bitdepth &lt;&lt; &quot;\n&quot;;
		out &lt;&lt; image &lt;&lt; &quot;\n&quot;;
	}
	else
	{
		out.close();
		return false;
	}

	return true;
}

bool PPMReader::ReadFile(char *filepath)
{
	using namespace std;

	const int buffersize = 1024;
	char *buffer = new char[buffersize];

	fstream in;
	in.open(filepath, ios::in | ios::binary);

	if(in.good())
	{
		in.getline(buffer, buffersize);
		string test = buffer;

		if(test == &quot;P6&quot;)
		{
			in.getline(buffer, buffersize);
			while(buffer[0] == '#') in.getline(buffer, buffersize);
			string size = buffer;

			for(int i = 0; i &lt; size.size(); i++)
			{
				if(size[i] == ' ')
				{
					width = atoi(size.substr(0, i).c_str());
					height = atoi(size.substr(i + 1, size.size()).c_str());
					break;
				}
			}

			in.getline(buffer, buffersize);
			while(buffer[0] == '#') in.getline(buffer, buffersize);
			bitdepth = atoi(buffer);

			int linebytes, imagebytes;

			if(bitdepth == 255)	pixelbytes = 3;
			else if(bitdepth == 511) pixelbytes = 6;
			else
			{
				in.close();
				return false;
			}

			linebytes = pixelbytes * width;
			imagebytes = linebytes * height;

			image = new char[imagebytes];

			/* Vorher leeren, sonst Fehler... */
			strcpy(image, &quot;&quot;);

			in.read(image, imagebytes);
		}
		else 
		{
			in.close();
			return false;
		}
	}
	else
	{
		in.close();
		return false;
	}

	return true;
}
</code></pre>
<p>main.cpp</p>
<pre><code class="language-cpp">#include &quot;PPMReader.h&quot;

int main()
{
	PPMReader *ppm = new PPMReader(&quot;bild2-fleck.ppm&quot;);

	char *pixel = new char[3];
	pixel[0] = 0x00;
	pixel[1] = 0x00;
	pixel[2] = 0x00;

	ppm-&gt;SetPixel(1, 0, pixel);

	ppm-&gt;SaveFile(&quot;neu.ppm&quot;);

	system(&quot;PAUSE&quot;);
	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1781785</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1781785</guid><dc:creator><![CDATA[Wasabi666]]></dc:creator><pubDate>Sun, 20 Sep 2009 15:18:21 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit char* bei int-Zuweisung on Sun, 20 Sep 2009 15:19:31 GMT]]></title><description><![CDATA[<p>Im Prinzip soll er nur Binär ein Pixel ändern, geht für jeden Wert nur eben bei der 0 nicht... Grund wurd ja genannt, aber wie umgeh ich's?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1781787</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1781787</guid><dc:creator><![CDATA[Wasabi666]]></dc:creator><pubDate>Sun, 20 Sep 2009 15:19:31 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit char* bei int-Zuweisung on Sun, 20 Sep 2009 15:26:57 GMT]]></title><description><![CDATA[<p>vergiss bloss die delete[]s nicht...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1781792</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1781792</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Sun, 20 Sep 2009 15:26:57 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit char* bei int-Zuweisung on Sun, 20 Sep 2009 15:29:47 GMT]]></title><description><![CDATA[<p>sry, wird sofort nachgebaut ^^ trotzdem ist das nicht die lösung des problems :(... ich hätte gern ne zweite 0 ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1781794</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1781794</guid><dc:creator><![CDATA[Wasabi666]]></dc:creator><pubDate>Sun, 20 Sep 2009 15:29:47 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit char* bei int-Zuweisung on Sun, 20 Sep 2009 15:30:14 GMT]]></title><description><![CDATA[<p>Beim speichern solltest du das Bild nicht als C-String ausgeben, sondern z.B als std::string.</p>
<pre><code class="language-cpp">bool PPMReader::SaveFile(char *filename)
{
    using namespace std;

    fstream out;
    out.open(filename, ios::out | ios::binary);

    if(out.good())
    {
        out &lt;&lt; &quot;P6\n&quot;;
        out &lt;&lt; width &lt;&lt; &quot; &quot; &lt;&lt; height &lt;&lt; &quot;\n&quot;;
        out &lt;&lt; bitdepth &lt;&lt; &quot;\n&quot;;
        out &lt;&lt; std::string(image) &lt;&lt; &quot;\n&quot;;
    }
    else
    {
        out.close();
        return false;
    }

    return true;
}
</code></pre>
<p>So sollte das gehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1781795</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1781795</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 20 Sep 2009 15:30:14 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit char* bei int-Zuweisung on Sun, 20 Sep 2009 15:42:15 GMT]]></title><description><![CDATA[<p>So hab das grad mal probiert, scheint sich damit leider nicht erledigt zu haben, der String ist nach dem schwarzen Pixel wech, eingeschlossen dem veränderten Teil...</p>
<p>Habe außerdem grad mal getestet, ob die Pixel dahinter noch existieren ^^, tun sie, und das böse schwarze auch, scheint tatsächlich nur bei der Ausgabe zu meckern, trotz dass ich's auf binary gestellt hab -.- Eigentlich müsste er doch auf mich hören...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1781798</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1781798</guid><dc:creator><![CDATA[Wasabi666]]></dc:creator><pubDate>Sun, 20 Sep 2009 15:42:15 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit char* bei int-Zuweisung on Sun, 20 Sep 2009 15:43:24 GMT]]></title><description><![CDATA[<p>Auch der std::string-Konstruktor muss irgendwie die Größe der Daten erkennen, da Du selbst keine mitgibst.</p>
<p>Lösung: Benutze die Stream-Methoden um binär zu schreiben und gib die Größe mit an. Gib image nicht auf dem Bildschirm oder im Debugger aus, denn dort wird beim ersten Nullbyte abgeschnitte.</p>
<p>Oder ganz allgemein: Nicht char* schneidet die Daten beim ersten Nullbyte ab, sondern die Art und Weise, wie dieses char* interpretiert wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1781799</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1781799</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Sun, 20 Sep 2009 15:43:24 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit char* bei int-Zuweisung on Sun, 20 Sep 2009 15:56:39 GMT]]></title><description><![CDATA[<p>paar worte zum codes:<br />
dein fehler ist in zeile 76 der *.cpp korrigiert...</p>
<p>Wasabi666 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">/*PPMReader.h*/

#ifndef __PPMREADER_H__ //alles, was mit unterstrich großbuchstabe und unterstrich unterstrich
#define __PPMREADER_H__ //beginnt, ist eigtl für den compiler reserviert...

#include &lt;iostream&gt; //alle drei
#include &lt;fstream&gt; //includes hier
#include &lt;string&gt; //sind nicht notwendig

class PPMReader
{
	public:
		PPMReader(char *filepath); //const char*
		~PPMReader();

		char *GetPixel(int x, int y); //const - außerdem solltest du den rückgabetypen evtl auch irgendwas RAII-mäßiges ändern (boost::tuple oder schnell selbst was bauen)

		void SetPixel(int x, int y, char *rgb); //const char*

		bool SaveFile(char *filename); //const char, const
		bool ReadFile(char *filepath); //const char*

	protected:
		int width, height, bitdepth, pixelbytes;
		char *image;
};

#endif //#ifndef include_guard
</code></pre>
<pre><code class="language-cpp">/*PPMReader.cpp*/
#include &quot;PPMReader.h&quot;

#include &lt;fstream&gt;
#include &lt;string&gt;

PPMReader::PPMReader(char *filepath)
{
	ReadFile(filepath);
}

PPMReader::~PPMReader()
{ //sehr sinnvoll + memory-leak
}

char *PPMReader::GetPixel(int x, int y)
{
	char *rgb = new char[3];
	
	rgb[0] = image[x * 3     + y * width * 3];
	rgb[1] = image[x * 3 + 1 + y * width * 3];
	rgb[2] = image[x * 3 + 2 + y * width * 3];
	
	return rgb; //gefährlich, da der user hier selbst ein delete aufrufen muss
}

void PPMReader::SetPixel(int x, int y, char *rgb)
{
	image[x * 3     + y * width * 3] = rgb[0];
	image[x * 3 + 1 + y * width * 3] = rgb[1];
	image[x * 3 + 2 + y * width * 3] = rgb[2];
}

bool PPMReader::SaveFile(char *filename)
{
	using namespace std;

	fstream out;
	out.open(filename, ios::out | ios::binary); //fstream hat auch nen schönen konstruktor, der das kann ^^
	
	if(out.good())
	{
		out &lt;&lt; &quot;P6\n&quot;;
		out &lt;&lt; width &lt;&lt; &quot; &quot; &lt;&lt; height &lt;&lt; &quot;\n&quot;;
		out &lt;&lt; bitdepth &lt;&lt; &quot;\n&quot;;
		out &lt;&lt; image &lt;&lt; &quot;\n&quot;;
	}
	else
	{
		out.close(); //unnötig
		return false;
	}

	return true; //statt mit returnwerten zu arbeiten, würde ich hier eine exception wählen
} //sollte ja nicht sooo oft vorkommen, dass er keine datei erstellen kann xD

bool PPMReader::ReadFile(char *filepath)
{
	using namespace std;

	const int buffersize = 1024;
	char *buffer = new char[buffersize]; //warum nicht stack?

	fstream in;
	in.open(filepath, ios::in | ios::binary);

	if(in.good())
	{
		in.getline(buffer, buffersize);
		string test = buffer;

		if(test == &quot;P6&quot;)
		{
			in.getline(buffer, buffersize);
			while(buffer[0] == '#') in.getline(buffer, buffersize);
			string size(buffer, buffer+in.gcount());//siehe http://www.cplusplus.com/reference/iostream/istream/gcount/

			for(int i = 0; i &lt; size.size(); i++)
			{
				if(size[i] == ' ')
				{
					width = atoi(size.substr(0, i).c_str());
					height = atoi(size.substr(i + 1, size.size()).c_str());
					break;
				}
			}
//der rest der fkt sieht so grausig aus, dass ich keine lust mehr hab^^
			in.getline(buffer, buffersize);
			while(buffer[0] == '#') in.getline(buffer, buffersize);
			bitdepth = atoi(buffer);

			int linebytes, imagebytes;

			if(bitdepth == 255)	pixelbytes = 3;
			else if(bitdepth == 511) pixelbytes = 6;
			else
			{
				in.close();
				return false;
			}

			linebytes = pixelbytes * width;
			imagebytes = linebytes * height;

			image = new char[imagebytes];

			/* Vorher leeren, sonst Fehler... */
			strcpy(image, &quot;&quot;);

			in.read(image, imagebytes);
		}
		else 
		{
			in.close();//nicht notwednig
			return false;
		}
	}
	else
	{
		in.close();//nicht notwendig
		return false;
	}

	return true;//auch hier halte ich returnwerte für den falschen weg...
}
</code></pre>
<pre><code class="language-cpp">/*main.cpp*/

#include &quot;PPMReader.h&quot;

int main()
{
	PPMReader *ppm = new PPMReader(&quot;bild2-fleck.ppm&quot;); //wieso nicht stack?
	
	char *pixel = new char[3]; //wieso nicht stack?
	pixel[0] = 0x00;
	pixel[1] = 0x00;
	pixel[2] = 0x00;
	
	ppm-&gt;SetPixel(1, 0, pixel);

	ppm-&gt;SaveFile(&quot;neu.ppm&quot;);

	system(&quot;PAUSE&quot;); //ist an und für sich nen schlechter weg, die konsole offen zu halten
	return 0; //unnötig
}
</code></pre>
</blockquote>
<p>btw:<br />
std::vector&lt;char&gt; ist viel einfacher, als mit char* zu areiten... dann hättest du auch nicht ca. 20 memory-leaks in dem stückchen code... ^^</p>
<p>bb</p>
<p>PS: In C++ ist es eher unüblich, so ewig lange Fkt zu schreiben - wenn du mal hinguckst, könnte man da eigtl viele kleine draus machen und dann könnte man so gar durchsehen, wenn man den code nicht geschrieben hat bzw nen weilchen nicht angesehen hat... ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1781806</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1781806</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sun, 20 Sep 2009 15:56:39 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit char* bei int-Zuweisung on Sun, 20 Sep 2009 15:55:39 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Auch der std::string-Konstruktor muss irgendwie die Größe der Daten erkennen, da Du selbst keine mitgibst.</p>
</blockquote>
<p>*Kopf -&gt; Tisch*</p>
<p>Sowas kommt davon, wenn man zu viele Sachen gleichzeitig macht.. -.-</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1781807</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1781807</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 20 Sep 2009 15:55:39 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit char* bei int-Zuweisung on Sun, 20 Sep 2009 16:18:13 GMT]]></title><description><![CDATA[<p>Ok, erstmal Kritik zur Kenntnis genommen <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 />
Also, wenn die Funktion so grausig aussieht, wenigstens sagen, was genau daran so böse is ^^, sonst kann ichs nicht verbessern...</p>
<p>Und was genau löst mein Problem? Sollte ich vielleicht out.write() verwenden?...</p>
<p>Achso und vector wollte ich mehr oder weniger nicht nehmen, wegen der Geschwindigkeit... Ein std::vector&lt;char&gt; ist um einiges langsamer als char*... korrigiert mich wenn ich falsch liege(aber bitte nicht zu heftig xD)</p>
<p>Und noch eine Frage zur GetPixel methode: wenn ich das irgendwie als int zurückgebe müsst ichs irgendwie wieder auseinanderklamüseln, könnt vllt schnell jemand aufschreiben, wie ichs schön lösen könnte?</p>
<p>und meinst du mit dem &quot;warum stack?&quot; warum ich die ganze zeit zeiger verwende?</p>
<p>puuh, das wars erstmal, :), klärt mich auf</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1781815</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1781815</guid><dc:creator><![CDATA[Wasabi666]]></dc:creator><pubDate>Sun, 20 Sep 2009 16:18:13 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit char* bei int-Zuweisung on Sun, 20 Sep 2009 16:30:12 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">Achso und vector wollte ich mehr oder weniger nicht nehmen, wegen der Geschwindigkeit... Ein std::vector&lt;char&gt; ist um einiges langsamer als char*... korrigiert mich wenn ich falsch liege(aber bitte nicht zu heftig xD)
</code></pre>
<p>Korrigiere: Stimmt nicht.<br />
std::vector ist beinahe so schnell, wie jegliches Array gedöns. Im Debug Mode ist sie klar um einiges langsamer, dafür hat man aber ein Haufen checks usw. Aber im release ist sie in etwa so schnell, wie Arrays.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1781818</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1781818</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 20 Sep 2009 16:30:12 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit char* bei int-Zuweisung on Sun, 20 Sep 2009 16:32:47 GMT]]></title><description><![CDATA[<p>ok, dann werd ichs damit auch versuchen, bloß kann ich irgendwie read, das direkt in den vector kopieren lassen oder muss ich das ganze jetz zeichenweise einlesen?... danke nochmal an alle</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1781820</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1781820</guid><dc:creator><![CDATA[Wasabi666]]></dc:creator><pubDate>Sun, 20 Sep 2009 16:32:47 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit char* bei int-Zuweisung on Sun, 20 Sep 2009 16:45:24 GMT]]></title><description><![CDATA[<p>ich habs jetzt erst in ein char* kopiert und dann den string damit gefüttert, mit gccount un so diesma ;),</p>
<p>ist das sehr unschön gelöst??</p>
<p>wie kann ich mein code jetz möglichst verbessern, dass selbst ihr zufrieden seid? <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="🙂"
    /> um zu wissen was richtig un falsch is, muss mans mir schon sagen ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1781824</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1781824</guid><dc:creator><![CDATA[Wasabi666]]></dc:creator><pubDate>Sun, 20 Sep 2009 16:45:24 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit char* bei int-Zuweisung on Sun, 20 Sep 2009 17:57:44 GMT]]></title><description><![CDATA[<p>ich hab keine ahnung, ob das funktioniert - würde mich eigtl sehr wundern, wenn ja^^ ich hatte ein wenig lange weile:</p>
<pre><code class="language-cpp">/*PPMReader.h*/

#ifndef H_PPMREADER_200909202000
#define H_PPMREADER_200909202000

#include &lt;vector&gt;
#include &lt;utility&gt;

struct color_tuple
{
private:
	unsigned int RGB[3];
public:
	unsigned int R() const {return RGB[0];}
	unsigned int G() const {return RGB[1];}
	unsigned int B() const {return RGB[2];}

	color_tuple(const char* RGB, unsigned char bytes_per_color);
	color_tuple(unsigned int R, unsigned int G, unsigned B);
};

class PPMReader
{
	private:
		std::vector&lt;char&gt; image;
		std::pair&lt;unsigned int, unsigned int&gt; size;

		unsigned char color_bytes;
	public:
		PPMReader(const char *filepath);

		color_tuple GetPixel(unsigned int x, unsigned int y) const;
		unsigned char GetBytesPerColor() const;

		void SetPixel(unsigned int x, unsigned int y, color_tuple color);

		void SaveFile(const char *filename) const;
		void ReadFile(const char *filepath);
};

#endif //#ifndef H_PPMREADER_200909202000
</code></pre>
<pre><code class="language-cpp">/*PPMReader.cpp*/
#include &quot;PPMReader.h&quot;

#include &lt;fstream&gt;
#include &lt;string&gt;
#include &lt;sstream&gt;

using std::ios;
using std::ifstream;
using std::ofstream;
using std::getline;
using std::pair;
using std::string;
using std::stringstream;

const char* header_tag = &quot;P6&quot;;

#include &lt;stdexcept&gt;
typedef std::runtime_error      EXCEPTION_CANNOT_CREATE_FILE;
typedef std::runtime_error      EXCEPTION_CANNOT_OPEN_FILE;
typedef std::invalid_argument   EXCEPTION_WRONG_HEADER;
typedef std::runtime_error      EXCEPTION_NOT_IMPLEMENTED;

const char* read_file_exception_text = &quot;Cannot open file for reading an image&quot;;
const char* save_file_exception_text = &quot;Cannot create file for saving the image&quot;;
const char* wrong_header_text = &quot;Expected other Header-Tag&quot;;
const char* not_implementet_colordepth_text = &quot;Sorry, no support for this picture (to high maximum values for each color-value)&quot;;

//color_tuple
color_tuple::color_tuple(const char* rgb, unsigned char color_depth)
{
	const char *last;
	for(std::size_t i(0); i != 3; rgb = last, ++i)
	{
		last = rgb+color_depth;
		stringstream ss;
		ss.write(rgb, last-rgb);
		ss &gt;&gt; RGB[i];
	}
}

color_tuple::color_tuple(unsigned int R, unsigned int G, unsigned B)
{
	RGB[0] = R;
	RGB[1] = G;
	RGB[2] = B;
}

//helper
unsigned int pumuckls_pow(unsigned int b, unsigned int e) //^^
{
	unsigned int r = 1;

	while(e != 0)
	{ 
		if(e%2 != 0) 
			r *= b; 
		e /= 2; 
		b *= b; 
	}
	return r;
}

unsigned int get_max_from_depth(unsigned int depth)
{
	unsigned int R = 0;
	for(depth *= 8; depth != 0; --depth)
	{
		R += pumuckls_pow(2, depth-1);
	}

	return R;
}

void ignore_trash(ifstream &amp;in)
{
	for(char delemiter; in.get(delemiter) &amp;&amp; delemiter == '#'; )
	{
		std::string trash;
		getline(in, trash);
	}
	in.unget();
}

std::pair&lt;int/*w*/, int/*h*/&gt; read_size(const std::string &amp;buffer)
{
	std::pair&lt;int, int&gt; R;

	stringstream ss;
	ss &lt;&lt; buffer;
	ss &gt;&gt; R.first;
	ss &gt;&gt; R.second;

	return R;
}

unsigned char read_color_bytes(const std::string &amp;buffer)
{
	unsigned int max;

	stringstream ss;
	ss &lt;&lt; buffer;
	ss &gt;&gt; max;

	unsigned char bits(0);
	for(; max != 0; max &gt;&gt;= 1, ++bits)
		;
	unsigned char bytes = unsigned char(bits/8.f+.5f);
	return bytes != 3 ? bytes : 4;
}

//class
PPMReader::PPMReader(const char *filepath)
{
	ReadFile(filepath);
}

color_tuple PPMReader::GetPixel(unsigned int x, unsigned int y) const
{
	return color_tuple(
		&amp;image[x*3*color_bytes + y*size.first*3*color_bytes],
		color_bytes
	);
}

unsigned char PPMReader::GetBytesPerColor() const
{
	return color_bytes;
}

void PPMReader::SetPixel(unsigned int x, unsigned int y, color_tuple color)
{
	//TODO: testen 
	//TODO: staticassert(sizeof(char) == 1), staticassert(sizeof(short) == 2), staticassert(sizeof(int) == 4)
	std::vector&lt;char&gt;::size_type
		at1 = x*3*color_bytes + y*size.second*3*color_bytes + 0*color_bytes,
		at2 = x*3*color_bytes + y*size.second*3*color_bytes + 1*color_bytes,
		at3 = x*3*color_bytes + y*size.second*3*color_bytes + 2*color_bytes;
	switch(color_bytes)
	{
	case 1:
		image[at1] = static_cast&lt;char&gt;(color.R());
		image[at2] = static_cast&lt;char&gt;(color.G());
		image[at3] = static_cast&lt;char&gt;(color.B());
		break;
	case 2:
		*reinterpret_cast&lt;short*&gt;(&amp;image[at1]) = static_cast&lt;short&gt;(color.R());
		*reinterpret_cast&lt;short*&gt;(&amp;image[at2]) = static_cast&lt;short&gt;(color.G());
		*reinterpret_cast&lt;short*&gt;(&amp;image[at3]) = static_cast&lt;short&gt;(color.B());
		break;
	case 4:
		*reinterpret_cast&lt;int*&gt;(&amp;image[at1]) = static_cast&lt;int&gt;(color.R());
		*reinterpret_cast&lt;int*&gt;(&amp;image[at2]) = static_cast&lt;int&gt;(color.G());
		*reinterpret_cast&lt;int*&gt;(&amp;image[at3]) = static_cast&lt;int&gt;(color.B());
		break;
	default:
		throw EXCEPTION_NOT_IMPLEMENTED(not_implementet_colordepth_text);
	}
}

void PPMReader::SaveFile(const char *filename) const
{
	ofstream out(filename, ios::out | ios::binary);

	if(out.bad())
		throw EXCEPTION_CANNOT_CREATE_FILE(save_file_exception_text);

	out &lt;&lt; &quot;P6\n&quot;
		&lt;&lt; size.first &lt;&lt; &quot; &quot; &lt;&lt; size.second &lt;&lt; &quot;\n&quot;
		&lt;&lt; get_max_from_depth(color_bytes) &lt;&lt; &quot;\n&quot;;

	out.write(&amp;image[0], image.size());
}

void PPMReader::ReadFile(const char *filepath)
{
	ifstream in(filepath, ios::in | ios::binary);

	if(in.bad())
		throw EXCEPTION_CANNOT_OPEN_FILE(read_file_exception_text);

	string buffer;
	getline(in, buffer);

	if(buffer != header_tag)
		throw EXCEPTION_WRONG_HEADER(wrong_header_text);

	ignore_trash(in);
	getline(in, buffer);
	size = read_size(buffer);
	ignore_trash(in);
	getline(in, buffer);
	color_bytes = read_color_bytes(buffer);

	unsigned int length = color_bytes * size.first * size.second;
	image.resize(length);

	in.read(&amp;image[0], length);
}
</code></pre>
<p>so in der richtung würd ichs jedenfalls lösen^^<br />
gefallen tuts mir trotzdem nicht, aber vll hat jmd anderes ja lust, die fehler darin zu beseitigen und das iwie eleganter zu lösen <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=";D"
      alt="😉"
    /></p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1781848</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1781848</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sun, 20 Sep 2009 17:57:44 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit char* bei int-Zuweisung on Sun, 20 Sep 2009 18:15:52 GMT]]></title><description><![CDATA[<p>xD ich hab mich jetz an das angeben der größe beim string erstellen gehalten und habe anstatt vector&lt;char&gt; string genommen, was wenn ich mich nich irre sich doch sehr ähnlich ist, ansonsten geht meins jetzt auch...<br />
versuch mich grad bei dir einzulesen, aber so ein paar sachen wie exception handling hab ich noch nich oft gemacht (c++ mach ich auch erst seit geraumen 2 monaten)...</p>
<p>was mich jetzt aber richtig interessiert ist:<br />
WARUM GEHT FOLGENDES?: in.read(&amp;image[0], groeße);?? das erscheint mich wegen eig unterschiedlicher datentypen zunächst sinnlos ^^ habs so jetzt für meins auch übernommen, da ich nich ünnötig erneut kopieren möchte, also danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1781852</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1781852</guid><dc:creator><![CDATA[Wasabi666]]></dc:creator><pubDate>Sun, 20 Sep 2009 18:15:52 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit char* bei int-Zuweisung on Sun, 20 Sep 2009 18:16:53 GMT]]></title><description><![CDATA[<p>achso und das mit der pixelklasse werd ich auch noch einbaun, weil stimmt schon, dass man sonst vllt mal ein delete vergisst, danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1781854</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1781854</guid><dc:creator><![CDATA[Wasabi666]]></dc:creator><pubDate>Sun, 20 Sep 2009 18:16:53 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit char* bei int-Zuweisung on Sun, 20 Sep 2009 18:21:17 GMT]]></title><description><![CDATA[<p>wie, wegen des typs?<br />
naja - ob string oder vector, nimmt sich fast nichts - ich hätt aber trotzdem vector genommen ^^</p>
<p><a href="http://www.cplusplus.com/reference/" rel="nofollow">http://www.cplusplus.com/reference/</a></p>
<p>dort siehst du, was read für parameter entgegen nimmt, eine überladung ist in etwa so:</p>
<p><code>istream&amp; read(char *first, size_t count)</code></p>
<p><code>in.read(&amp;image[0], length);</code><br />
ruft dieses auf:<br />
image[0] = 1. element<br />
&amp;image[0] = adresse des 1. elements<br />
length ist wohl selbsterklärend ;o)</p>
<p>bb</p>
<p>edit:</p>
<blockquote>
<p>achso und das mit der pixelklasse werd ich auch noch einbaun, weil stimmt schon, dass man sonst vllt mal ein delete vergisst, danke</p>
</blockquote>
<p>ich hoffe, dir fällt was eleganteres ein <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 />
ist das, was mir am allerwenigsten gefällt - aber ich hab erst am ende mal in die doku geguckt und gesehen, dass es so was gibt^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1781856</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1781856</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sun, 20 Sep 2009 18:21:17 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit char* bei int-Zuweisung on Sun, 20 Sep 2009 18:31:01 GMT]]></title><description><![CDATA[<p>joa guck ich morgen mal in meiner info stunde bei ^^<br />
also hauptsächlich war ich verwundert, weil vector doch eine art lineare liste ist und read() muss doch irgendwoher wissen, welche der variablen in dieser klasse auf das nächste element verweist, weil vector doch eig total anders is als char* und das kann read doch eig alles nich wissen ^^ deswegen versteh ichs nich ganz, warum das funktioniert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1781861</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1781861</guid><dc:creator><![CDATA[Wasabi666]]></dc:creator><pubDate>Sun, 20 Sep 2009 18:31:01 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit char* bei int-Zuweisung on Sun, 20 Sep 2009 18:36:33 GMT]]></title><description><![CDATA[<p>&quot;vector doch eine art lineare liste&quot;<br />
es ist ein array... (ne liste ist immer linear^^) es gibt 3 lineare container in der standard-lib: deque, list, vector</p>
<p>und vector ist nur ein wrapper für ein array - also von aufbau + funktionsweise in etwa so:</p>
<pre><code class="language-cpp">struct vector
{
  int *x;

  vector(int laenge)
  {
    x = new int[laenge];
  }

  ~vector()
  {
    delete x;
  }

  int&amp; operator[] (int index) {return x[index];}
};
</code></pre>
<p>also kann man sicher sein, dass es ein stück zusammenhängender speicher ist (im gegensatz zu deque oder list)...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1781866</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1781866</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sun, 20 Sep 2009 18:36:33 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit char* bei int-Zuweisung on Sun, 20 Sep 2009 18:41:09 GMT]]></title><description><![CDATA[<p>aaaaah <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="🙂"
    /> dann macht das sinn, danke für die erklärung und schönen abend noch euch allen! (programmempfehlung: star wars 2 xD)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1781869</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1781869</guid><dc:creator><![CDATA[Wasabi666]]></dc:creator><pubDate>Sun, 20 Sep 2009 18:41:09 GMT</pubDate></item></channel></rss>