swarm-support
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Swarm-Support] Lisp serialization for multidimensional arrays


From: Marcus Daniels
Subject: Re: [Swarm-Support] Lisp serialization for multidimensional arrays
Date: Mon, 28 Aug 2006 21:01:12 -0600
User-agent: Thunderbird 1.5.0.5 (X11/20060808)

Hi Patricia, you wrote:
I cannot find an example for lisp serialization for a malloced c multidimensional array.
Attached are a couple of examples. One uses fixed size arrays and another that uses allocated arrays. One refinement in the latter case is that dimensions are not stored in the .scm file but recovered from the Lisp expression.

Marcus
#import <simtools.h> // initSwarm
#import <defobj.h> // Archivers
#import <defobj/Create.h> // CreateDrop

#define NAME "data"

@interface Data: CreateDrop
{
  int val[2][3][4];
}
@end

@implementation Data
- createEnd
{
  [super createEnd];

  unsigned i, j, k;

  for (i = 0; i < 2; i++)
    for (j = 0; j < 3; j++)
      for (k = 0; k < 4; k++)
        val[i][j][k] = i * 100 + j * 10 + k;
  
  return self;
}

- (void)describe: stream
{
  unsigned i, j, k;

  for (i = 0; i < 2; i++) {
    for (j = 0; j < 3; j++) {
      for (k = 0; k < 4; k++)
        printf (" %d", val[i][j][k]);
      printf ("\n");
    }
    printf ("\n");
  }
}
@end

int
main (int argc, const char **argv)
{
  id archiver;

  initSwarmBatch (argc, argv);

  archiver = [[[LispArchiver createBegin: globalZone]
                setPath: "multidim.scm"]
               createEnd];

  if (strcmp ([arguments getAppModeString], "create") == 0) {
    [archiver putDeep: NAME object: [Data create: globalZone]];
    [archiver sync];
  } else {
    id obj = [archiver getObject: NAME];

    xprint (obj);
  }
  return 0;
}

/*
Local Variables:
compile-command: "$SWARMHOME/bin/libtool-swarm --mode=link gcc -D_GNU_SOURCE -o 
multidim  -g -Wno-import -I$SWARMHOME/include/swarm -L$SWARMHOME/lib/swarm 
multidim.m  -lswarm"
End:
*/

#import <simtools.h> // initSwarm
#import <defobj.h> // Archivers
#import <defobj/Create.h> // CreateDrop

#define NAME "data"

@interface Data: CreateDrop
{
  int isize, jsize, ksize;
  int *val;
}
@end

@implementation Data
- createEnd
{
  [super createEnd];

  unsigned i, j, k, offset = 0;

  isize = 2;
  jsize = 3;
  ksize = 4;

  val = [globalZone alloc: isize * jsize * ksize * sizeof (int)];

  for (i = 0; i < isize; i++) 
    for (j = 0; j < jsize; j++)
      for (k = 0; k < ksize; k++) {
        val[offset] = i * 100 + j * 10 + k;
        offset++;
      }
    
  return self;
}

- (void)describe: stream
{
  unsigned i, j, k, offset = 0;

  for (i = 0; i < isize; i++) {
    for (j = 0; j < jsize; j++) {
      for (k = 0; k < ksize; k++) {
        printf (" %u", val[offset]);
        offset++;
      }
      printf ("\n");
    }
    printf ("\n");
  }
}

- lispInCreate: expr
{
  [super lispInCreate: expr];

  id ary = [expr atOffset: 1];

  int *dims = [ary getDims];

  isize = dims[0];
  jsize = dims[1];
  ksize = dims[2];
  printf ("recovered dims %u %u %u from expression\n", isize, jsize, ksize);
  return self;
}

- (void)lispOutDeep: stream
{
  unsigned dims[3] = { isize, jsize, ksize };
  [stream catStartMakeInstance: "Data"];

  [self lispStoreIntegerArray: val 
        Keyword: "val"
        Rank: 3 Dims: dims
        Stream: stream];

  [stream catEndMakeInstance];
}
@end

int
main (int argc, const char **argv)
{
  id archiver;

  initSwarmBatch (argc, argv);

  archiver = [[[LispArchiver createBegin: globalZone]
                setPath: "multidim-malloc.scm"]
               createEnd];

  if (strcmp ([arguments getAppModeString], "create") == 0) {
    [archiver putDeep: NAME object: [Data create: globalZone]];
    [archiver sync];
  } else {
    id obj = [archiver getObject: NAME];

    xprint (obj);
  }
  return 0;
}

/*
Local Variables:
compile-command: "$SWARMHOME/bin/libtool-swarm --mode=link gcc -D_GNU_SOURCE -o 
multidim-malloc  -g -Wno-import -I$SWARMHOME/include/swarm 
-L$SWARMHOME/lib/swarm multidim-malloc.m  -lswarm"
End:
*/


reply via email to

[Prev in Thread] Current Thread [Next in Thread]