Re: C# pointer array not updated

Kamigaku <[email protected]> Mon, 23 Sep 2024 08:55:50 +0200
Newsgroups gmane.comp.programming.swig
Message-ID <CAKN7vfV6pEU64HaM9EXzgzjmm3dZKDD0dRfCuW4eU5bCwYDmiA@mail.gmail.com>
--===============4781981361711414162==
Content-Type: multipart/alternative; boundary="000000000000c075830622c3e171"

--000000000000c075830622c3e171
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

Hi,

Sorry for the late answer and thanks for yours.
Your idea is indeed interesting and match what the documentation advise us
to do (proxy pattern) but I have question.
If I do that, wouldn't that for each access of the array, it would means
and swig call? For small arrays it add no delay but for a multi million
size array, that would add a lot of latency right?

Isn't there a better solution to avoid bottleneck?

Regards

Le ven. 13 sept. 2024 =C3=A0 09:24, Jim <[email protected]> a =C3=A9crit=
 :

>
> Hi,
>
>  You can try like this:
>
>
> *File.i*
>
> %include "carrays.i"
>
> %array_class(PointAsC,PointAsCArray);
>
>
> *C# Code:*
>
>             EntryPoint entryPoint =3D new EntryPoint();
>
>             int count =3D 10;
>
>             PointAsCArray array =3D new PointAsCArray(count);
>
>             for (int i =3D 0; i < count; i++)
>
>             {
>
>                 array.setitem(i, new PointAsC());
>
>             }
>
>             entryPoint.generate_pointer_array(array.cast(), count);
>
>             Console.WriteLine(array.getitem(0).getX());
>
>             Console.WriteLine(array.getitem(1).getX());
>
>             Console.WriteLine(array.getitem(2).getX());
>
>             Console.WriteLine(array.getitem(3).getX());
>
>
> *Here is result:*
>
> Values are: 0
>
> Values are: 0.1
>
> Values are: 0.2
>
> Values are: 0.3
>
> Values are: 0.4
>
> Values are: 0.5
>
> Values are: 0.6
>
> Values are: 0.7
>
> Values are: 0.8
>
> Values are: 0.9
>
> 0
>
> 0.1
>
> 0.2
>
> 0.30000000000000004
>
>
>
>
>
>
>
> At 2024-09-11 15:31:02, "Kamigaku" <[email protected]> wrote:
>
> Hi everyone,
>
> I've been struggling on an issue for the couple of days and my last hope
> is here on this mailing list.
> I'm currently trying to do something rather simp'e which consists in
> creating a simple class in cpp and in C# create an array of this class fo=
r
> it to be passed in cpp, updated in cpp and resent updated to the C#.
> So cpp defines the model, C# instantiate it.
> But I'm struggling on the return update as it appears that my values are
> updated inside the cpp function but once returned to the C#, they have
> their default values as defined in C#.
>
> Any idea what I'm doing wrong?
> The C# documentation specify that an arguments with an %apply of type
> OUTPUT "if the parameter is marked as being output, the contents of the
> reserved buffer are copied back into the managed array after the call
> returns".
>
> Below, you will find my source code:
>
> *Entrypoint.h*
>
> #include <iostream>
>
> using namespace std;
> #include "PointAsC.h"
>
> class EntryPoint
> {
>  public:
>   // Constructeurs
>   EntryPoint();
> };
>
>
> *Entrypoint.cpp*
>
> #include "entrypoint.h"
>
> using namespace std;
>
> EntryPoint::EntryPoint()
> {}
>
>
> *PointAsC.h*
>
> #ifndef POINT_H
> #define POINT_H
>
> #include <iostream>
> using namespace std;
>
> class PointAsC
> {
>  public:
>   PointAsC();
>   PointAsC(double x, double y);
>
>   void setX(double x);
>   void setY(double y);
>   double getX() const;
>   double getY() const;
>
>  private:
>   double x, y;
> };
>
> #endif
>
>
> *PointAsC.cpp*
>
> #include "PointAsC.h"
> #include <cmath>
> #include <iostream>
> using namespace std;
>
> PointAsC::PointAsC() : x(0), y(0)
> {}
>
> PointAsC::PointAsC(double x, double y) : x(x), y(y)
> {}
>
> void PointAsC::setX(double x)
> {
>     this->x =3D x;
> }
>
> void PointAsC::setY(double y)
> {
>     this->y =3D y;
> }
>
> double PointAsC::getX() const
> {
>     return this->x;
> }
>
> double PointAsC::getY() const
> {
>     return this->y;
> }
>
>
> *File .i*
>
> /* File : example.i */
> %module dwdbms
>
> %include typemaps.i
> %include arrays_csharp.i
>
> %{
> #include "PointAsC.h"
> #include "entrypoint.h"
> %}
>
> %include <PointAsC.h>
>
> %typemap(ctype) PointAsC* "PointAsC*"
> %typemap(cstype) PointAsC* "PointAsC[]"
> %typemap(imtype) PointAsC* "PointAsC[]"
> %typemap(csin) PointAsC* "$csinput"
> %typemap(in) PointAsC* "$1 =3D $input;"
> %typemap(freearg) PointAsC* ""
> %typemap(argout) PointAsC* ""
>
> %apply PointAsC INOUT[] {PointAsC* pointsArray}
>
> %include <entrypoint.h>
>
> %extend EntryPoint {
>
>  void generate_pointer_array(PointAsC* pointsArray, int amount)
>  {
>   for(int i =3D 0; i < amount; i++)
>   {
>    pointsArray[i].setX(0.1 * i);
>    std::cout << "Values are: " << pointsArray[i].getX() << std::endl;
>   }
>  }
>
> }
>
> *My C# code*
>
> using System;
>
> namespace TestStandardLibrary
> {
>     class RunSwig
>     {
>
>         public static void Main()
>         {
>             EntryPoint entryPoint =3D new EntryPoint();
>             PointAsC[] pointAsC =3D new PointAsC[10];
>             for (int i =3D 0; i < pointAsC.Length; i++)
>             {
>                 pointAsC[i] =3D new PointAsC();
>             }
>             entryPoint.generate_pointer_array(pointAsC, pointAsC.Length);
>             Console.WriteLine(pointAsC[0].getX());
>             Console.WriteLine(pointAsC[1].getX());
>             Console.WriteLine(pointAsC[2].getX());
>             Console.WriteLine(pointAsC[3].getX());
>         }
>     }
> }
>
>

