GDL
About building parametric objects with GDL.

How set to a text array??

Anonymous
Not applicable
I create a text-type array in GDL-object, I use it in source,but I found that I can‘t add text-type’s value to the text-type array。

EX Source:

char cTmp[256];
GSHandle handle = params.value.array;

BMKillHandle((GSHandle *) &handle);
handle = BMAllocateHandle(sizeof(GS::uchar_t) * 256, ALLOCATE_CLEAR, NULL );

GS::uchar_t*  pRealValue = (GS::uchar_t *)*handle;

sprintf(cTmp,"HANDRAIL_%d",1);
GS::UniString tmp1("1");
GS::ucscpy(pRealValue, tmp1.ToUStr());
Who can help me?
Whatever the result,thank you for you advice!
1 REPLY 1
Akos Somorjai
Graphisoft
Graphisoft
QBai wrote:
I create a text-type array in GDL-object, I use it in source,but I found that I can‘t add text-type’s value to the text-type array。

EX Source:

char cTmp[256];
GSHandle handle = params.value.array;

BMKillHandle((GSHandle *) &handle);
handle = BMAllocateHandle(sizeof(GS::uchar_t) * 256, ALLOCATE_CLEAR, NULL );

GS::uchar_t*  pRealValue = (GS::uchar_t *)*handle;

sprintf(cTmp,"HANDRAIL_%d",1);
GS::UniString tmp1("1");
GS::ucscpy(pRealValue, tmp1.ToUStr());
Who can help me?
Whatever the result,thank you for you advice!
Hi,

Here's a sample code from the AC18 Element_Modify.cpp file; it may point you to the right direction:

bool ChangeArrayParam (API_ElementMemo		*inMemo, 		// memo of the given library part element
                       const char			*paramName,
					   Int32 				inDim1,			// the new first dimension
					   Int32 				inDim2,			// the new second dimension
					   const GS::uchar_t	*inParVal,		// the new value
					   Int32 				inIndex1,		// first index of the new value
					   Int32 				inIndex2)		// second index of the new value
{
	Int32 n = BMGetHandleSize ((GSHandle) inMemo->params) / sizeof (API_AddParType);

	if (inIndex1 >= inDim1 || inIndex2 >= inDim2 || inIndex1 < 0 || inIndex2 < 0 || inParVal == NULL)
		return false;
	// Bad parameters

	// searching for an array parameter
	for (Int32 i = 0; i < n; i++) {
		// check if it's an array parameter and the array contains strings
		if ((*inMemo->params).typeMod == API_ParArray &&
				((*inMemo->params).typeID == APIParT_CString || (*inMemo->params).typeID == APIParT_Title) &&
				CHCompareASCII ((*inMemo->params).name, paramName) == 0)
		{
			GS::uchar_t **origArrHdl = (GS::uchar_t **) (*inMemo->params).value.array;
			Int32 origDim1 = (*inMemo->params).dim1;
			Int32 origDim2 = (*inMemo->params).dim2;

			// calculating new size of the array
			Int32 newSize = 0;
			Int32 lastPos = 0;
			for (Int32 j = 0; j < inDim1; j++) {
				for (Int32 k = 0; k < inDim2; k++) {
					Int32 size = 1;
					// 1 for the closing '\0' character
					if (j < origDim1 && k < origDim2) {
						size += GS::ucslen32 (&(*origArrHdl)[lastPos]);
						lastPos += size;
					}
					if (j == inIndex1 && k == inIndex2 && inParVal != NULL)
						newSize += GS::ucslen32 (inParVal) + 1;
					else
						newSize += size;
				}
			}

			GS::uchar_t **newArrHdl = (GS::uchar_t **) BMAllocateHandle (newSize * sizeof (GS::uchar_t), ALLOCATE_CLEAR, 0);

			// changing array size if needed:
			if (origDim1 != inDim1 || origDim2 != inDim2) {
				(*inMemo->params).dim1 = inDim1;
				(*inMemo->params).dim2 = inDim2;
			}

			// changing array content:
			Int32 lastPosO = 0;
			Int32 lastPosN = 0;
			for (Int32 j = 0; j < inDim1; j++) {
				for (Int32 k = 0; k < inDim2; k++) {
					if (j == inIndex1 && k == inIndex2 && inParVal != NULL) {
						GS::ucscpy (&(*newArrHdl)[lastPosN], inParVal);
						lastPosN += GS::ucslen32 (&(*newArrHdl)[lastPosN]) + 1;
						continue;
					}
					if (j < origDim1 && k < origDim2) {
						GS::ucscpy (&(*newArrHdl)[lastPosN], &(*origArrHdl)[lastPosO]);
						lastPosO += GS::ucslen32 (&(*origArrHdl)[lastPosO]) + 1;
						lastPosN += GS::ucslen32 (&(*newArrHdl)[lastPosN]) + 1;
					} else {
						GS::ucscpy (&(*newArrHdl)[lastPosN], L("\0"));
						// '\0' character for the empty items
						lastPosN += GS::ucslen32 (&(*newArrHdl)[lastPosN]) + 1;
					}
				}
			}

			// kill original array handle and change it to the new
			BMKillHandle ((GSHandle *) &origArrHdl);
			(*inMemo->params).value.array = (GSHandle) newArrHdl;

			return true;
		}
	}

	return false;

}		// ChangeArrayParam
Regards, Akos