Modelica внешние функции: C против C99 - PullRequest
4 голосов
/ 20 октября 2011

В Modelica можно определять внешние функции.Глава 12.9 спецификации говорит, что C и Fortran77 поддерживаются,C ++ и Fortran90 могут быть поддержаны в будущем.Теперь мне интересно, какие версии C поддерживаются?

В частности, мне нужна функция логарифмической гаммы, которая доступна в C99, поэтому я попробовал следующее:

function lgamma "logarithmic gamma function"
  input Real u;
  output Real y;
external "C" y = lgamma(u);
end lgamma;

но это не работает, в то время как Powf работает:

function powf "power function a^b"
  input Real a;
  input Real b;
  output Real y;
external "C" y = powf(a,b);
end powf;

Это, вероятно, происходит потому, что Powf доступен в C, в то время как lgamma была введена в C99.Но это ограничение Modelica, Dymola или моего компилятора?Есть ли способ заставить работать внешние функции C99?В списке математических операций C на Википедии есть еще несколько интересных функций, таких как функции ошибок erf и erfc, их тоже было бы неплохо иметь.

1 Ответ

4 голосов
/ 21 октября 2011

Вы можете только предполагать, что код C89 / 90 компилируется в компиляторе Modelica.Хотя это в основном касается синтаксиса (если вы используете Include аннотации или Library="file.c").

Доступные функции в основном зависят от библиотеки C, на которую ссылается ваш компилятор.Я предполагаю, что библиотека C Microsoft не содержит lgamma, поэтому она не может быть связана с.В Linux / OpenModelica пример lgamma работает, так как libm содержит функцию (она компилируется с использованием режима c90, но неявно добавляет объявление double lgamma(double)).

Пример powf также компилируется,но он не работает правильно, так как ваша декларация external "C" гласит, что она использует числа с плавающей запятой двойной точности (и вы не можете изменить это с Modelica 3.2).powf будет читать половину a и использовать его в качестве первого аргумента, затем читать вторую половину a и использовать его в качестве второго аргумента.б будет отброшен.Если вы установите флаги компилятора на std=c99, будет обнаружена ошибка:

powf.h: 23: 15: ошибка: конфликтующие типы для 'powf'

Обратите внимание, что если вы используете Dymola в Windows, вы, скорее всего, используете Visual Studio.В этом случае поддержка C99 отсутствует, кроме частей, скопированных из C ++.

...