--000000000000c075830622c3e171
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<p dir=3D"ltr">Hi,</p>
<p dir=3D"ltr">Sorry for the late answer and thanks for yours.<br>
Your idea is indeed interesting and match what the documentation advise us =
to do (proxy pattern) but I have question.<br>
If I do that, wouldn&#39;t that for each access of the array, it would mean=
s and swig call? For small arrays it add no delay but for a multi million s=
ize array, that would add a lot of latency right?</p>
<p dir=3D"ltr">Isn&#39;t there a better solution to avoid bottleneck?</p>
<p dir=3D"ltr">Regards</p>
<br><div class=3D"gmail_quote"><div dir=3D"ltr" class=3D"gmail_attr">Le ven=
. 13 sept. 2024 =C3=A0 09:24, Jim &lt;<a href=3D"mailto:[email protected]=
m">[email protected]</a>&gt; a =C3=A9crit=C2=A0:<br></div><blockquote cl=
ass=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;p=
adding-left:1ex"><div style=3D"line-height:1.7;color:#000000;font-size:14px=
;font-family:Arial"><div id=3D"m_-2375413899121885136spnEditorContent"><p s=
tyle=3D"margin:0"><br></p><p style=3D"margin:0">Hi,</p><p style=3D"margin:0=
">=C2=A0You can try like this:</p><p style=3D"margin:0"><br></p><p style=3D=
"margin:0"><b>File.i</b></p><p style=3D"margin:0">%include &quot;carrays.i&=
quot;</p><p style=3D"margin:0">%array_class(PointAsC,PointAsCArray);</p><p =
style=3D"margin:0"><br></p><p style=3D"margin:0"><b>C# Code:</b></p><p styl=
e=3D"margin:0">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 EntryPoint entryPo=
int =3D new EntryPoint();</p><p style=3D"margin:0">=C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 int count =3D 10;</p><p style=3D"margin:0">=C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 PointAsCArray array =3D new PointAsCArray(count=
);</p><p style=3D"margin:0">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 for (=
int i =3D 0; i &lt; count; i++)</p><p style=3D"margin:0">=C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 {</p><p style=3D"margin:0">=C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 array.setitem(i, new PointAsC());</p><p =
style=3D"margin:0">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }</p><p style=
=3D"margin:0">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 entryPoint.generate=
_pointer_array(array.cast(), count);</p><p style=3D"margin:0">=C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Console.WriteLine(array.getitem(0).getX());</p=
><p style=3D"margin:0">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Console.Wr=
iteLine(array.getitem(1).getX());=C2=A0</p><p style=3D"margin:0">=C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Console.WriteLine(array.getitem(2).getX());=
=C2=A0</p><p style=3D"margin:0">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 C=
onsole.WriteLine(array.getitem(3).getX());</p><p style=3D"margin:0"><br></p=
><p style=3D"margin:0"><b>Here is result:</b></p><p style=3D"margin:0">Valu=
es are: 0</p><p style=3D"margin:0">Values are: 0.1</p><p style=3D"margin:0"=
>Values are: 0.2</p><p style=3D"margin:0">Values are: 0.3</p><p style=3D"ma=
rgin:0">Values are: 0.4</p><p style=3D"margin:0">Values are: 0.5</p><p styl=
e=3D"margin:0">Values are: 0.6</p><p style=3D"margin:0">Values are: 0.7</p>=
<p style=3D"margin:0">Values are: 0.8</p><p style=3D"margin:0">Values are: =
0.9</p><p style=3D"margin:0">0</p><p style=3D"margin:0">0.1</p><p style=3D"=
margin:0">0.2</p><p style=3D"margin:0">0.30000000000000004</p><p style=3D"m=
argin:0"><br></p><p style=3D"margin:0"><br></p><p style=3D"margin:0"><br></=
p><p style=3D"margin:0"><br></p><p style=3D"margin:0"><br></p></div><div st=
yle=3D"zoom:1"></div><div id=3D"m_-2375413899121885136divNeteaseMailCard"><=
/div><p style=3D"margin:0"><br></p><p>At 2024-09-11 15:31:02, &quot;Kamigak=
u&quot; &lt;<a href=3D"mailto:[email protected]" target=3D"_blank" rel=3D"=
noreferrer">[email protected]</a>&gt; wrote:</p><blockquote id=3D"m_-23754=
13899121885136isReplyContent" style=3D"PADDING-LEFT:1ex;MARGIN:0px 0px 0px =
0.8ex;BORDER-LEFT:#ccc 1px solid"><div dir=3D"auto">Hi everyone,<div dir=3D=
"auto"><br></div><div dir=3D"auto">I&#39;ve been struggling on an issue for=
 the couple of days and my last hope is here on this mailing list.=C2=A0</d=
