Hi,
Windows 2000, perl5.6.1, Inline-0.44.

The simple test script below contains 2 similar functions - test2(), which
works fine - and test1(), which attempts to perform the same task as
test(2), but does so by calling c_push_si().
test1() is prone to error and crashing (details below).
----------------------------------------------------
use strict;
use warnings;
use Inline C => <<'END';

void c_push_si(int * array, int * ptr, int el){
   ++ *ptr;
   Renew(array, *ptr, int);
   array[*ptr - 1] = el;
   }

void test1(int its) {
     int * arr, len = 0, * lenptr, i;

     if(its < 1) croak("Get with it");
     lenptr = &len;

     Newz(2, arr, 1, int);
     if(arr == NULL) croak("Failed to allocate memory for array in test
function");

for(i = 0; i < its; ++i)
     c_push_si(arr, lenptr, i * 7);

for(i = 0; i < len; ++i) printf("%d ", arr[i]);

Safefree(arr);

}

void test2(int its) {
     int * arr, len = 0, i;

     if(its < 1) croak("Get with it");

     Newz(2, arr, 1, int);
     if(arr == NULL) croak("Failed to allocate memory for array in test
function");

for(i = 0; i < its; ++i) {
   ++len;
   Renew(arr, len, int);
   arr[len - 1] = i * 7;
   }

for(i = 0; i < len; ++i) printf("%d ", arr[i]);

Safefree(arr);

}

END

my $its = 3;
test1($its);
print "\n";
$its = 13;
test2($its);
----------------------------------------------------------

If $its is less than 3, everything works ok. If $its is greater than 3,
test1() crashes and windows shuts the program down.
If $its equals 3, things run ok, but the third value printed by test1() is
garbage.
Is this problem due to the memory block being moved ?

All I wanted was to have c_push_si() emulate perl's push() function, so that
I could just call *it* from within my inline-C functions whenever I want to
push a value onto an int array. Is there a smarter approach to achieving
this emulation ?
Or do I have to code up the Renew()-and-assign rigmarole every time I want
to push a value onto an array ?

Also on the subject of Renew() - should I be checking that the reallocation
was successful, and if so, how do I do that ?

Cheers,
Rob

Reply via email to