[Info-vax] Any Way to Pass Character String Arguments from C to Basic?
Dave Froble
davef at tsoft-inc.com
Mon Oct 21 13:26:08 EDT 2019
On 10/21/2019 12:38 PM, Bob Gezelter wrote:
> On Monday, October 21, 2019 at 11:31:33 AM UTC-4, Craig Dedo wrote:
>> Is there any way to pass character string arguments from a C program or procedure to a procedure written in Basic? For both languages I'm using the current versions of the languages:
>> VSI C V7.4-002 on OpenVMS Alpha V8.4-2L2
>> VSI BASIC V1.8-005 on OpenVMS V8.4-2L2
>>
>> I need to pass character string variables from a main program or procedure written in C to a subroutine written in Basic and get back character string data from the Basic subroutine. I had to write the subroutine in Basic because it needs to call a utility subroutine in Basic that uses arrays of varying-length character strings.
>>
>> Everything compiles and links correctly; no errors or warnings at all. When I run the program everything works fine until I try to assign character string data back into character string arguments that are associated with character strings in the C program.
>> * Assignment of character string arguments from the C program to variables in the Basic subroutine works fine.
>> * Assignment of integer results from the Basic subroutine to the integer arguments in the C program works fine.
>> * BUT when I try to assign character string values to a character string argument in the C program, I get a fatal error:
>> %STR-F-FATINTERR, fatal internal error
>>
>> I have already documented the fatal error and reported it to our firm's OpenVMS system manager who reported it to VMS Support at VSI a few minutes ago.
>>
>> While we are waiting for a reply from VSI, is there any way around this defect in the String module of the OpenVMS Run Time Library? Here are the procedure interfaces:
>>
>> C side (caller):
>> void Get_DIA_Return_Eligibility ( struct dsc$descriptor_d *Customer_Location_Code_adsc, struct dsc$descriptor_d *Part_Number_adsc, long *DR3_Quantity_al, long *DR2_Quantity_al, struct dsc$descriptor_d *Oldest_Invoice_Number_adsc, struct dsc$descriptor_d *SQL_Status_adsc, struct dsc$descriptor_d *SQL_Message_adsc );
>>
>> Basic side (callee):
>> Sub Get_DIA_Return_Eligibility ( String Customer_Location_Code_as, String Part_Number_as, Long DR3_Quantity_al, Long DR2_Quantity_al, String Oldest_Invoice_Number_as, String SQL_Status_as, String SQL_Message_as )
>>
>> BTW, this is NOT an academic assignment. It is a real production problem in a commercial environment with real profit and loss responsibility and real money at stake.
>>
>> Any help would be very much appreciated.
>>
>> Sincerely,
>> Craig T. Dedo. OpenVMS Software Development Consultant
>> Navistar, Inc.
>> 2701 Navistar Drive
>> Lisle, IL 60532
>
> Craig,
>
> The key here is that BASIC is expecting strings to be passed by descriptor. The C default is by reference.
>
> One must also be careful about the difference between read only and read/write.
>
> Look in the C include files for the definition of $DESCRIPTOR. This allows the definition of read-only strings with a descriptor. Writable strings have to be defined differently.
>
> I hope that the above is helpful. If I have not been clear, contact me on or off list.
>
> - Bob Gezelter, http://www.rlgsc.com
>
It may be that he needs to determine what type of string descriptor is
used in Basic. I got bit by this in the past.
Use different types of descriptors, and, things can get interesting.
--
David Froble Tel: 724-529-0450
Dave Froble Enterprises, Inc. E-Mail: davef at tsoft-inc.com
DFE Ultralights, Inc.
170 Grimplin Road
Vanderbilt, PA 15486
More information about the Info-vax
mailing list