Dear Henry, Bill, Linda, Thanks for your responses, I am getting the point/ers.
Perhaps in https://code.jsoftware.com/wiki/Guides/DLLs/Calling_DLLs#J807_Incompatibilities , the phrase: "The DLL can read or write this memory." is a bit confusing, although it also says "The memory is unaliased." That means "copied if required", and I thought it wouldn't be... Anyway, all is well again, Thanks, Ben On Mon, Nov 19, 2018 at 1:15 AM Henry Rich <[email protected]> wrote: > What Bill is saying is that starting in 807, cd makes an copy of any > argument to cd that might be shared by another noun. So, the value of > 'res' is put into a temporary block and passed to the DLL. The > temporary block is put into the boxed result of cd. You need to look in > that boxed result, not in the name res, which has not been modified. > > This change was made in 807 because that release has a much more > aggressive policy of sharing nouns and parts of nouns without making > separate copies; for example > > ({. name) > > actually gives you a pointer to the first item of name, without > recopying it, and > > (i. 3) > > is liable to give you a pointer to unchangeable internal data. With all > these pointers flying around we can no longer trust the user to know > when it is safe to pass a pointer into a DLL that might modify the data. > > Henry Rich > > On 11/18/2018 7:55 AM, bill lam wrote: > > j807 must get from result of cd, like this > > 0 3{ (sqrdll, 'sqr i i *i *i') cd (#y);y;res > > > > On Sun, Nov 18, 2018, 2:22 PM Ben Gorte <[email protected] wrote: > > > >> Dear All, > >> > >> Long ago I made quite a lot of c-functions that I am calling from J > using > >> the cd mechanism (load 'dll') in linux. > >> > >> They stopped working in j64-807. I see in the release notes that indeed > >> something has changed, but I cannot quite relate that to my case (but > maybe > >> I should - I'm not sure I entirely understand the story). > >> > >> In the simplest form it looks like this: > >> First the c-code, sqr.c : > >> int sqr (int n, int a[], int b[]) > >> { > >> int i, sumsqr=0; > >> for (i=0; i<n; i++) > >> sumsqr += b[i] = a[i] * a[i]; > >> return sumsqr; > >> } > >> > >> which I compile with > >> gcc -O3 -shared -fPIC -o sql.so -Wl,--no-as-needed sqr.c > >> (omitting -O3 does not make a difference). > >> > >> In J I go like: > >> > >> load 'dll' > >> > >> sqrdll =: jpath '~user/ext/sqr.so ' > >> > >> > >> sqr =: 3 : 0 > >> > >> res =. (#y)#4 NB. make sure it's integer > >> > >> ret =. (sqrdll, 'sqr > i i *i *i') cd (#y);y;res > >> > >> ret, res > >> > >> ) > >> > >> > >> Up until j806 I would get: > >> > >> sqr i.10 > >> > >> 285 0 1 4 9 16 25 36 49 64 81 > >> > >> > >> But in j807: > >> > >> sqr i.10 > >> > >> 285 4 4 4 4 4 4 4 4 4 4 > >> > >> > >> > >> So my DLL 'reads' an array alright, but seems to be not 'writing' it. > >> > >> > >> For completeness: > >> JVERSION > >> Engine: j807/j64/linux > >> Release: commercial/2018-10-04T15:00:41 > >> Library: 8.07.20 > >> Qt IDE: 1.7.7/5.5.1 > >> Platform: Linux 64 > >> Installer: J807 install > >> InstallPath: /home/ben/j64-807 > >> Contact: www.jsoftware.com > >> > >> Perhaps I'm overlooking something trivial; any help is highly > appreciated! > >> > >> Ben > >> ---------------------------------------------------------------------- > >> For information about J forums see http://www.jsoftware.com/forums.htm > > ---------------------------------------------------------------------- > > For information about J forums see http://www.jsoftware.com/forums.htm > > > --- > This email has been checked for viruses by AVG. > https://www.avg.com > > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
