3.83 DM_ValueReturn

Diese Funktion dient zur sicheren Funktionsrückgabe von lokalen DM_Value-Werten an den Aufrufer. Bei Verwendung von lokalen Variablen und Strukturen in einer C-Funktion sind diese nach der Rückgabe ungültig. Mit dieser Funktion kann problemlos und sicher eine lokale DM_Value-Variable zurückgegeben werden.

Zu diesem Zweck wird, wenn nötig, eine temporäre Kopie des zurückzugebenden Wertes angelegt (z.B. der darin liegende String kopiert). Ein Kopieren findet für gemanagte Wertereferenzen nicht statt. Insofern sollte der zurückgegebene DM_Value-Pointer dann mit return an den Aufrufer weitergegeben werden.

DM_Value* DML_default DM_EXPORT DM_ValueReturn
(
  DM_Value   *value,
  DM_Options  options
)

Parameter

-> DM_Value* value

Dieser Parameter verweist auf die Wertereferenz welche zurückgegeben werden soll. Es kann sich dabei um eine gemanagte Wertereferenz handeln, muss aber nicht.

-> DM_Options options

Hier sind keine Optionen erforderlich, ist mit 0 zu belegen.

Rückgabewert

Zurückgegeben wird ein Zeiger auf eine gültige DM_Value-Struktur oder NULL im Fehlerfall. Ein Fehler kann z.B. vorliegen, wenn die Funktion im falschen runstate aufgerufen wird, der gemanagte String ungültig ist oder das Kopieren nicht ausgeführt werden konnte.

Zu beachten

Für die Rückgabe von output-Parametern können die Funktionen DM_ValueInit und DM_ValueChange verwendet werden.

Beispiel

Dialogdatei

dialog YourDialog
function anyvalue StringOf(integer I);

on dialog start
{
  print StringOf(123);
  print StringOf(-42);
  exit();
}

C-Teil

...

DM_Value * DML_default DM_ENTRY StringOf(DM_Integer I)
{
  char     buf[10];
  DM_Value data;
  DM_Value negative;

  if (I>=0)
  {
    /* return an unmanaged value */
    sprintf(buf, "%d", (int)I);
    data.type = DT_string;
    data.value.string = buf;
    /* wrong: return &data => data is a local structure! */
    return DM_ValueReturn(&data, 0);
  }
  else
  {
    /* return a managed value */
    DM_ValueInit(&negative, DT_string, NULL, 0);  /* can be omitted */
    data.type = DT_string;
    data.value.string = "!!negative!!";
    DM_ValueChange(&negative, NULL, &data, 0);
    /* return &negative; => possible but generates compiler warning! */
    return DM_ValueReturn(&negative);
  }
}

Verfügbarkeit

Ab IDM-Version A.06.01.a

Siehe auch

Funktionen DM_ValueChange, DM_ValueCount, DM_ValueGet, DM_ValueIndex

Methode :index()

Eingebaute Funktionen countof(), itemcount()