CAPL ассоциативный массив со строковыми типами - PullRequest
0 голосов
/ 06 ноября 2018

После этой бумаги я пытаюсь создать ассоциативный массив, подобный этому:

variables
{
  char[30] translate[ char[] ];
} 

Это точно такой же пример в статье. Проблема возникает, когда я пытаюсь поместить значения в этот ассоциативный массив. Например:

on preStart
{
  translate["hello"] = "hola";
}

Это дает мне ошибку компиляции: «Ошибка 1112 в (89,23): типы операндов несовместимы »

Что я делаю не так?

ВЕРСИИ: я использую Vector CAPL Browser , включенный в CANalyzer версии 11.0 SP2

1 Ответ

0 голосов
/ 17 марта 2019

С ассоциативными полями (так называемыми картами) вы можете выполнять присваивание значений 1: 1 другим значениям, не используя излишнюю память. Элементами ассоциативного поля являются пары ключ-значение, благодаря чему имеется быстрый доступ к значению через ключ.

Ассоциативное поле объявляется аналогично обычному полю, но тип данных ключа записывается в квадратных скобках:

int m[float];         // maps floats to ints
float x[int64];       // maps int64s to floats
char[30] s[ char[] ]  // maps strings (of unspecified length) to strings of length < 30

Если указан тип ключа char [] , все символьные поля (любого размера) могут использоваться в качестве значений ключа. В итерации переменная цикла также должна быть объявлена ​​как char [] . Ключевые сравнения, например чтобы определить последовательность итераций, затем выполняются сравнения строк символов, при этом не используются алгоритмы, специфичные для страны.

char [] - единственный тип поля, который может использоваться в качестве типа ключа. Помните, что вы не можете объявлять переменные или параметры типа char [] , за исключением переменных цикла в итерации.

Связь между строками:

char[30] namen[char []];
strncpy(namen["Max"], "Mustermann", 30); 
strncpy(namen["Vector"], "Informatik", 30);

for (char[] mykey : namen)
{
  write("%s is mapped to %s", mykey, namen[mykey]);
}
...