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'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'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 <<a href=3D"mailto:[email protected]= m">[email protected]</a>> 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 "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 < 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, "Kamigak= u" <<a href=3D"mailto:[email protected]" target=3D"_blank" rel=3D"= noreferrer">[email protected]</a>> 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'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'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'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'm doing w= rong?</div><div dir=3D"auto">The C# documentation specify that an arguments= with an %apply of type OUTPUT "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".</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 <iostream></div><div dir=3D"auto= "><br></div><div dir=3D"auto">using namespace std;</div><div dir=3D"auto">#= include "PointAsC.h"</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"</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 <iostream></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"</div><div dir=3D"auto">#include <cmath></div><di= v dir=3D"auto">#include <iostream></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->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->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->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->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 "Po= intAsC.h"</div><div dir=3D"auto">#include "entrypoint.h"</di= v><div dir=3D"auto">%}</div><div dir=3D"auto"><br></div><div dir=3D"auto">%= include <PointAsC.h></div><div dir=3D"auto"><br></div><div dir=3D"aut= o">%typemap(ctype) PointAsC* "PointAsC*"</div><div dir=3D"auto">%= typemap(cstype) PointAsC* "PointAsC[]"</div><div dir=3D"auto">%ty= pemap(imtype) PointAsC* "PointAsC[]"</div><div dir=3D"auto">%type= map(csin) PointAsC* "$csinput"</div><div dir=3D"auto">%typemap(in= ) PointAsC* "$1 =3D $input;"</div><div dir=3D"auto">%typemap(free= arg) PointAsC* ""</div><div dir=3D"auto">%typemap(argout) PointAs= C* ""</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 <entrypoint.h></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 < 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 << "Values are: " << po= intsArray[i].getX() << 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 < 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&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==--