delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/2000/03/04/09:50:42

From: "-hs-" <email DOT invalid AT server DOT invalid>
Newsgroups: comp.os.msdos.djgpp
Subject: Re: DJGPP malloc problem
Date: Sat, 4 Mar 2000 14:31:40 +0100
Lines: 169
Message-ID: <89r37v$2as4$1@news5.isdnet.net>
References: <89n24n$5rq$1 AT news DOT koti DOT tpo DOT fi>
NNTP-Posting-Host: s111.paris-28.cybercable.fr
Mime-Version: 1.0
X-Trace: news5.isdnet.net 952176703 76676 212.198.28.111 (4 Mar 2000 13:31:43 GMT)
X-Complaints-To: abuse AT isdnet DOT net
NNTP-Posting-Date: 4 Mar 2000 13:31:43 GMT
X-Newsreader: Microsoft Outlook Express 4.72.3110.5
X-MimeOLE: Produced By Microsoft MimeOLE V4.72.3110.3
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp
Reply-To: djgpp AT delorie DOT com

Toni Riikonen a écrit dans le message <89n24n$5rq$1 AT news DOT koti DOT tpo DOT fi>...
>OK, now i come in here. Finnish coders couldn't help me with this problem.
>And the problem is this.
>
>I'm creating software-3D-engine with (of course) DJGPP v2, and i use rhide
>as my IDE.
>So, the main problem is this..
>I have structures for my 3D-objects, vertices, faces, matrixes, and so
on...
>I have to allocate memory for my objects face_structure.
>
>Ok here are the structures that i'm using:
>
>-------------------------------------------
>// Here are my structures (new_def.h)



>typedef float matrix_type[3][3];
>
>typedef struct vertex_type {
>  signed int x,y,z;
>  float rx,ry,rz;
>  unsigned int u,v;
>} vertex_type;
>
>typedef struct face_type {
>  vertex_type vertex[3];
>} face_type;
>
>typedef struct object_type {
>  signed int x,y,z;
>  float rx,ry,rz;
>  float ax,ay,az;
>  face_type *face;
>  unsigned int faces;
>  matrix_type object_matrix, world_matrix;
>} object_type;
>--------------------------------------------
>
>Ok, these should be fine, don't you think??



>Now, i have a init-part in my main-program..
>It's like this:

You need to include <stdlib.h> for the use of malloc()
and <stdio.h> for printf() and <conio.h> for gotoxy()
(btw, pointless here)

>void InitObject(object_type *obj, int faces)

style point : I should write
void InitObject(object_type *const pObj, int faces)

>{
>   obj->face = (face_type *)malloc( sizeof(face_type) * faces);

There absolutely no need for casting the return of malloc(). It is a void *.
What you really what is this (whatever the type)

   obj->face =malloc( sizeof *obj->face * faces);


>    if(obj->face == NULL) exit(1);

This is a very brutal way of handling a memory error. Better to return an
error indicator, test it and let the user to decide what to do...

personally (OO style) I prefer to design C-objects like this :

object_type * InitObject(int faces);
It means that a return of NULL is an error.

>    object.faces = faces;


Probably a typo (better to copy&past). ITYM:
    obj->faces = faces;

>}


>int main()
>{
>    object_type object;
>    InitObject(&object, 50); // 1 arg: Object    2: arg:    Number of faces
>in object


>    free(object.face);

good practice is

    if(object.face)
   {
      free(object.face);
      object.face=NULL;
   }

and test against NULL (with the assert() macro for example) before use.

>    return 0;
>}
>
>So, this code WORKS very well, if it is just like this, and i don't do

I am not sure...

>anything with my allocated structures..
>
>BUT, when i'm trying to, for example, print something out of these
>structures, my computer crashes, or boots up!


Most of the structure elements have never been initialized. Anything can
happen. (No prob with Borland 3.1). However, I dont want to try with
DJGPP...

>This is what i'm trying to do..
>
>----------------------------------------------
>int main()
>{
>    int a;
>    object_type object;
>    InitObject(&object, 50);
>    for(a = 0;a < object.faces; a++) {
>        gotoxy(1,1+a);
>        printf("%1.1f\n",object.face[a].vertex[0].rx);
>    }
>    free(object.face);

IMO, better to design a KillObject() function. The user is not interested by
such details...

>    return 0;
>}
>--------------------------------------------------
>
>OK, i know that malloc doesn't zero the allocated arrays, so there are lots
>of different values in it.


Ah you know it ! So what are you expecting ? Magic ?

>I've heard that DJGPP expands it's datatype to 4-byte lenght, is this true?
>Does it affect my program?


What do you mean ? The size of the data are returned by the 'sizeof' macro.
Check it if you want, but it has no relationship with your problem.

>Please i NEED YOUR HELP ON THIS ONE!!!, PLEEEASEEEE help, meeee!!
>I'm far behind schedule because of this problem..

Bad organization...


--
-hs-
CLC-FAQ: http://www.eskimo.com/~scs/C-faq/top.html
ISO-C Library: http://www.dinkum.com/htm_cl
"It's specified. But anyone who writes code like that should be
transmogrified into earthworms and fed to ducks." -- Chris Dollin CLC



- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019