Hi Kostas

In your mkIList function, aren't you declaring a pointer
 
  register struct descrip *intd;

and then dereferencing it without allocating any memory for it?

...

  for (i = 0; i < size; i++) {
    intd->dword = D_Integer;
    intd->vword.integr = x[i];
    bp->lslots[i] = *intd;
  }

Cheers


R




On Monday 08 July 2002 8:54 pm, Kostas Oikonomou wrote:
> The following code makes a dynamically-loaded function "ctoil()" that
> returns to a Unicon/Icon program an array of ints created in C. The code
> consists of Icon, C, and RTL. (To compile you need the Unicon source.)
>
> There is only one small problem that I haven't been able to resolve: see
> the "Bug!" comment in the C file.  If you can help with this, it would be
> greatly appreciated.
>
>                               Kostas
>
>
>
> ------------------------------- Icon --------------------------------
> link fullimag
>
> procedure main()
>   local L
>   ctoil := loadfunc("./ctoil.so", "CtoIlist")
>   L := ctoil()
>   write("type(L) = ", type(L))
>   write("*L = ", *L)
>   write(fullimage(L))
> end
>
> -------------------------------   C    ------------------------------
>
> #include "icall.h"
> /* Additions to icall.h: */
> #define T_List                 8
> #define D_List                (T_List     | D_Typecode | F_Ptr)
> #define RetList(L) return (argv[0].dword = D_List, argv[0].vword = *L, 0)
>
> /* Create an array x in C and return it as a list L in Icon. */
> int CtoIlist(int argc, descriptor argv[])
> {
>   int n = 8;
>   int x[n];
>   word *L;
>   {
>     int i;
>     for(i=0;i<n;i++) x[i] = i*i*i*i;
>   }
>   printf("Calling mkIlist...\n");  /* Bug! Can't remove this! */
>   mkIlist(x,n,L);
>   RetList(L);
> }
>
> -------------------------------   RTL    ------------------------------
>
> /* Attempt to get around the fact that runerr() isn't allowed in a C
> function. Don't know how to do better. */
> #define runerr0 {err_msg(0,NULL); return A_Resume;}
>
> /* L is returned as the vword of the list descriptor: */
> int mkIlist(int x[], int n, word *L)
> {
>   tended struct b_list *hp;
>   register word i, size;
>   word nslots;
>   register struct b_lele>   register struct descripm *bp;
>   register struct descrip *intd;
>
>   nslots = size = n;
>   if (nslots == 0) nslots = MinListSlots;
>
>   /* Protect is a macro defined in h/grttin.h */
>   Protect(hp = alclist_raw(size, nslots), runerr0);
>   bp = (struct b_lelem *)hp->listhead;
>
>   /* Set slot i to a descriptor for the integer x[i] */
>   for (i = 0; i < size; i++) {
>     intd->dword = D_Integer;
>     intd->vword.integr = x[i];
>     bp->lslots[i] = *intd;
>   }
>
>   Desc_EVValD(hp, E_Lcreate, D_List);
>
>   *L = (word)hp;
>   return 0;
> }
>
> ------------------------------- Makefile --------------------------------
> # C arrays to Icon lists
>
> RTT = /opt/unicon/bin/rtt -r /opt/unicon/bin/
>
> xmkIlist.c : mkIlist.r
>       $(RTT) -x -P $< > $@
> xmkRlist.c : mkRlist.r
>       $(RTT) -x -P $< > $@
>
> # icall.h assumed to be in /opt/unicon/local/C:
> %.o : %.c
>       gcc -I/opt/unicon/local/C -I/opt/unicon/src/libtp -c -fpic $<
>
> ctoil.so : CtoIlist.o xmkIlist.o
>       gcc -I/opt/unicon/local/C -shared -fpic -o $@ $^
>
> lt : lt.icn ctoil.so
>       /opt/unicon/bin/icont $@
>
> clean:
>       rm *.o *.so
>
> -------------------------------------------------------------------------
>
>
>
> -------------------------------------------------------
> This sf.net email is sponsored by:ThinkGeek
> Oh, it's good to be a geek.
> http://thinkgeek.com/sf
> _______________________________________________
> Unicon-group mailing list
> [EMAIL PROTECTED]
> https://lists.sourceforge.net/lists/listinfo/unicon-group



-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Oh, it's good to be a geek.
http://thinkgeek.com/sf
_______________________________________________
Unicon-group mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/unicon-group

Reply via email to