Home  |  Linux  | Mysql  | PHP  | XML
From:Michael Pitzel Date:Thu Aug 28 10:38:35 2008
Subject:Problem with Inline C - returning an array of real numbers
Inline@perl.org
Please help.
Here's what I want to do.
From a Perl routine, I want to call a Perl Inline callable "C" subroutine that is essentially at the head of a rather large set of "C" routines [ way over 10,000 lines] that do a rather sophisticated task that I do not wish to attempt to describe here.
I need the "C" "engine" that I've already built to do what it does without having to screw with it any more.  It is vulnerable to further development and maintenance errors that I wish to avoid.  It was written in Visual C++, but much of it is regular C.
I want Perl to do the front end and back end work of handling strings and other matters to get the data together to call the above described "C" subroutine "engine" through the use of Inline C.
I want to pass a small set of variables - about 10 or so - to the Perl callable "C" routines.
 foo (var1, var2, var3, var4, var5, var6, var7, var8, var9, var10 );
[I could pass another blank variable that sends back an array of real numbers, if that could be made to work. ie.
 foo (var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11 );]
The goal is that I want to get an indefinitely large array of real number results back from the called routine.
That's it.
It seems simple, but it has become a nightmare.
I am running version Perl 5.10.0, the latest and greatest version I could find.  Also the latest version of Inline, version 0.44.
I am on a PC running Windows 2000, and using active state .
The following line "works" when tested in a very small routine.
     @results = map {$_} foo (var1, var2, var3, var4, var5, var6, var7, var8, var9, var10 );
In this example, I use the following stack method in the "C" routine to pass back what I want as this array:
      Inline_Stack_Reset;
      Inline_Stack_Push(sv_2mortal(newSViv(arg)));
 ...
      Inline_Stack_Done;
However, apparently, declaring an exactly similar Perl callable subroutine in the huge set of "C" routines doesn't work. 
 void foo (var1, var2, var3, var4, var5, var6, var7, var8, var9, var10 );
This does not work.
It gets the following error -
 "Can't locate auto/foo.al in @INC "
Other people have apparently gotten this error, as described in various posts to the net.  And, yes, I checked the spelling of the called routine. It just won't work.
Therefore the following will also not work
     @results = map {$_} foo (var1, var2, var3, var4, var5, var6, var7, var8, var9, var10 );
Because, once I declare:
 int foo (var1, var2, var3, var4, var5, var6, var7, var8, var9, var10 );
the integer declaration means that the return array disappears from the stack, and I have no real array.
Let me say it again.  
The usage of void foo () and the above map method actually works, but only when used with tiny itsy bitsy stubbed out routines.  It does not work when actual usage is attempted in the actual much larger set of routines.   And, yes, I have checked the spellings.  They're correct. This usage of the Perl stack ust does not work.
It would seem to be an impossible task to do what should work to get this results array back from the call. The error is a strange one that makes no sense, but I have to get the job done anyway.
I need a method for this that WILL work.
If I cannot use the Perl stack as above to get the array back from the subroutine, how in the heck can I get what I need to get done ?
Is there some way to safely and securely pass an arbitrarily large set of information in an array back from the called "C" routine ?
Tests that work on tiny itsy bitsy stubbed out routines in seconds take more than 20 minutes to compile on my big set of "C" routines, so the frustration level here is pretty high.
Please help.
Thanks.
Mike.

Navigate in group perl.inline at sever nntp.perl.org
Previous Next




  
© No Copyright
You are free to use Anything
Site Maintained by PHP Developer
Powered By PHP Consultants