[comp.sys.mac.programmer] Think C question

eck@eniac.seas.upenn.edu (Brian Eck) (10/10/90)

   I am trying to write the contents of an array of integers to the screen.
The array is two dimensional; it is a representation of an electric field.  I
would like to write the values at integer-valued points in the field at each
iteration of the field update.  I have tried DrawString and DrawChar, but have
met with little success.  I get output, but it's garbage.  Here's the source:

#include <stdio.h>

#define BASE_RES_ID			400
#define NIL_POINTER			0L
#define MOVE_TO_FRONT		-1L
#define REMOVE_ALL_EVENTS	0
#define GRIDX				40
#define GRIDY				40
#define POINTS				2
#define TOLERANCE			4

int grid	[GRIDY] [GRIDX];
int oldgrid	[GRIDY] [GRIDX];

struct coordinates
{
	int		x, y, val;
}	field	[POINTS];

int	i, o, t;
int	loop = 0;
int tolerance = TOLERANCE;

WindowPtr	gPictureWindow;

/*** Main ***/

main()
{
	ToolBoxInit();
	WindowInit();
	MainLoop();
	while(!Button());
}


/*** ToolBoxInit ***/

ToolBoxInit()
{
	InitGraf(&thePort);
	InitFonts();
	FlushEvents(everyEvent,REMOVE_ALL_EVENTS);
	InitWindows();
	InitMenus();
	TEInit();
	InitDialogs(NIL_POINTER);
	InitCursor();
}


/*** WindowInit ***/

WindowInit()
{
	gPictureWindow = GetNewWindow(BASE_RES_ID, NIL_POINTER, MOVE_TO_FRONT);
	ShowWindow(gPictureWindow);
	SetPort(gPictureWindow);
}


/*** MainLoop ***/

MainLoop()
{

	/*** FieldInit ***/

	field[0].y = 19;
	field[0].x = 25;
	field[0].val = 100;
	field[1].y = 19;
	field[1].x = 15;
	field[1].val = 100;


	/*** GridInit ***/

	for (i=0; i<GRIDY; i++)
		for (o=0; o<GRIDX; o++)
			grid [i] [o] = 1;
			
	
	/*** Field Placement ***/
	
	for (i=0; i<POINTS; i++)
		grid[field[i].y] [field[i].x] = field[i].val;
		
	
	/*** Main Loop ***/
	
	while ((tolerance >= TOLERANCE) && (loop<100))
	{
		++loop;
		tolerance = 0;

		for (i = 0; i < GRIDY; i++)			/* copy grid */
			for (o = 0; o < GRIDX; o++)
				oldgrid [i] [o] = grid [i] [o];
		
		for (i = 1; i < GRIDY - 1; i++)		   /* recalculate */
		{
			for (o = 1; o < GRIDX - 1; o++)
			{
			if (NotInField(i,o))
			{
			grid[i][o] = (oldgrid [i-1] [o] + oldgrid [i+1] [o] +
			        oldgrid [i] [o-1] + oldgrid [i] [o+1])/4;
				t = grid [i-1] [o] - grid [i] [o];
				if (t>tolerance)
				tolerance = t;
		}
		MoveTo ((o*10),(i*10));
		TextSize(9);
		DrawChar(grid[i][o]);
		}
	}
   }
}	

/*** Not In Field ***/

NotInField(y,x)
{
	int i, o;
	for (i = 0; i < POINTS; i++)
		if ((field[i].x == x) && (field[i].y == y))
			return(0);
		return(1);
  }


   Please do not chastise me too severely if I am making a ridiculous error;
I kind of jumped into a project that is a bit over my head (crazy Toolbox...)

Brian
eck@eniac.seas.upenn.edu

rg2c+@andrew.cmu.edu (Robert Nelson Gasch) (10/10/90)

I have a think C problem. When I allocate the memory for the array
of pointers in allocatelandscape, it progressiveley slows down. 
This is a real pain as MAXSIDE is 70 and after 50 rows or so, it 
is *very* slow. The structure is too big for it to be declared as 
an array, so I have to use pointers to allocate the memory.

If anybody knows a remedy to this, please let me know.

Thanx a million --> rob

Here's the source:

#include <stdio.h>
#define MAXSIDE 70

typedef struct {
		short food; 	
		short restorefood;
		short org1, org2;
		}squaretype;

squaretype *landscape[MAXSIDE][MAXSIDE]; /* global var */

void allocatelandscape ()
{
	int x, y;
	
	for (x = 0; x < MAXSIDE; x++){
		for (y = 0; y < MAXSIDE; y++)
			landscape[x][y] = (squaretype *) malloc (sizeof(squaretype));
		printf (".");}
}

main ()
{
allocatelandscape ()
}