10-21-2005 06:18 PM
typedef struct {
long dimSizes[2];
LStrHandle String[1];
} TD1;
typedef TD1 **TD1Hdl;
long __cdecl TestVI(char serialNumber[], TD1Hdl *formattedMeasurements, char ErrorDescription[], long len);
The "TestVI" VI generates a 2D array of strings. The cell contents and number of rows are random to
simulate different measurement names and measurements.class CArgoTestsLabVIEW
{
public:
CArgoTestsLabVIEW();
virtual ~CArgoTestsLabVIEW();
// test modules called from parent DLL
BOOL GetResult_LV(CString resultName, double *result);
long TestVI_LV(CString serialNumber);
private:
TD1Hdl m_LVStringArray;
CMapStringToString m_resultMap;
InitMeasurementsArray();
PopulateResultMap();
}
long CArgoTestsLabVIEW::TestVI_LV(CString serialNumber)
{
long rc = 0;
char errStr[BUFFERLEN];
strcpy(errStr,"");
rc = InitMeasurementsArray();
if (rc == 0) {
rc = TestVI(serialNumber.GetBuffer(serialNumber.GetLength()), &m_LVStringArray, errStr, BUFFERLEN);
PopulateResultMap();
}
return rc;
}
The accessor functions InitMeasurementsArray and PopulateResultMap are:long CArgoTestsLabVIEW::InitMeasurementsArray()
{
MgErr err;
if (m_LVStringArray)
{
DSDisposeHandle(m_LVStringArray);
}
m_LVStringArray = (TD1Hdl)DSNewHandle(sizeof(TD1));
// code to check for NULL
// Set number of strings in array to 0
(*m_LVStringArray)->dimSizes[0] = 0;
(*m_LVStringArray)->dimSizes[1] = 0;
// Set total size of array structure. For now it is only as big as the long variable.
err = DSSetHandleSize((UHandle)m_LVStringArray, sizeof(long));
// code to check for error
return 0;
}
void CArgoTestsLabVIEW::PopulateResultMap()
{
int numberOfResults;
int i;
int charCnt;
numberOfResults = (*m_LVStringArray)->dimSizes[0];
if (numberOfResults == 0) {
return;
}
m_resultMap.RemoveAll();
for (i = 0; i < numberOfResults; i++) {
charCnt = (*((*m_LVStringArray)->String[i * 2]))->cnt;
(*((*m_LVStringArray)->String[i * 2]))->str[charCnt] = '\0';
charCnt = (*((*m_LVStringArray)->String[i * 2 + 1]))->cnt;
(*((*m_LVStringArray)->String[i * 2 + 1]))->str[charCnt] = '\0';
m_resultMap.SetAt((LPCTSTR) (*((*m_LVStringArray)->String[i * 2]))->str, (LPCTSTR) (*((*m_LVStringArray)->String[i * 2 + 1]))->str);
}
}
The problem I have is that I eventually get an access violation from
the run-time engine if I try to call the test VI in a loop. I'm
obviously having a memory management problem, but it escapes me as to
where the problem is. Anybody have any ideas?
03-03-2006 01:56 AM - edited 03-03-2006 01:56 AM
smercurio_fc wrote:
The problem I have is that I eventually get an access violation from the run-time engine if I try to call the test VI in a loop. I'm obviously having a memory management problem, but it escapes me as to where the problem is. Anybody have any ideas?
...(*((*m_LVStringArray)->String[i * 2]))->str[charCnt] = '\0';
Message Edited by Dynamik on 03-03-2006 02:03 AM