How To Pass an Array by Reference to LCK and Return Changes (216055)



The information in this article applies to:

  • Microsoft Visual FoxPro for Windows 3.0b
  • Microsoft Visual FoxPro for Windows 5.0a
  • Microsoft Visual FoxPro for Windows 6.0

This article was previously published under Q216055

SUMMARY

This article demonstrates how to pass an array of real numbers to a FoxPro Library Construction Kit (LCK) routine in Visual C, manipulate the array in the LCK routine, and return the changed array to Visual FoxPro.

MORE INFORMATION

Create a Visual FoxPro FLL in Visual C++ using the following C code:

#include <windows.h>
#include <pro_ext.h>

void FAR ByRef_array(ParamBlk FAR *parm)
{
   int     start;         /* Starting value of Loop. */ 
   Value   val;           /* Create Value structure. */ 
   Locator loc;           /* Create Locator structure. */ 

   start=0;
   loc = parm->p[0].loc;  /* Store the contents of the FoxPro array
                                  in the Locator structure. */ 

   /* Get the number of elements from the FoxPro array. */ 

   loc.l_subs = (int)_ALen(parm->p[0].loc.l_NTI, AL_ELEMENTS);

   /* FOR loop to get the array elements. */ 

   for(start=0;start != loc.l_subs ; start ++){
      loc.l_sub1=(start+1);

      /* Store the contents of the FoxPro array in a Value Structure.*/ 
      _Load(&loc,&val);

      /* Copy the contents of the FoxPro array to the function array.*/ 
		
      /* Test array contents and manipulate accordingly */ 
      if (val.ev_type == 'N') 
         {
         if (val.ev_real < 10) 
            val.ev_real = val.ev_real * 1;
         else 
            if (val.ev_real < 20) 
               val.ev_real = val.ev_real * 2;
            else 
               if (val.ev_real < 30)
                  val.ev_real = val.ev_real * 3;
               else val.ev_real = val.ev_real * 4;	
      }
      else
         MessageBox(NULL,"Wrong Data type","Should be a number.",MB_OK);
		
      /* Copy the contents of Locator Structure into Value Structure.*/ 
      _Store(&loc, &val); 	 
		   
   }		
}

   FoxInfo myFoxInfo[]={
      {"ByRef_ARRAY",(FPFI)ByRef_array,1,"R"},
   };

   FoxTable _FoxTable={
      (FoxTable FAR*)0, sizeof(myFoxInfo) / sizeof(FoxInfo), myFoxInfo
   };

				


To test that the array has changed, create a program and enter the following FoxPro code:

CLEAR
cfixed=SET('FIXED')
SET FIXED ON

cdecimal=SET('DECIMALS')
SET DECIMAL TO 4

* Point to the DLL built in Visual C 
SET LIBRARY TO "D:\visual c 6\MyProjects\by_ref\Debug\by_ref.dll"

* Populate array with random values then print to see original values
PUBLIC by_reftest(10)

?"Array before LCK routine..."
FOR i = 1 TO ALEN(by_reftest)
	by_reftest(i)= 60 * RAND()
	?by_reftest(i)
ENDFOR

* Call the LCK function and pass the array by reference
=ByRef_array(@by_reftest)

?"Array after LCK routine..."
FOR i = 1 TO ALEN(by_reftest)
   ?by_reftest(i)
ENDFOR

SET FIXED &cfixed
SET DECIMALS TO &cdecimals
SET LIBRARY TO
				

REFERENCES

For additional information about the FoxPro Library Construction Kit (LCK), please see the following articles in the Microsoft Knowledge Base:

122591 PRB: How to Change Variable Value Passed by Reference in LCK

119636 How to Pass an Array to a Routine in an LCK Library

(c) Microsoft Corporation 1999, All Rights Reserved. Contributions by Dean Christopher, Microsoft Corporation.


Modification Type:MinorLast Reviewed:7/1/2004
Keywords:kbhowto kbXBase KB216055