我有命令行C game
的源代码,等待用户的stdin
,并输出stdout
。我想将文本字段中的输入提供给此main
代码的C
,并将输出作为文本区域字段。例如。
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
。
答案 0 :(得分:2)
我会使用TextArea和TextField设置您的应用程序,并提供printf和scanf的替代方法,可以将文本添加到文本区域或从文本字段中获取已发送的文本(可能使用“Enter”UIButton)。然后你可以编译C代码并从Swift中调用它。 Objective C实际上是C方式,所以你应该能够通过一点改动来运行它。
为了让代码运行,你可能不得不让这个代码在它自己的线程中运行,并跳过一些箍来让这些调用正常运行,但它应该是可行的。
答案 1 :(得分:0)
我认为这不是正确的做法。 main的目的是基本上启动应用程序,然后控制传递给Application Delegate并从那里继续。从Apple的文档:“除了少数例外,你永远不应该改变Xcode提供的主要功能的实现。”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,
答案 2 :(得分:0)
请勿在您的过程中调用该功能。
相反,将您的命令行游戏作为一个单独的进程执行,以便您可以将它的stdin / stdout连接到管道。 然后,您可以将文本字段的内容发送到一个管道中,并从另一个管道读回结果。
看看例如http://practicalswift.com/2014/06/25/how-to-execute-shell-commands-from-swift/