[comp.lang.c] struct {int **i}; problem

sven@cs.widener.edu (Sven Heinicke) (03/24/91)

I got a little double integer pointer in a structure problem while in a
subprogram problem.  I think I have got everyting but one line down but 
I am not 100% sure about the malloc() line either.  Here is the extract
of the code I am working on:

.
.
.
struct imatrix {
  char **board;
  int size;
};
typedef struct imatrix iMATRIX;

main()
{
  int l;
  iMATRIX playing;
.
.
.
  /*
   * here are the three malloc() lines I am
   * not sure work right but I think do.
   * playing.size is picked bye the user.
   */
  playing.board = (int**)malloc(sizeof(int *) * playing.size * playing.size); 
  for(l = 0;l < playing.size * playing.size;l++)
    *(playing.board) = (int*)malloc(sizeof(int));

  reset(&playing);
.
.
.
}

reset(matrix)
     iMATRIX *matrix;
{
  int x,y;

  for(x = 0;x < matrix->size;x++)
    for(y = 0;y < matrix->size;y++)
      (*(matrix->board+x)+y) = x * matrix->size + y + 1;
  /*
   * This in the line that I got confused about, 
   * it don't compile.  In gnu c it gets the error:
   *           invalid lvalue in assigment
   *
   * could somebody tell me what line to use?
   *
   */
}

-- 
sven@cs.widener.edu                                  Widener CS system manager
Sven Mike Heinicke                                          and Student
(pssmheinicke@cyber.widener.edu (if you must))

rjohnson@shell.com (Roy Johnson) (03/27/91)

In article <1991Mar23.213414.12572@cs.widener.edu> sven@cs.widener.edu (Sven Heinicke) writes:
> struct imatrix {
>   char **board;
>   int size;
> };
> typedef struct imatrix iMATRIX;

> main()
> {
>   int l;
>   iMATRIX playing;
> .
> .
> .
>   playing.board = (int**)malloc(sizeof(int *) * playing.size * playing.size); 
I think what you want here is
	playing.board = (int **)malloc(sizeof(int *) * playing.size);
which gives you one dimension of the board.  Then to get the other dimension
you do

>   for(l = 0;l < playing.size * playing.size;l++)
>     *(playing.board) = (int*)malloc(sizeof(int));

which I gather is to allocate the other dimension of the board.  What
you are doing here is malloc-ing space, assigning the pointer, and
then losing the pointer when you reassign the same thing again.  This
loop should be like:
	for (l = 0; l < playing.size; l++)
	  playing.board[l] = (int *)malloc(sizeof(int) * playing.size);
playing.board is then an array of arrays% of ints.  However, note that
you declared playing.board to be pointer to pointer to char.  You will
need to determine which you really want.


> reset(matrix)
	iMATRIX *matrix;
> {
>   int x,y;

>   for(x = 0;x < matrix->size;x++)
>     for(y = 0;y < matrix->size;y++)
>	 (*(matrix->board+x)+y) = x * matrix->size + y + 1;
> }

For clarity, I recommend the (arguably slower)
	matrix->board[x][y] = x * matrix->size + y + 1;
which should do the same thing.  Should means I haven't tried it.  8^)
If you want to keep your pointer-dereference notation, you want:
	*(*(matrix->board+x)+y) = x * matrix->size + y + 1;
that is, one more level of indirection.

Hope this helps.  Hope it's all right.


% I'm using the terms array and pointers rather freely, which I'm sure
will inspire much "clarification".  Conceptually, array of arrays is
what you have.
--
======= !{sun,psuvax1,bcm,rice,decwrl,cs.utexas.edu}!shell!rjohnson =======
Feel free to correct me, but don't preface your correction with "BZZT!"
Roy Johnson, Shell Development Company