【问题标题】:Command Line C program to Swift命令行 C 程序到 Swift
【发布时间】:2016-03-21 11:25:29
【问题描述】:

我有一个命令行C game 的源代码,它等待用户的stdin,并输出stdout。我想将来自文本字段的输入提供给此C 代码的main,并以文本区域字段中的输出为例。

int mainer(int argc, char **argv) {
    int i;
    int hitme;
    char ch;
    prelim();

    if (argc > 1) { // look for -f option
        if (strcmp(argv[1], "-f")== 0) {
            coordfixed = 1;
            argc--;
            argv++;
        }
    }


    if (argc > 1) {
        fromcommandline = 1;
        line[0] = '\0';
        while (--argc > 0) {
            strcat(line, *(++argv));
            strcat(line, " ");
        }
    }
    else fromcommandline = 0;
 // some other code

}

从示例here 中,我应该执行以下操作:

let args = [" ", "regular", "short", ""]

var cargs = args.map { strdup($0) }
let result = mainer(Int32(args.count), &cargs)
for ptr in cargs { free(ptr) }

我怎样才能调用main function,让它保持活力并不断给它参数以使其充当command line

【问题讨论】:

    标签: ios c swift command-line-interface


    【解决方案1】:

    我将使用 TextArea 和 TextField 设置您的应用程序,并提供 printf 和 scanf 的替代方法,它们可以将文本添加到文本区域或从文本字段获取发送的文本(可能使用“Enter”UIButton)。然后你可以编译 C 代码并从 Swift 中调用它。 Objective C 实际上是隐藏的 C 方式,所以你应该能够让它运行,只需稍作改动。

    为了让代码运行,您可能必须让该代码在它自己的线程中运行,并跳过一些环节以使这些调用正常运行,但这应该是可行的。

    【讨论】:

      【解决方案2】:

      不要在您的进程中调用该函数。

      相反,将您的命令行游戏作为一个单独的进程执行,以便您可以将它的标准输入/标准输出连接到管道。 然后,您可以将文本字段的内容发送到一个管道并从另一个管道读回结果。

      看看例如http://practicalswift.com/2014/06/25/how-to-execute-shell-commands-from-swift/.

      【讨论】:

      • 我无法编译代码,因为应用商店不允许编译程序
      • 是的,但我不能在项目中包含可执行文件。
      • 那么您有两个选择: 1. 将 C 部分链接到您的程序中并在它自己的进程中执行它(fork,设置管道,然后在子进程中调用您的例程)。我认为这不适用于iOS。 2. 重构 C 部分,让你得到一个函数,接受一个输入字符串并返回一个输出字符串。
      • Ahmed,您提交到商店的所有内容都必须经过编译。这里的问题是您无法在 Xcode 项目中编译/构建应用程序。正如 Tali 指出的那样,您可以调用 shell 脚本来从命令行获取输入。您还可以将您的 C 代码作为从主应用程序调用的库包含在内,但这更加困难。
      • 它已经在工作,但我的主要问题是让它等待参数。
      【解决方案3】:

      我认为这不是做这件事的正确地方。 main 的目的本质上是启动应用程序,然后将控制权传递给 Application Delegate 并从那里继续。来自 Apple 的文档:“除了少数例外,您永远不应该更改 Xcode 提供的 main 函数的实现。” https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html

      还有其他方法可以将 C 与 Objective-C 混合使用。如果您需要调用 C,最好的位置可能是需要此数据的视图。这些链接可能会有所帮助:Mixing C functions in an Objective-C class,

      【讨论】:

      • 我不是要替换 main,这是在 main 应用程序中,我只是将其称为 main 只是为了推荐目的..
      猜你喜欢
      • 1970-01-01
      • 2015-05-28
      • 2012-01-03
      • 1970-01-01
      • 2018-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多