gcc<->gpc: reallocating and disposing buffers

Frank Heckenbach frank at g-n-u.de
Wed Aug 29 03:54:25 CEST 2001


Sorry for the late reply ...

George Shapovalov wrote:

> I am sorry for somewhat lengthy email, I tried to get most of the details
> here.  I could not find detailed discussion of this topic in documentation, 
> so this is a short investigation.
> 
> 	First some description: I need to implement access to some data stored in 
> special binary format for reading which large chunks of C code exist. On the 
> other hand it would be easier/cleaner to do data processing  in pascal (It is 
> really nice to use schemata for some purposes). So I thought to create some c 
> functionds which would access data and pass it to pascal program.
> It would be nice to have c functions allocate and fill buffers and then have 
> pascal code dispose them after processing. So I tried to test what happens.
> Below is the model code which is supposed to represent such situation. In 
> fact it tests passage of buffers in both ways:
> I allocate small array on pascal side, pass it to c, then reallocate it there 
> (slightly larger block) - actually I use free and then malloc, but realloc 
> gave the same result. Then upon return to pascal I dispose the buffer.
> 	To tell the truth I did not expect things to work at all, but it appears 
> that they do work - one way only. Unfortunately the opposite way to what I 
> need.

In general, you can indeed expect it to work both ways.

There's only one catch: If the program ever uses Mark/Release (or
something which uses them itself such as the HeapMon unit), you
cannot free pointers in C that were allocated in Pascal. But since
you don't use Mark/Release, that's not relevant here.

Unfortunately, your example contains a fe problems:

- cmem.c is missing. I added for it:
  #include <stdlib.h>
  void cfree (void *p) { free (p); }

- cFunc does not return a value, and the Pascal code treats the
  function as a procedure.

- The pointer in Pascal is declared as fixed-size, so even after the
  reallocation, Pascal treats its size as 10 chars and writes it
  accordingly.

- The C statemtent `*x="0123456789abcde"' assigns a *pointer* rather
  than copying an array. So you try, in the end, to free a C string
  constant which obviously may crash (regardless whether you do that
  in Pascal or C).

So, the problem here is a misunderstanding of C's pointer/array
semantics (and therefore a little OT ;-). I don't know if that's the
problem you had in your real code, but if there's something else for
which GPC may be to blame, let us know.

Frank

-- 
Frank Heckenbach, frank at g-n-u.de, http://fjf.gnu.de/
GPC To-Do list, latest features, fixed bugs:
http://agnes.dida.physik.uni-essen.de/~gnu-pascal/todo.html




More information about the Gpc mailing list