Nim argv相当于

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

我正在将一个C实用程序与Nim连接起来。 C util main函数需要argc和argv。我可以从paramCount获得argc但是如何获得argv的C兼容arg列表?

int main (int argc, char **argv);
proc main*(argc: cint; argv: cstringArray): cint
arguments nim
2个回答
3
投票

除了paramCount()之外,还有函数paramStr(),它实际上获得了参数字符串。

如果您的C程序是:

int cmain(int argc, char **argv)
{ 
  int x;
  for (x=0; x < argc; x++)
    printf("%d: %s\n", x, argv[x]);
}

然后你的Nim程序test.nim,需要将重复的paramStr()调用返回的值转换为兼容的char **

{.compile: "cmain.c".}
proc cmain(c: cint, a: cstringArray): cint {.importc.}

import os

var nargv =  newSeq[string](paramCount())
var x = 0
while x < paramCount():
   nargv[x] = paramStr(x+1)  # first is program name
   x += 1

var argv: cStringArray = nargv.allocCStringArray()
discard cmain(cint(paramCount()), argv)
argv.deallocCStringArray()

然后运行nim c -r test.nim def ghi给出:

0: def
1: ghi

(使用compile编译指示,您不需要从C文件中创建共享对象,并链接到该文件,但当然这也是可能的)


3
投票

你有你的seq字符串变量:

var data: seq[string] = @["A", "B", "C", "D"]

然后在将其发送到C函数之前分配它:

var cdata: cstringArray = data.allocCStringArray()
main(5, cdata)
cdata.deallocCStringArray()
© www.soinside.com 2019 - 2024. All rights reserved.