<?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[Cast 1DArray in 2DArray]]></title><description><![CDATA[<p>#Hab die Frage leider gerade zuerst im C Forum gestellt deshalb nochmals#<br />
hallo<br />
also ich habe folgendes Problem<br />
ich habe ein 1d Array (bilddaten). Nun ist meine Frage ob ich das Array auch als 2d Array nutzen kann, ohne die Daten zu kopieren. Da ich das Array meistens als 1d Array nutze kann ich es nicht im vorhinein als 2d Array anlegen.</p>
<p>also im Programm sieht das ungefähr so aus</p>
<pre><code>#define imgWidth 5
#define imgHeight 3

//bild array anlegen
int *img1dP=new int[imgWidth*imgHeight];

//daten aus einem buffer kopieren
memcpy(img1dP,buffer,imgWidth*imgHeight);

//als beispiel zeile 3 spalte 3 in 4 ändern
img1dP[2*imgWidth+2]=4;

//jetzt würd ich gerne sowas änliches haben
//aber so funktionierts natürlich noch nich
int img2dP[imgHeight][imgWidth]=img1dP;
</code></pre>
<p>Mir wurde empfohlen:</p>
<pre><code>int array1d[12];
int (*array2d)[3][4] = array1d;
</code></pre>
<p>Da mußte ich aber lernen, dass das nur im C Compiler geht nicht unter C++</p>
<p>dankeschön</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/323684/cast-1darray-in-2darray</link><generator>RSS for Node</generator><lastBuildDate>Wed, 15 Jul 2026 22:21:46 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/323684.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 10 Feb 2014 18:21:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Cast 1DArray in 2DArray on Mon, 10 Feb 2014 18:21:41 GMT]]></title><description><![CDATA[<p>#Hab die Frage leider gerade zuerst im C Forum gestellt deshalb nochmals#<br />
hallo<br />
also ich habe folgendes Problem<br />
ich habe ein 1d Array (bilddaten). Nun ist meine Frage ob ich das Array auch als 2d Array nutzen kann, ohne die Daten zu kopieren. Da ich das Array meistens als 1d Array nutze kann ich es nicht im vorhinein als 2d Array anlegen.</p>
<p>also im Programm sieht das ungefähr so aus</p>
<pre><code>#define imgWidth 5
#define imgHeight 3

//bild array anlegen
int *img1dP=new int[imgWidth*imgHeight];

//daten aus einem buffer kopieren
memcpy(img1dP,buffer,imgWidth*imgHeight);

//als beispiel zeile 3 spalte 3 in 4 ändern
img1dP[2*imgWidth+2]=4;

//jetzt würd ich gerne sowas änliches haben
//aber so funktionierts natürlich noch nich
int img2dP[imgHeight][imgWidth]=img1dP;
</code></pre>
<p>Mir wurde empfohlen:</p>
<pre><code>int array1d[12];
int (*array2d)[3][4] = array1d;
</code></pre>
<p>Da mußte ich aber lernen, dass das nur im C Compiler geht nicht unter C++</p>
<p>dankeschön</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2382566</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2382566</guid><dc:creator><![CDATA[flexbex]]></dc:creator><pubDate>Mon, 10 Feb 2014 18:21:41 GMT</pubDate></item><item><title><![CDATA[Reply to Cast 1DArray in 2DArray on Mon, 10 Feb 2014 18:38:09 GMT]]></title><description><![CDATA[<p>Zugriff auf Position x,y bei 32 Bit Pixel (zeilenorientiert):</p>
<pre><code class="language-cpp">img1dP[x + y*ImageWidth];
</code></pre>
<blockquote>
<p>jetzt würd ich gerne sowas änliches haben</p>
</blockquote>
<p>In C++ schreibt man sich eine entsprechende Abstraktion in Form einer Klasse.</p>
<pre><code class="language-cpp">struct image_adapter
{
    int* data;
    int width; height;

    int&amp; operator()(int x, y)
    {
        return data[x + y*width];
    }
};

// usage:
image_adapter iadpt = {img1dP, ImageWidth, ImageHeight};

// access pixel
iadpt(32, 57)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2382568</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2382568</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 10 Feb 2014 18:38:09 GMT</pubDate></item><item><title><![CDATA[Reply to Cast 1DArray in 2DArray on Mon, 10 Feb 2014 18:37:01 GMT]]></title><description><![CDATA[<p>Unter C++ würdest du nichts davon jemals so machen. Soll es wirklich C++ sein oder traust du dich nicht zu fragen, wie du deinen Compiler in den C-Modus setzt? Dann definier dein Problem mal genauer. Es ist ja schon verdächtig, dass du die Daten hier in einem rohen Array hast, wo das doch offensichtlich nicht so gewünscht ist. Das macht man nicht so in einer Sprache, die es so einfach macht, komplexe Datentypen zu verwenden. Du scheinst C in C++ zu programmieren. Keine gute Idee.<br />
Man würde sich hier einen passenden Datentyp bauen, der die gewünschten Zugriffe anbietet. Was genau dabei passend ist, kommt auf deine Motivation an. Es soll ja wohl um Bilddaten gehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2382570</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2382570</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 10 Feb 2014 18:37:01 GMT</pubDate></item><item><title><![CDATA[Reply to Cast 1DArray in 2DArray on Mon, 10 Feb 2014 18:54:52 GMT]]></title><description><![CDATA[<p>Hallo Ok!</p>
<p>Ja also es sollte schon C++ sein. Ich kenn mich aber definitiv besser in C aus merkt man glaub ich (;-)). Die C++ Elemte brauchte ich bis jetzt nur um das Programm Modular in Klassen zu halten. Ich habe aber sonst noch nicht viele andere Elemente von C++ benutzt.</p>
<p>Zum Problem:</p>
<p>Ja genau es geht um Bilddaten. Die krieg ich vom v4l(video for Linux) Treiber. Das ist der memcpy Teil. Die kopiere ich mir dann in mein Array. In diesem Fall in den Speicher auf den *img1dP zeigt.</p>
<p>Ja und auf die Daten will ich dann möglichst schnell zugreifen können.<br />
Aktione die ich in dem Speicher mache sind u.a.:<br />
Faltung Bayerdaten-&gt; Grayscale<br />
Bildmerkmale extrahieren</p>
<p>Also ziemlich viele zugriffe auf den Speicherbereich. Da wärs halt gut wenn ich den Speicher unterschiedlichen Adressieren könnte, da für die Faltung eine kontinuierliche Adressierung besser ist(1D Array) und für die Merkmals extraktion, wegen häufiger Sprünge, ein 2D Aufbau besser ist.</p>
<p>Naja das ist das Problem in kurzform.</p>
<p>Ja ich weiss wäre besser wegen mangelndem wissen in C++ das in c zu machen. Das ist aber auch vorgabe von meiner Firma das in c++ zu machen. Also muss ich mich da dran halten</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2382575</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2382575</guid><dc:creator><![CDATA[flexbex]]></dc:creator><pubDate>Mon, 10 Feb 2014 18:54:52 GMT</pubDate></item><item><title><![CDATA[Reply to Cast 1DArray in 2DArray on Mon, 10 Feb 2014 19:03:02 GMT]]></title><description><![CDATA[<p>Ach so um schonmal mit meinem geringen wissen in c++ zu glänzen</p>
<p>Also ich hab zwei Möglichkeiten gefunden die ich aber beide nich so toll fand</p>
<p>überladen des operators [] mit x+y*rowSize -&gt; das macht aber ja dann genau das selbe was ich auch mache</p>
<p>und das andere war mit Vektoren zu arbeiten. Aber nach dem wie ich das verstanden habe bringt mir das keinen geschwindigkeits vorteil. Eher nachteile.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2382579</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2382579</guid><dc:creator><![CDATA[flexbex]]></dc:creator><pubDate>Mon, 10 Feb 2014 19:03:02 GMT</pubDate></item><item><title><![CDATA[Reply to Cast 1DArray in 2DArray on Mon, 10 Feb 2014 19:31:16 GMT]]></title><description><![CDATA[<p>flexbex schrieb:</p>
<blockquote>
<p>überladen des operators [] mit x+y*rowSize -&gt; das macht aber ja dann genau das selbe was ich auch mache</p>
</blockquote>
<p>1.) ich ueberlade oben nicht operator[]. 2.) Du sparst dir, jedesmal rowSize. 3.) Im Endeffekt macht jeder moegliche Vorschlag das gleiche, nur ist operator() angenehmer zu benutzen (meistens).</p>
<blockquote>
<p>Vektoren zu arbeiten. ... Eher nachteile.</p>
</blockquote>
<p>1.) Mein Beispiel benutzt kein std::vector. 2.) Ich glaube kaum, dass du std::vector bewerten kannst. Geschwindigkeit sollte gleich sein.</p>
<blockquote>
<p>das keinen geschwindigkeits vorteil</p>
</blockquote>
<p>Wenn das deine Hauptsorge ist, dann wuerdest du sowieso Bibliotheken wie OpenCV oder Intels Performance Primitives (IPP) benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2382582</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2382582</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 10 Feb 2014 19:31:16 GMT</pubDate></item><item><title><![CDATA[Reply to Cast 1DArray in 2DArray on Mon, 10 Feb 2014 19:28:52 GMT]]></title><description><![CDATA[<p>Im Titel steht was von Cast, also könnte man ganz naiv mal versuchen zu casten:</p>
<pre><code class="language-cpp">int (*array2d)[3][4] = (int (*)[3][4]) &amp;array1d;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2382583</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2382583</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Mon, 10 Feb 2014 19:28:52 GMT</pubDate></item><item><title><![CDATA[Reply to Cast 1DArray in 2DArray on Mon, 10 Feb 2014 19:58:41 GMT]]></title><description><![CDATA[<p>Hallo wollte deinen Beitrag garnicht kritisieren sondern nur schreiben was ich bis jetzt gfeunden hatte. Wie gesagt bin wirklich kein C++ Profi.</p>
<p>knivil schrieb:</p>
<blockquote>
<p>flexbex schrieb:</p>
<blockquote>
<p>überladen des operators [] mit x+y*rowSize -&gt; das macht aber ja dann genau das selbe was ich auch mache</p>
</blockquote>
<p>1.) ich ueberlade oben nicht operator[]. 2.) Du sparst dir, jedesmal rowSize. 3.) Im Endeffekt macht jeder moegliche Vorschlag das gleiche, nur ist operator() angenehmer zu benutzen (meistens).</p>
<blockquote>
<p>Vektoren zu arbeiten. ... Eher nachteile.</p>
</blockquote>
<p>1.) Mein Beispiel benutzt kein std::vector. 2.) Ich glaube kaum, dass du std::vector bewerten kannst. Geschwindigkeit sollte gleich sein.</p>
</blockquote>
<p>Danke! Kannte bis jetzt nur OpenCv hatte mir das aber auch noch nicht weiter<br />
angeschaut. Ich hatte aber gehört das OpenCv nicht gerade Geschwindigkeits optimiert ist. Da ich aber zusätzlich auch noch auf einer begrenzten Linux Embedded Platform arbeite muss ich eh schauen welceh Bibliotheken ich nutzen kann.</p>
<blockquote>
<p>das keinen geschwindigkeits vorteil</p>
</blockquote>
<blockquote>
<p>Wenn das deine Hauptsorge ist, dann wuerdest du sowieso Bibliotheken wie OpenCV oder Intels Performance Primitives (IPP) benutzen.</p>
</blockquote>
<p>IPP scheint aber nicht umsonst zu sein (ich schreib ne Masterarbeit deshalb kein budget)</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/904">@Bashar</a> dankeschön das funzt <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="🙂"
    /><br />
ABER jetzt habe ich ein 3d Array <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /><br />
das würd ich aber in kauf nehmen<br />
array2d[0][3][4]</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2382597</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2382597</guid><dc:creator><![CDATA[flexbex]]></dc:creator><pubDate>Mon, 10 Feb 2014 19:58:41 GMT</pubDate></item><item><title><![CDATA[Reply to Cast 1DArray in 2DArray on Mon, 10 Feb 2014 20:11:36 GMT]]></title><description><![CDATA[<p>flexbex schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/904">@Bashar</a> dankeschön das funzt <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="🙂"
    /><br />
ABER jetzt habe ich ein 3d Array <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /><br />
das würd ich aber in kauf nehmen<br />
array2d[0][3][4]</p>
</blockquote>
<p>Nein, du hast einen Zeiger auf ein 2D-Array. (Ich denk du machst seit Jahren C?)</p>
<p>Da wir in C++ sind, kannst du auch eine Referenz nehmen, dann entfällt das händische Dereferenzieren:</p>
<pre><code class="language-cpp">int (&amp;array2d)[3][4] = (int (&amp;)[3][4]) array1d;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2382600</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2382600</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Mon, 10 Feb 2014 20:11:36 GMT</pubDate></item><item><title><![CDATA[Reply to Cast 1DArray in 2DArray on Mon, 10 Feb 2014 20:38:46 GMT]]></title><description><![CDATA[<p>Danke.<br />
Aber Ihr muesst jetzt nicht staendig meine Kompetenz hinterfragen (bin kein Informnatiker und will hier bestimmt nicht den Eindruck vermitteln besonders gut in einer Programmiersprache zu sein).<br />
Hatte mich nur ueber die Schreibweise gewundert die mein Debugger mir angeboten hatte *array1d[0][0] fuer das erste Element bzw array1d[0][0][0]</p>
<p>Aber bis jetzt habe ich 2Dimesionale Arrays noch nicht wirklich mit zeigern genutzt deshalb die Verwunderung.</p>
<p>Thx</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2382604</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2382604</guid><dc:creator><![CDATA[flexbex(not loggin)]]></dc:creator><pubDate>Mon, 10 Feb 2014 20:38:46 GMT</pubDate></item></channel></rss>