Программа командной строки C для Swift
У меня есть исходный код командной строки 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
}
Из примера здесь, я должен сделать следующее:
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
.
Ответы
Ответ 1
Я бы установил ваше приложение с TextArea и TextField и предоставил альтернативы printf и scanf, которые либо добавляют текст в текстовую область, либо отправляют текст из текстового поля (возможно, с помощью "Enter" UIButton). Затем вы можете скомпилировать код C и вызвать его из Swift. Объект C на самом деле C под крышками, поэтому вы должны иметь возможность запускать это с небольшим изменением.
Чтобы получить код для запуска, вам, вероятно, придется сделать этот код запущенным в нем собственным потоком и проскочить через некоторые обручи, чтобы заставить эти вызовы правильно вести себя, но это должно быть выполнимо.
Ответ 2
Я не думаю, что это подходящее место для этого. Основной целью является, по сути, запуск приложения, а затем контроль доступа к делегату приложения и оттуда оттуда. Из документации яблок: "За некоторыми исключениями вы никогда не должны изменять реализацию основной функции, предоставляемой Xcode". https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html
Есть другие способы смешивания C с Objective-C. Если вам нужно позвонить в C, лучшим местом, скорее всего, будет просмотр, где эти данные необходимы. Эти ссылки могут помочь: Смешивание функций C в классе Objective-C,
Ответ 3
Не вызывайте эту функцию в своем процессе.
Вместо этого выполните свою командную строку как отдельный процесс, чтобы вы могли подключить stdin/stdout к трубам.
Затем вы можете отправить содержимое текстового поля в один канал и прочитать результат от другого.
Посмотрите, например. http://practicalswift.com/2014/06/25/how-to-execute-shell-commands-from-swift/.