C# pointer array not updated

Kamigaku <[email protected]> Wed, 11 Sep 2024 09:31:02 +0200
Newsgroups gmane.comp.programming.swig
Message-ID <CAKN7vfWddiUZCY0VwXL5DV61hQORcXUPmNMYqvOeoWVUp=vBgA@mail.gmail.com>
--===============3828788935943108944==
Content-Type: multipart/alternative; boundary="0000000000008821fe0621d2f97d"

--0000000000008821fe0621d2f97d
Content-Type: text/plain; charset="UTF-8"

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 for
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 = x;
}

void PointAsC::setY(double y)
{
    this->y = 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 = $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 = 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 = new EntryPoint();
            PointAsC[] pointAsC = new PointAsC[10];
            for (int i = 0; i < pointAsC.Length; i++)
            {
                pointAsC[i] = 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());
        }
    }
}

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

<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 ho=
pe is here on this mailing list.=C2=A0</div><div dir=3D"auto">I&#39;m curre=
ntly trying to do something rather simp&#39;e which consists in creating a =
simple class in cpp and in C# create an array of this class for it to be pa=
ssed in cpp, updated in cpp and resent updated to the C#.</div><div dir=3D"=
auto">So cpp defines the model, C# instantiate it.</div><div dir=3D"auto">B=
ut I&#39;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 the=
ir default values as defined in C#.</div><div dir=3D"auto"><br></div><div d=
ir=3D"auto">Any idea what I&#39;m doing wrong?</div><div dir=3D"auto">The C=
# documentation specify that an arguments with an %apply of type OUTPUT &qu=
ot;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&quot;=
.</div><div dir=3D"auto"><br></div><div dir=3D"auto">Below, you will find m=
y source code:</div><div dir=3D"auto"><br></div><div dir=3D"auto"><b><u>Ent=
rypoint.h</u></b></div><div dir=3D"auto"><br></div><div dir=3D"auto">#inclu=
de &lt;iostream&gt;</div><div dir=3D"auto"><br></div><div dir=3D"auto">usin=
g namespace std;</div><div dir=3D"auto">#include &quot;PointAsC.h&quot;</di=
v><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><d=
iv dir=3D"auto">};</div><div dir=3D"auto"><br></div><div dir=3D"auto"><br><=
/div><div dir=3D"auto"><b><u>Entrypoint.cpp</u></b></div><div dir=3D"auto">=
<br></div><div dir=3D"auto">#include &quot;entrypoint.h&quot;</div><div dir=
=3D"auto"><br></div><div dir=3D"auto">using namespace std;</div><div dir=3D=
"auto"><br></div><div dir=3D"auto">EntryPoint::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>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</d=
iv><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></di=
v><div dir=3D"auto">class PointAsC</div><div 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, double y);</div><div dir=3D"auto"><=
br></div><div dir=3D"auto">=C2=A0 void setX(double x);</div><div dir=3D"aut=
o">=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=A0private:</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"auto"><br></div><div dir=3D"auto=
"><br></div><div dir=3D"auto"><b><u>PointAsC.cpp</u></b></div><div dir=3D"a=
uto"><br></div><div dir=3D"auto">#include &quot;PointAsC.h&quot;</div><div =
dir=3D"auto">#include &lt;cmath&gt;</div><div dir=3D"auto">#include &lt;ios=
tream&gt;</div><div dir=3D"auto">using namespace std;</div><div dir=3D"auto=
"><br></div><div dir=3D"auto">PointAsC::PointAsC() : x(0), y(0)</div><div d=
ir=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"auto">=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><div dir=3D"auto">{</div><div =
dir=3D"auto">=C2=A0 =C2=A0 this-&gt;y =3D y;</div><div dir=3D"auto">}</div>=
<div dir=3D"auto"><br></div><div dir=3D"auto">double 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><div 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"><br></div><div dir=3D"auto">/*=
 File : example.i */</div><div dir=3D"auto">%module dwdbms</div><div dir=3D=
"auto"><br></div><div dir=3D"auto">%include typemaps.i</div><div dir=3D"aut=
o">%include arrays_csharp.i</div><div dir=3D"auto"><br></div><div dir=3D"au=
to">%{</div><div dir=3D"auto">#include &quot;PointAsC.h&quot;</div><div dir=
=3D"auto">#include &quot;entrypoint.h&quot;</div><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"auto">%typemap(ctype) PointAsC*=
 &quot;PointAsC*&quot;</div><div dir=3D"auto">%typemap(cstype) PointAsC* &q=
uot;PointAsC[]&quot;</div><div dir=3D"auto">%typemap(imtype) PointAsC* &quo=
t;PointAsC[]&quot;</div><div dir=3D"auto">%typemap(csin) PointAsC* &quot;$c=
sinput&quot;</div><div dir=3D"auto">%typemap(in) PointAsC* &quot;$1 =3D $in=
put;&quot;</div><div dir=3D"auto">%typemap(freearg) PointAsC* &quot;&quot;<=
/div><div dir=3D"auto">%typemap(argout) PointAsC* &quot;&quot;</div><div di=
r=3D"auto"><br></div><div dir=3D"auto">%apply PointAsC INOUT[] {PointAsC* p=
ointsArray}</div><div dir=3D"auto"><br></div><div dir=3D"auto">%include &lt=
;entrypoint.h&gt;</div><div dir=3D"auto"><br></div><div dir=3D"auto">%exten=
d EntryPoint {</div><div dir=3D"auto"><br></div><div dir=3D"auto">=C2=A0voi=
d generate_pointer_array(PointAsC* pointsArray, int amount)</div><div dir=
=3D"auto">=C2=A0{</div><div dir=3D"auto">=C2=A0 for(int i =3D 0; i &lt; amo=
unt; i++)</div><div dir=3D"auto">=C2=A0 {</div><div dir=3D"auto">=C2=A0 =C2=
=A0pointsArray[i].setX(0.1 * i);</div><div dir=3D"auto">=C2=A0 =C2=A0std::c=
out &lt;&lt; &quot;Values are: &quot; &lt;&lt; pointsArray[i].getX() &lt;&l=
t; std::endl;</div><div dir=3D"auto">=C2=A0 }</div><div dir=3D"auto">=C2=A0=
}</div><div dir=3D"auto"><br></div><div dir=3D"auto">}</div><div dir=3D"aut=
o"><br></div><div dir=3D"auto"><b><u>My C# code</u></b></div><div dir=3D"au=
to"><br></div><div dir=3D"auto">using System;</div><div dir=3D"auto"><br></=
div><div dir=3D"auto">namespace TestStandardLibrary</div><div dir=3D"auto">=
{</div><div dir=3D"auto">=C2=A0 =C2=A0 class RunSwig</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()</div><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 EntryPoint();</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 entr=
yPoint.generate_pointer_array(pointAsC, pointAsC.Length);</div><div dir=3D"=
auto">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Console.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><div 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.Wri=
teLine(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>

--0000000000008821fe0621d2f97d--


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


--===============3828788935943108944==
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

--===============3828788935943108944==--