<?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[Arithmetische Operationen mit Pointern]]></title><description><![CDATA[<p>Ich möchte gerne den Code auf der folgenden Seite ganz unten(<a href="http://werner.yellowcouch.org/Papers/subimg/index.html" rel="nofollow">http://werner.yellowcouch.org/Papers/subimg/index.html</a>) von C++ nach Java übertragen.</p>
<p>Ich habe sehr wenig Erfahrungen mit Pointern und und habe Verständnisprobleme bei der Boxaveragefunktion</p>
<pre><code>typedef signed short signed2;

signed2* boxaverage(signed2*input, int sx, int sy, int wx, int wy)
{
  signed2 *horizontalmean = (signed2*)malloc(sizeof(signed2)*sx*sy);
  assert(horizontalmean);
  int wx2=wx/2;
  int wy2=wy/2;
  signed2* from = input + (sy-1) * sx;
  signed2* to = horizontalmean + (sy-1) * sx;
</code></pre>
<p>Soweit ich es verstehe wird Speicher in der größe <em>sx</em>sy* singed shorts reserbiert und die Adresse <em>horizontalmean</em> zugewiesen.</p>
<p><em>Assert</em> bestätigt, dass dies geklappt hat und kein Nullverweis vorliegt.</p>
<p>Was passiert nun bei der Variableninitialisierung von to? <em>horizontalmean</em> wird im Laufe des Programmes nicht mit einem Wert belegt, geht es hier nur um den Speicheroffset zwischen from und to? Wenn ja gibt es einen einfach Weg die Logik in Java zu übersetzen?</p>
<p>Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/330829/arithmetische-operationen-mit-pointern</link><generator>RSS for Node</generator><lastBuildDate>Sat, 04 Apr 2026 21:08:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/330829.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 27 Jan 2015 18:03:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Arithmetische Operationen mit Pointern on Tue, 27 Jan 2015 18:03:59 GMT]]></title><description><![CDATA[<p>Ich möchte gerne den Code auf der folgenden Seite ganz unten(<a href="http://werner.yellowcouch.org/Papers/subimg/index.html" rel="nofollow">http://werner.yellowcouch.org/Papers/subimg/index.html</a>) von C++ nach Java übertragen.</p>
<p>Ich habe sehr wenig Erfahrungen mit Pointern und und habe Verständnisprobleme bei der Boxaveragefunktion</p>
<pre><code>typedef signed short signed2;

signed2* boxaverage(signed2*input, int sx, int sy, int wx, int wy)
{
  signed2 *horizontalmean = (signed2*)malloc(sizeof(signed2)*sx*sy);
  assert(horizontalmean);
  int wx2=wx/2;
  int wy2=wy/2;
  signed2* from = input + (sy-1) * sx;
  signed2* to = horizontalmean + (sy-1) * sx;
</code></pre>
<p>Soweit ich es verstehe wird Speicher in der größe <em>sx</em>sy* singed shorts reserbiert und die Adresse <em>horizontalmean</em> zugewiesen.</p>
<p><em>Assert</em> bestätigt, dass dies geklappt hat und kein Nullverweis vorliegt.</p>
<p>Was passiert nun bei der Variableninitialisierung von to? <em>horizontalmean</em> wird im Laufe des Programmes nicht mit einem Wert belegt, geht es hier nur um den Speicheroffset zwischen from und to? Wenn ja gibt es einen einfach Weg die Logik in Java zu übersetzen?</p>
<p>Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2440064</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2440064</guid><dc:creator><![CDATA[UnsingedSinged]]></dc:creator><pubDate>Tue, 27 Jan 2015 18:03:59 GMT</pubDate></item><item><title><![CDATA[Reply to Arithmetische Operationen mit Pointern on Tue, 27 Jan 2015 18:32:14 GMT]]></title><description><![CDATA[<p>UnsingedSinged schrieb:</p>
<blockquote>
<p>Was passiert nun bei der Variableninitialisierung von to? <em>horizontalmean</em> wird im Laufe des Programmes nicht mit einem Wert belegt, geht es hier nur um den Speicheroffset zwischen from und to? Wenn ja gibt es einen einfach Weg die Logik in Java zu übersetzen?</p>
</blockquote>
<p>Ja, die Terme die bei der Zuweisung von <code>from</code> und <code>to</code> hinzu addiert werden sind soweit ich das sehe ein Speicheroffset relativ zu <code>input</code> und <code>horizontalmean</code> .</p>
<p>In Java könnte man sowas zum Beispiel als Array-Offset übersetzen:</p>
<pre><code>int offset = (sy-1) * sx;
</code></pre>
<p>Beim späteren Zugriff auf diese um das Offset verschobenen Pointer via Array-Index müsste man dann diese Indizes zuzätzlich addieren:</p>
<p>Ein</p>
<pre><code>sum+=(signed8)from[xr];
to[x]=sum/count;
</code></pre>
<p>könnte man dann z.B. so schreiben:</p>
<pre><code>sum += (long) from[offset + xr];
to[offset + x] = sum / count;
</code></pre>
<p>Generell könnte es allerdings vorteilhafter sein zu verstehen, was da genau passiert und das Ganze dann Java-spezifisch neu zu implementieren anstatt nur den Code zu übersetzen (man versteht das Verfahren besser und überträgt keine C-Idiome (C++ ist in dem Code nur schwer auszumachen) nach Java, was meist keine gute Wahl ist).</p>
<p>Gruss,<br />
Finnegan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2440071</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2440071</guid><dc:creator><![CDATA[Finnegan]]></dc:creator><pubDate>Tue, 27 Jan 2015 18:32:14 GMT</pubDate></item><item><title><![CDATA[Reply to Arithmetische Operationen mit Pointern on Tue, 27 Jan 2015 18:29:40 GMT]]></title><description><![CDATA[<p>UnsingedSinged schrieb:</p>
<blockquote>
<p>Was passiert nun bei der Variableninitialisierung von to?</p>
</blockquote>
<p>Das gleiche wie vorher bei from. :p</p>
<p>to wird mit einem Zeiger auf das (sy-1)*sx-te Element von horizontalmean initialisiert.</p>
<blockquote>
<p>Wenn ja gibt es einen einfach Weg die Logik in Java zu übersetzen?</p>
</blockquote>
<p>Sicherlich, allerdings über Indizes statt Pointer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2440072</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2440072</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Tue, 27 Jan 2015 18:29:40 GMT</pubDate></item><item><title><![CDATA[Reply to Arithmetische Operationen mit Pointern on Tue, 27 Jan 2015 18:48:15 GMT]]></title><description><![CDATA[<p>Finnegan schrieb:</p>
<blockquote>
<p>Generell könnte es allerdings vorteilhafter sein zu verstehen, was da genau passiert und das Ganze dann Java-spezifisch neu zu implementieren anstatt nur den Code zu übersetzen (man versteht das Verfahren besser und überträgt keine C-Idiome (C++ ist in dem Code nur schwer auszumachen) nach Java, was meist keine gute Wahl ist).</p>
<p>Gruss,<br />
Finnegan</p>
</blockquote>
<p>Ja, dass war auch meine Vermutung und wird meine herangehensweise sein. Ich werde wohl doch etwas mehr Zeit in dieses Projekt stecken müssen als angedacht war. Vielen dank euch allen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2440076</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2440076</guid><dc:creator><![CDATA[UnsingedSinged]]></dc:creator><pubDate>Tue, 27 Jan 2015 18:48:15 GMT</pubDate></item><item><title><![CDATA[Reply to Arithmetische Operationen mit Pointern on Tue, 27 Jan 2015 19:16:21 GMT]]></title><description><![CDATA[<p>UnsingedSinged schrieb:</p>
<blockquote>
<p>Ja, dass war auch meine Vermutung und wird meine herangehensweise sein. Ich werde wohl doch etwas mehr Zeit in dieses Projekt stecken müssen als angedacht war. Vielen dank euch allen.</p>
</blockquote>
<p>BTW: Wenn ich das richtig verstanden habe, scheint das ein Box-Filter zu sein, der dort implementiert ist. Das Verfahren ist eigentlich relativ simpel:<br />
Man durchläuft alle Pixel des Bildes und für jeden Pixel bestimmt man das Mittel der Bildpixel die sich in einer definierten Box mit dem aktuellen Pixel als mittelpunkt befinden. Dieser Mittelwert ist die Intensität des entsprechenden Pixels im gefilterten Bild. Dabei muss man allerdings auch den Rand berücksichtigen: So ist z.B. bei Pixel (0,0) ein Großteil der Box außerhalb des Bildes. Ich denke das gewünschte Ergebnis erzielt man, indem man annimt dass sich die &quot;Randpixel&quot; außerhalb des Bildes unendlich weit fortsetzen (clamping). Wenn man also die Intensität eines Pixels abfragt, und die Pixelposition außerhalb des Bildes liegt (kleiner 0 oder größer gleich Bildbreite/höhe), dann setzt man die Koordinate, die abzufragen ist einfach auf 0 (bzw. die Bildbreite/höhe minus 1).</p>
<p>Bei Farbbildern wendet man so einen Boxfilter dann separat auf jedem Farbkanal an.</p>
<p>Gruss,<br />
Finnegan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2440080</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2440080</guid><dc:creator><![CDATA[Finnegan]]></dc:creator><pubDate>Tue, 27 Jan 2015 19:16:21 GMT</pubDate></item></channel></rss>