Path: utzoo!utgpu!news-server.csri.toronto.edu!rpi!zaphod.mps.ohio-state.edu!wuarchive!uwm.edu!linac!att!ucbvax!UCBVAX.BERKELEY.EDU!"Dan Karron From: Dan Karron@UCBVAX.BERKELEY.EDU Newsgroups: comp.sys.sgi Subject: Re: Calling all C-men Again Message-ID: <9104131716.AA09142@karron.med.nyu.edu> Date: 13 Apr 91 17:16:59 GMT Sender: daemon@ucbvax.BERKELEY.EDU Reply-To: karron@cmcl2.nyu.edu Organization: The Internet Lines: 138 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@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> |