Передать массив String в качестве входных данных во внешнюю функцию C - PullRequest
1 голос
/ 21 октября 2019

Я хотел бы передать вектор String во внешнюю функцию C.

В минимальном примере я просто хочу передать векторы String (или массив 1D) через функцию C.

Моя функция Modelica выглядит следующим образом:

function testreadstri
 input String instri[2];
 output String outstri[2];
 external "C" test_stri(instri,, size(instri, 1), outstri);
 annotation (Include="#include <ebcmysql.cpp>", Library="libmysql");
end testreadstri;

Моя функция C выглядит следующим образом:

void test_stri(const char* thestring, size_t nLines, const char **testresult)
{
    //bout = 12.3;

    size_t iLines;
    //size_t nLines;

    iLines = 0;
    //nLines = 1;

    while ( iLines <= nLines ) {

        <LINE_OF_INTEREST>
        iLines++;
    }
}

Я пытался набрать <LINE_OF_INTEREST> следующие строки:

  • testresult[iLines] = thestring[iLines];
  • strcpy(testresult[iLines], thestring[iLines]);

То, что работает, но, конечно, не передает входные данные в качестве вывода, это:

  • testresult[iLines] = "aTestString";

Есть ли возможность обрабатывать входные строковые векторы Modelica во внешней функции C?

Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 22 октября 2019

Вот короткий, автономный и компилируемый пример , демонстрирующий обработку входной и выходной строк чисто внешней функции в Modelica

model Model
  function testreadstri
    input String instri[2];
    output String outstri[2];
    external "C" test_stri(instri, size(instri, 1), outstri, size(outstri, 1));
    annotation(Include="
#include \"ModelicaUtilities.h\"
#include <stdlib.h>
#include <string.h>

void test_stri(const char** thestring, size_t nLinesIn, const char** testresult, size_t nLinesOut)
{
  size_t iLines;

  // example for input string handling
  for (iLines = 0; iLines < nLinesIn; iLines++) {
    ModelicaFormatMessage(\"%s\\n\", thestring[iLines]);
  }

  // example for output string handling
  for (iLines = 0; iLines < nLinesOut; iLines++) {
    char* line = ModelicaAllocateStringWithErrorReturn(6);
    if (line != NULL) {
      strcpy(line, \"result\");
      testresult[iLines] = line;
    }
  }
}");
  end testreadstri;
  String s[:] = testreadstri({"first", "second"});
end Model;
2 голосов
/ 21 октября 2019

Да, это поддерживается спецификацией Modelica, см. https://specification.modelica.org/v3.4/Ch12.html#argument-type-mapping.

...