Cannot Directly Pass Array from FORTRAN to Basic (27479)



The information in this article applies to:

  • Microsoft Visual Basic for MS-DOS
  • Microsoft Basic Professional Development System for MS-DOS 7.0
  • Microsoft Basic Professional Development System for MS-DOS 7.1
  • Microsoft QuickBASIC 4.0
  • Microsoft QuickBASIC 4.0b
  • Microsoft QuickBASIC 4.5

This article was previously published under Q27479

SUMMARY

There is no direct way to pass an array from FORTRAN to a Basic routine. One method that can be used is to set up a fixed length string whose length is the number of bytes in the array being passed. The characters of the string can then be converted to numbers using the CVI, CVL, CVS, or CVD functions. Values may be changed in the array using the MKI$, MKL$, MKS$, or MKD$ functions.

MORE INFORMATION

The Basic program is as follows:
DECLARE SUB forsub ()
OPTION BASE 1
CONST bytes = 20          ' Total number of bytes in array.
                          ' (number of elements * bytes per element)
TYPE arrsize
  ele AS STRING * bytes   ' Sets up consecutive bytes in memory to store
the
END TYPE                  ' whole array from FORTRAN.

CALL forsub


SUB subbas (a AS arrsize)
  size% = 10              ' Number of elements in array.
  elem% = 2               ' Number of bytes in each element.
  DIM arr%(size%)

' This loop converts the FORTRAN array into an array that Basic can use.
' The CVI function should be replaced by a CVL, CVS, OR CVD function if
' the array is not an integer array. If the array is a string array, only
' the MID$ function needs to be used.

  FOR i = 0 TO size% - 1
    arr%(i + 1) = CVI(MID$(a.ele, i * elem% + 1, elem%))
  NEXT i

  FOR i = 1 TO size%
    PRINT arr%(i)
  NEXT i
END SUB
				
The FORTRAN subroutine is as follows:
       INTERFACE TO SUBROUTINE SUBBAS (N1)
       INTEGER*2 N1 [NEAR] (10)
       END

       SUBROUTINE FORSUB
       INTEGER*2 A [NEAR] (10)
       DO 10 I = 1, 10
   10  A(I) = I
       A(5) = 99
       A(10) = 99
       CALL SUBBAS(A)
       END
				
The OUTPUT is as follows:

1
2
3
4
99
6
7
8
9
99


Modification Type:MinorLast Reviewed:8/16/2005
Keywords:KB27479