将字符串数组作为输入输入到外部C函数中

问题描述 投票:1回答:2

我想将String向量传递给外部C函数。

在最小的示例中,我只想通过C函数传递String向量(或1D数组)。

我的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;

我的功能看起来像:

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";

是否有可能在外部C函数中处理Modelica输入String向量?

提前感谢!

modelica
2个回答
4
投票

这里是short, self-contained and compilable example,展示了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
投票

是,这是Modelica规范支持的,请参见https://specification.modelica.org/v3.4/Ch12.html#argument-type-mapping

© www.soinside.com 2019 - 2024. All rights reserved.