3.82 DM_ValueInit
Mit dieser Funktion kann eine Wertereferenz in eine vom IDM gemanagte lokale oder globale Wertereferenz umgewandelt werden. Dadurch ist die weitere Manipulation des Wertes durch DM_Value…()-Funktionen möglich sowie die Rückgabe als Parameter bzw. Rückgabewert.
Die Wertereferenz wird mit dem entsprechenden Typ initialisiert. Erlaubt sind auch die Sammlungsdatentypen DT_list, DT_vector, DT_hash, DT_matrix und DT_refvec.
Wird die Wertereferenz über die Option DMF_StaticValue als statisch bzw. global initialisiert, so ist ein Zugriff auch außerhalb des Funktionsaufrufs möglich. Eine Freigabe von Wertelisten und Strings findet beim Funktionsende nicht statt. Nicht erlaubt ist die Initialisierung von Argumenten zu einer statischen bzw. globalen gemanagten Wertereferenz.
Initialisiert werden String-Werte mit dem NULL-Pointer. Sammlungen werden ohne Elementwerte angelegt. Auch alle anderen Wertetypen werden zu einem 0-Wert initialisiert.
Das Hinzufügen oder Ändern von Werten oder Teilwerten bzw. Elementen kann über die Funktion DM_ValueChange geschehen. Eine Reinitialisierung über DM_ValueInit() ist ebenfalls möglich.
DM_Boolean DML_default DM_EXPORT DM_ValueInit
(
DM_Value *value,
DM_Type type,
DM_Value *count,
DM_Options options
)
Parameter
-> DM_Value *value
Dieses ist die Wertereferenz, welche initialisiert werden soll.
-> DM_Type type
Dieser Parameter bezeichnet den geforderten initialen Typ.
-> DM_Value *count
In diesem Parameter kann die initiale Größe von Sammlungen wie list oder matrix angegeben werden oder der zugehörige Wertetyp bei vector-Werten.
-> DM_Options options
Option |
Bedeutung |
---|---|
0 |
Wertereferenz wird als lokaler Wert initialisiert. |
DMF_StaticValue |
Wertereferenz wird als globaler, statischer Wert initialisiert. |
Rückgabewert
DM_TRUE |
Funktion konnte erfolgreich ausgeführt werden, die Wertereferenz ist damit initialisiert. |
DM_FALSE |
Wertereferenz konnte nicht initialisiert werden. |
Beispiel
dialog Dialog function void AppendToList(anyvalue List input output, anyvalue Value); function anyvalue FindMinMax(anyvalue IntegerList); function string ListToString(anyvalue List); function void SetElemSep(string Sep); on dialog start { variable vector[string] WeekDays:=["Mo","Tu","Wed","Thu","Fri","Sat"]; variable list DaysPerWeek := [31,30,28,27]; SetElemSep(" , "); AppendToList(WeekDays,"Sun"); print ListToString(WeekDays); print FindMinMax(DaysPerWeek); exit(); }
... static DM_String elemSep = NULL; void DML_default DM_ENTRY SetElemSep(DM_String sep) { DM_StringInit(&elemSep, DMF_StaticValue); DM_StringChange(&elemSep, sep, 0); } DM_Value* DML_default DM_ENTRY FindMinMax(DM_Value *IntegerList) { DM_Value subval, minMaxList; /* managed local values */ DM_UInt count; DM_UInt minValueCount=0, maxValueCount=0; DM_Value index, mindex, data; /* unmanaged values */ /* initialize local managed values */ DM_ValueInit(&subval, DT_void, NULL, 0); DM_ValueInit(&minMaxList, DT_list, NULL, 0); /* determine the itemcount of the list */ count = DM_ValueCount(IntegerList, NULL, 0); index.type = DT_integer; index.value.integer = 1; while(count>0) { /* loop through the index 1,2,3,... */ if (DM_ValueGet(IntegerList, &index, &subval, 0) && subval.type == DT_integer) { if (minValueCount==0 || subval.value.integer<minValue) { minValueCount++; /* store maximum value at [1] in minMaxList */ mindex.type = DT_integer; mindex.value.integer = 1; DM_ValueChange(&minMaxList, &mindex, &subval, 0); } if (maxValueCount==0 || subval.value.integer>maxValue) { maxValueCount++; /* store maximum value at [2] in minMaxList */ mindex.type = DT_integer; mindex.value.integer = 2; DM_ValueChange(&minMaxList, &mindex, &subval, 0); } } count--; index.value.integer++; } /* return the minMaxList (without compiler warnings) */ return DM_ValueReturn(&minMaxList, 0); } ... void DML_default DM_ENTRY AppendToList(DM_Value *List, DM_Value *Value) { DM_Value newList; /* demonstrate the returning of a list-value by two ways * / if (List->type == DT_list || List->type == DT_vector) { /* 1) returning a manipulated argument (auto-management) */ DM_ValueChange(List, NULL, Value, DMF_AppendValue); } else { /* 2) creation of a managed local list-value */ DM_ValueInit(&newList, DT_list, NULL, 0); DM_ValueChange(&newList, NULL, List, DMF_AppendValue); DM_ValueChange(&newList, NULL, Value, DMF_AppendValue); *List = newList; } } DM_String DML_default DM_ENTRY ListToString(DM_Value *List) { DM_Value index; DM_Value value; DM_UInt count; DM_String retString; /* initialize the managed values */ DM_ValueInit(&index, DT_void, NULL, 0); DM_ValueInit(&value, DT_void, NULL, 0); DM_StringInit(&retString, 0); count = DM_ValueCount(List, NULL, 0); while(count>0) { if (DM_ValueIndex(List, count--, &index, 0) && DM_ValueGet(List, &index, &value, 0) && value.type == DT_string) { DM_StringChange(&retString, value.value.string, DMF_AppendValue); if (count>0) DM_StringChange(&retString, elemSep, DMF_AppendValue); } } return DM_StringReturn(retString, 0); }
Verfügbarkeit