Exemplo n.º 1
0
void fill_2d(double *data, IDL_LONG xsize, IDL_LONG ysize,
	     int i, int j, int all,
	     double thresh, UCHAR *result) {
  int off;
  int top, capacity = xsize;
  off = OFF2(i,j,xsize);

  int *stack;

  // easy case: seed position is zero. quit
  if (*(data + off) <= thresh ||
      (i < 1) || (i >= xsize - 1) ||
      (j < 1) || (j >= ysize - 1)) {
    printf("XXX Quitting\n");
    return;
  }

  stack = malloc(capacity * sizeof(int));
  top = -1;

  *(stack + ++top) = OFF2(i,j, xsize);
  while(top >= 0) {
    // grow stack, if needed
    if(top + 10 > capacity) {
      int newcap = MIN(capacity * 2, xsize * ysize);
      //printf("growing %i\n", capacity);
      int *newstack;
      if(!(newstack = malloc(newcap * sizeof(int)))) {
	printf("Memory allocation failure in fill_2d. Aborting");
	return;
      }
      memcpy(newstack, stack, capacity * sizeof(int));
      free(stack);
      stack = newstack;
      capacity = newcap;
    }

    off = *(stack + top--);
    i = off % xsize; j = off / xsize;

    *(result + off) = 1;

    // add neighbors to the stack
    STACK2(1,0); STACK2(-1,0);
    STACK2(0,1); STACK2(0,-1);
    if (all != 0) {
      STACK2(1,1); STACK2(1,-1);
      STACK2(-1,1); STACK2(-1,-1);
    }
  } // top >= 0
free(stack);
}
Exemplo n.º 2
0
int main(int argc, char** argv) {
  int i, j;
  double data[25], thresh;
  UCHAR result[25];
  thresh = 1;

  for(i = 0; i < 25; i++) *(data + i) = 0;


  for (i = 1; i < 3; i++) {
    for (j = 1; j < 3; j++) {
      int off = OFF2(i,j, 5);
      *(data + off) = 3;
    }
  }

  for(i = 0; i < 25; i++) *(result + i) = 0;

  fill_2d(data, 5, 5, 2,2,1,thresh,result);

  for(i = 0; i < 25; i++) printf("%f ", *(data + i));
  printf("\n");
  for(i = 0; i < 25; i++) printf("%i ", *(result + i));
  printf("\n");
  return 0;
}
Exemplo n.º 3
0
#define OFF(x)	offsetof(PyShmMemoryObject, x)
#define OFF1(x)	OFF(ds) + offsetof(struct shmid_ds, x)
#define OFF2(x)	OFF1(shm_perm) + offsetof(struct ipc_perm, x)

/* List of members for shared memory objects */

/* Note: member types are set in the initshm function.
   Members which need separate processing are:
   - addr --> it is not part of the shmid_ds structure
   - attached --> function depending on addr
   - nattch  --> system dependent declaration in shmid_ds (unknown type)
   - perm --> return permission (lower 9) bits only of ds.shm_perm.mode
*/

static struct memberlist memory_memberlist[] = {
    {"cgid",	T_INT,	OFF2(cgid),		RO},	/* 0  (gid_t)  */
    {"cpid",	T_INT,	OFF1(shm_cpid),		RO},	/* 1  (pid_t)  */
    {"cuid",	T_INT,	OFF2(cuid),		RO},	/* 2  (uid_t)  */
    {"key",	T_INT,	OFF2(key),		RO},	/* 3  (key_t)  */
    {"lpid",	T_INT,	OFF1(shm_lpid),		RO},	/* 4  (pid_t)  */
    {"shmid",	T_INT,	OFF(shmid),		RO},	/* 5  (int)    */
    {"size",	T_INT,	OFF1(shm_segsz),	RO},	/* 6  (int)    */
    {"gid",	T_INT,	OFF2(gid),		RO},	/* 7  (gid_t)  */
    {"uid",	T_INT,	OFF2(uid),		RO},	/* 8  (uid_t)  */
    /* The following members are implemented without this table */
    {"addr",	T_INT,	0,			RO},	/* 9  (void *) */
    {"attached",T_INT,	0,			RO},	/* 10  (int)    */
    {"nattch",	T_INT,	0,			RO},	/* 11 sys.dep. */
    {"perm",	T_INT,	0,			RO},	/* 12 (mode_t) */
    {NULL}			/* sentinel */
};