Calling all C-men Again
DanKarron at UCBVAX.BERKELEY.EDU
DanKarron at UCBVAX.BERKELEY.EDU
Sun Apr 14 03:16:59 AEST 1991
As promised, here is some sample code to demonstrate my problem.
My goal is to have a dynamically allocated array of pointers to the
base of an array of 3 floats and a dynamically allocated array of pointers
to the base of a 2x3 array of floats;
The results of compilation are at the end of the code. Cut out the
code and use this makefile defines:
CFLAGS = -g2
LDFLAGS= -lmalloc
-------------snip.c------------------------------------------snip.c------------
/* The goal here is to construct a list of pointers to
* the base of an array of 3 float and the base of
* a 2x3 array of floats */
#include "stdio.h"
#include "malloc.h"
typedef struct LineTag {
float EndPoints[2][3];
float PlaneNormals[2][3];
char LineName[100];
} Line;
typedef struct PointTag {
float Vertex[3];
char PointName[100];
} Point;
typedef struct WrapperTag {
Line *LinePointer;
Point *PointPointer;
} Wrapper;
main()
{
Wrapper *p,*q,*r;
float (**plane_list)[2][3];
float (**point_list)[3]; /* why so much indirection ?*/
printf("sizeof **plane_list=%d\n",sizeof(**plane_list)/sizeof(float));
printf("sizeof **point_list=%d\n",sizeof(**point_list)/sizeof(float));
plane_list=calloc(3,sizeof(float *)); /* how do you spec a pointer to an array ? */
point_list=calloc(3,sizeof(float *)); /* make three slots at this address for demo */
p=calloc(1,sizeof(Wrapper));
p->PointPointer=calloc(1,sizeof(Point));
point_list[0]= p->PointPointer->Vertex; /* put the base address of the vertex list at point_list slot 0 */
printf("p->PointPointer=%#x\n",point_list[0]); /* the addresses match... */
printf("point_list[0]=%#x\n",point_list[0]);
p->PointPointer->Vertex[0]=0.1; /* assign some values */
p->PointPointer->Vertex[1]=0.2; /* we should see the same values from point_list */
p->PointPointer->Vertex[2]=0.3;
printf("%d:(%#x)%f,(%#x)%f,(%#x)%f\n",0,&p->PointPointer->Vertex[0],p->PointPointer->Vertex[0],
&p->PointPointer->Vertex[1],p->PointPointer->Vertex[1],
&p->PointPointer->Vertex[2],p->PointPointer->Vertex[2]); /* verify addresses and values */
printf("%d:(%#x)%f,(%#x)%f,(%#x)%f\n",0,
&((*point_list[0])[0]),(*point_list[0])[0],
&((*point_list[0])[1]),(*point_list[0])[1],
&((*point_list[0])[2]),(*point_list[0])[2]); /* Huh ?? */
/* you fill in the rest */
p->LinePointer=calloc(1,sizeof(Line));
plane_list[0]=p->LinePointer->PlaneNormals;
p->LinePointer->PlaneNormals[0][0]=0.0;
p->LinePointer->PlaneNormals[0][1]=1.0;
p->LinePointer->PlaneNormals[0][2]=2.0;
p->LinePointer->PlaneNormals[1][0]=10.0;
p->LinePointer->PlaneNormals[1][1]=11.0;
p->LinePointer->PlaneNormals[1][2]=12.0;
q=calloc(1,sizeof(Wrapper));
q->LinePointer=calloc(1,sizeof(Line));
q->LinePointer->PlaneNormals[0][0]=100.0;
q->LinePointer->PlaneNormals[0][1]=101.0;
q->LinePointer->PlaneNormals[0][2]=102.0;
q->LinePointer->PlaneNormals[1][0]=1010.0;
q->LinePointer->PlaneNormals[1][1]=1011.0;
q->LinePointer->PlaneNormals[1][2]=1012.0;
r=calloc(1,sizeof(Wrapper));
r->LinePointer=calloc(1,sizeof(Line));
r->LinePointer->PlaneNormals[0][0]=0.10;
r->LinePointer->PlaneNormals[0][1]=1.10;
r->LinePointer->PlaneNormals[0][2]=2.10;
r->LinePointer->PlaneNormals[1][0]=10.10;
r->LinePointer->PlaneNormals[1][1]=11.10;
r->LinePointer->PlaneNormals[1][2]=12.10;
}
--cut.c-here-------------------------------------------------------------------
Here is what the compiler says:
karron:~/D.Bug:47make Bug
cc -g2 Bug.c -lmalloc -o Bug
ccom: Warning: Bug.c, line 38: Illegal pointer combination: pointer to array of
float versus pointer to float
point_list[0]= p->PointPointer->Vertex;
--------------------------------------^
ccom: Warning: Bug.c, line 59: illegal array size combination
plane_list[0]=p->LinePointer->PlaneNormals;
------------------------------------------^
karron:~/D.Bug:48Bug
sizeof **plane_list=6
sizeof **point_list=3
p->PointPointer=0x10006a10
point_list[0]=0x10006a10
0:(0x10006a10)0.100000,(0x10006a14)0.200000,(0x10006a18)0.300000
0:(0x10006a10)0.100000,(0x10006a14)0.200000,(0x10006a18)0.300000
Exit 200
What do you think it the way to do this ? I want to use arrays, not
float ***plane_list. Why ? Because the 2x3 array and the 1x3 array is
being used as a basic geometric object, and I want to be able to
print out the values in the debugger as a unit. My subroutines take
this 2x3 array as a basic unit, similar to the sgi typedef Matrix, which
is a 4x4 array of floats. Passing anything else should signal a compiler
error with prototype checking turned on. You can pass a float *,
but I want stronger typeing than that.
Cheers!
Dan.
| karron at nyu.edu (e-mail alias ) Dan Karron, Research Associate |
| Phone: 212 263 5210 Fax: 212 263 7190 New York University Medical Center |
| 560 First Avenue Digital Pager <1> (212) 397 9330 |
| New York, New York 10016 <2> 10896 <3> <your-number-here> |
More information about the Comp.sys.sgi
mailing list