Эквивалент ним argv - PullRequest
       14

Эквивалент ним argv

1 голос
/ 12 апреля 2019

Я связываю утилиту C с Nim.Функция C util main ожидает argc и argv .Я могу получить argc из paramCount, но как мне получить C-совместимый список аргументов для argv?

int main (int argc, char **argv);
proc main*(argc: cint; argv: cstringArray): cint

Ответы [ 2 ]

3 голосов
/ 13 апреля 2019

Помимо paramCount() есть функция paramStr(), которая фактически получает строки аргумента.

Если ваша программа на С:

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 голосов
/ 12 апреля 2019

У вас есть переменная seq of strings:

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

И вы выделяете ее перед отправкой в ​​функцию C:

var cdata: cstringArray = data.allocCStringArray()
main(5, cdata)
cdata.deallocCStringArray()
...