iv><div dir=3D"auto">I&#39;m currently trying to do something rather simp&#=
39;e which consists in creating a simple class in cpp and in C# create an a=
rray of this class for it to be passed in cpp, updated in cpp and resent up=
dated to the C#.</div><div dir=3D"auto">So cpp defines the model, C# instan=
tiate it.</div><div dir=3D"auto">But I&#39;m struggling on the return updat=
e as it appears that my values are updated inside the cpp function but once=
 returned to the C#, they have their default values as defined in C#.</div>=
<div dir=3D"auto"><br></div><div dir=3D"auto">Any idea what I&#39;m doing w=
rong?</div><div dir=3D"auto">The C# documentation specify that an arguments=
 with an %apply of type OUTPUT &quot;if the parameter is marked as being ou=
tput, the contents of the reserved buffer are copied back into the managed =
array after the call returns&quot;.</div><div dir=3D"auto"><br></div><div d=
ir=3D"auto">Below, you will find my source code:</div><div dir=3D"auto"><br=
></div><div dir=3D"auto"><b><u>Entrypoint.h</u></b></div><div dir=3D"auto">=
<br></div><div dir=3D"auto">#include &lt;iostream&gt;</div><div dir=3D"auto=
"><br></div><div dir=3D"auto">using namespace std;</div><div dir=3D"auto">#=
include &quot;PointAsC.h&quot;</div><div dir=3D"auto"><br></div><div dir=3D=
"auto">class EntryPoint</div><div dir=3D"auto">{</div><div dir=3D"auto">=C2=
=A0public:</div><div dir=3D"auto">=C2=A0 // Constructeurs</div><div dir=3D"=
auto">=C2=A0 EntryPoint();</div><div dir=3D"auto">};</div><div dir=3D"auto"=
><br></div><div dir=3D"auto"><br></div><div dir=3D"auto"><b><u>Entrypoint.c=
pp</u></b></div><div dir=3D"auto"><br></div><div dir=3D"auto">#include &quo=
t;entrypoint.h&quot;</div><div dir=3D"auto"><br></div><div dir=3D"auto">usi=
ng namespace std;</div><div dir=3D"auto"><br></div><div dir=3D"auto">EntryP=
oint::EntryPoint()</div><div dir=3D"auto">{}</div><div dir=3D"auto"><br></d=
iv><div dir=3D"auto"><br></div><div dir=3D"auto"><b><u>PointAsC.h</u></b></=
div><div dir=3D"auto"><br></div><div dir=3D"auto">#ifndef POINT_H</div><div=
 dir=3D"auto">#define POINT_H</div><div dir=3D"auto"><br></div><div dir=3D"=
auto">#include &lt;iostream&gt;</div><div dir=3D"auto">using namespace std;=
</div><div dir=3D"auto"><br></div><div dir=3D"auto">class PointAsC</div><di=
v dir=3D"auto">{</div><div dir=3D"auto">=C2=A0public:</div><div dir=3D"auto=
">=C2=A0 PointAsC();</div><div dir=3D"auto">=C2=A0 PointAsC(double x, doubl=
e y);</div><div dir=3D"auto"><br></div><div dir=3D"auto">=C2=A0 void setX(d=
ouble x);</div><div dir=3D"auto">=C2=A0 void setY(double y);</div><div dir=
=3D"auto">=C2=A0 double getX() const;</div><div dir=3D"auto">=C2=A0 double =
getY() const;</div><div dir=3D"auto"><br></div><div dir=3D"auto">=C2=A0priv=
ate:</div><div dir=3D"auto">=C2=A0 double x, y;</div><div dir=3D"auto">};</=
div><div dir=3D"auto"><br></div><div dir=3D"auto">#endif</div><div dir=3D"a=
uto"><br></div><div dir=3D"auto"><br></div><div dir=3D"auto"><b><u>PointAsC=
.cpp</u></b></div><div dir=3D"auto"><br></div><div dir=3D"auto">#include &q=
uot;PointAsC.h&quot;</div><div dir=3D"auto">#include &lt;cmath&gt;</div><di=
v dir=3D"auto">#include &lt;iostream&gt;</div><div dir=3D"auto">using names=
pace std;</div><div dir=3D"auto"><br></div><div dir=3D"auto">PointAsC::Poin=
tAsC() : x(0), y(0)</div><div dir=3D"auto">{}</div><div dir=3D"auto"><br></=
div><div dir=3D"auto">PointAsC::PointAsC(double x, double y) : x(x), y(y)</=
div><div dir=3D"auto">{}</div><div dir=3D"auto"><br></div><div dir=3D"auto"=
>void PointAsC::setX(double x)</div><div dir=3D"auto">{</div><div dir=3D"au=
to">=C2=A0 =C2=A0 this-&gt;x =3D x;</div><div dir=3D"auto">}</div><div dir=
=3D"auto"><br></div><div dir=3D"auto">void PointAsC::setY(double y)</div><d=
iv dir=3D"auto">{</div><div dir=3D"auto">=C2=A0 =C2=A0 this-&gt;y =3D y;</d=
iv><div dir=3D"auto">}</div><div dir=3D"auto"><br></div><div dir=3D"auto">d=
ouble PointAsC::getX() const</div><div dir=3D"auto">{</div><div dir=3D"auto=
">=C2=A0 =C2=A0 return this-&gt;x;</div><div dir=3D"auto">}</div><div dir=
=3D"auto"><br></div><div dir=3D"auto">double PointAsC::getY() const</div><d=
iv dir=3D"auto">{</div><div dir=3D"auto">=C2=A0 =C2=A0 return this-&gt;y;</=
div><div dir=3D"auto">}</div><div dir=3D"auto"><br></div><div dir=3D"auto">=
<br></div><div dir=3D"auto"><b><u>File .i</u></b></div><div dir=3D"auto"><b=
r></div><div dir=3D"auto">/* File : example.i */</div><div dir=3D"auto">%mo=
dule dwdbms</div><div dir=3D"auto"><br></div><div dir=3D"auto">%include typ=
emaps.i</div><div dir=3D"auto">%include arrays_csharp.i</div><div dir=3D"au=
to"><br></div><div dir=3D"auto">%{</div><div dir=3D"auto">#include &quot;Po=
intAsC.h&quot;</div><div dir=3D"auto">#include &quot;entrypoint.h&quot;</di=
v><div dir=3D"auto">%}</div><div dir=3D"auto"><br></div><div dir=3D"auto">%=
include &lt;PointAsC.h&gt;</div><div dir=3D"auto"><br></div><div dir=3D"aut=
o">%typemap(ctype) PointAsC* &quot;PointAsC*&quot;</div><div dir=3D"auto">%=
typemap(cstype) PointAsC* &quot;PointAsC[]&quot;</div><div dir=3D"auto">%ty=
pemap(imtype) PointAsC* &quot;PointAsC[]&quot;</div><div dir=3D"auto">%type=
map(csin) PointAsC* &quot;$csinput&quot;</div><div dir=3D"auto">%typemap(in=
) PointAsC* &quot;$1 =3D $input;&quot;</div><div dir=3D"auto">%typemap(free=
arg) PointAsC* &quot;&quot;</div><div dir=3D"auto">%typemap(argout) PointAs=
C* &quot;&quot;</div><div dir=3D"auto"><br></div><div dir=3D"auto">%apply P=
ointAsC INOUT[] {PointAsC* pointsArray}</div><div dir=3D"auto"><br></div><d=
iv dir=3D"auto">%include &lt;entrypoint.h&gt;</div><div dir=3D"auto"><br></=
div><div dir=3D"auto">%extend EntryPoint {</div><div dir=3D"auto"><br></div=
><div dir=3D"auto">=C2=A0void generate_pointer_array(PointAsC* pointsArray,=
 int amount)</div><div dir=3D"auto">=C2=A0{</div><div dir=3D"auto">=C2=A0 f=
or(int i =3D 0; i &lt; amount; i++)</div><div dir=3D"auto">=C2=A0 {</div><d=
iv dir=3D"auto">=C2=A0 =C2=A0pointsArray[i].setX(0.1 * i);</div><div dir=3D=
"auto">=C2=A0 =C2=A0std::cout &lt;&lt; &quot;Values are: &quot; &lt;&lt; po=
intsArray[i].getX() &lt;&lt; std::endl;</div><div dir=3D"auto">=C2=A0 }</di=
v><div dir=3D"auto">=C2=A0}</div><div dir=3D"auto"><br></div><div dir=3D"au=
to">}</div><div dir=3D"auto"><br></div><div dir=3D"auto"><b><u>My C# code</=
u></b></div><div dir=3D"auto"><br></div><div dir=3D"auto">using System;</di=
v><div dir=3D"auto"><br></div><div dir=3D"auto">namespace TestStandardLibra=
ry</div><div dir=3D"auto">{</div><div dir=3D"auto">=C2=A0 =C2=A0 class RunS=
wig</div><div dir=3D"auto">=C2=A0 =C2=A0 {</div><div dir=3D"auto"><br></div=
><div dir=3D"auto">=C2=A0 =C2=A0 =C2=A0 =C2=A0 public static void Main()</d=
iv><div dir=3D"auto">=C2=A0 =C2=A0 =C2=A0 =C2=A0 {</div><div dir=3D"auto">=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 EntryPoint entryPoint =3D new Ent=
ryPoint();</div><div dir=3D"auto">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 PointAsC[] pointAsC =3D new PointAsC[10];</div><div dir=3D"auto">=C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 for (int i =3D 0; i &lt; pointAsC.Length=
; i++)</div><div dir=3D"auto">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 {</=
div><div dir=3D"auto">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 pointAsC[i] =3D new PointAsC();</div><div dir=3D"auto">=C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 }</div><div dir=3D"auto">=C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 entryPoint.generate_pointer_array(pointAsC, pointAsC.L=
ength);</div><div dir=3D"auto">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Co=
nsole.WriteLine(pointAsC[0].getX());</div><div dir=3D"auto">=C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 Console.WriteLine(pointAsC[1].getX());</div><di=
v dir=3D"auto">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Console.WriteLine(=
pointAsC[2].getX());</div><div dir=3D"auto">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 Console.WriteLine(pointAsC[3].getX());</div><div dir=3D"auto">=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 }</div><div dir=3D"auto">=C2=A0 =C2=A0 }</div><=
div dir=3D"auto">}</div></div>
</blockquote></div><img style=3D"width:1px;height:1px" src=3D"https://count=
.mail.163.com/beacon/webmail.gif?type=3Dwebmail_mailtrace&amp;guid=3Dpre_33=
aa673acfe08a505f3a48ef03fb1e35"></blockquote></div>

--000000000000c075830622c3e171--


--===============4781981361711414162==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline


--===============4781981361711414162==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Swig-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/swig-user

--===============4781981361711414162==--