2015-12-15 13 views
15

Ho codice sorgente di una riga di comando C game, che attende l'utente stdin e le uscite stdout. Voglio dare l'input da un campo di testo a main di questo codice C e prendere l'output in un campo di area di testo, ad esempio.Command Line C programma a Swift

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 

} 

Dall'esempio here, dovrei effettuare le seguenti operazioni:

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

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

Come potrei chiamare la main function, e tenerlo in vita e continuare a dare ad esso argomenti per farlo agire come command line.

risposta

0

Non penso che questo sia il posto giusto per farlo. Lo scopo principale è essenzialmente avviare l'app e quindi controllare i passaggi a Delegato applicazione e procede da lì. Dalla documentazione Apple: "Con poche eccezioni, non dovresti mai cambiare l'implementazione della funzione principale fornita da Xcode." https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html

Esistono altri modi per combinare C con Objective-C. Se è necessario chiamare C, la posizione migliore è probabilmente la vista in cui sono necessari questi dati. Questi collegamenti possono aiutare: Mixing C functions in an Objective-C class,

+0

Non sto provando a sostituire il main, questo è nell'app principale, lo sto solo chiamando principale solo per scopi di riferimento .. – MasterWizard

0

Non chiamare questa funzione nel processo.

Invece, esegui il tuo gioco da riga di comando come un processo separato in modo che tu possa connettere lo stdin/stdout alle pipe. Quindi è possibile inviare il contenuto del campo di testo in una pipe e rileggere il risultato dall'altra.

Dai un'occhiata ad es. http://practicalswift.com/2014/06/25/how-to-execute-shell-commands-from-swift/.

+0

Non riesco a compilare il codice perché l'app store non consente di compilare programmi – MasterWizard

+0

Beh, devi comunque compilarlo, giusto? – Tali

+0

Ya ma non riesco a includere un eseguibile nel progetto. – MasterWizard

2

Vorrei configurare la tua app con TextArea e TextField e fornire alternative a printf e scanf che aggiungono testo all'area di testo o che inviano testo dal campo di testo (magari con un UIButton "Invio"). Quindi puoi compilare il codice C e chiamarlo da Swift. L'obiettivo C è in realtà C sotto le coperte, quindi dovresti essere in grado di farlo funzionare solo con una piccola modifica.

Per far sì che il codice venga eseguito, è necessario eseguire questo codice nella propria thread e passare attraverso alcuni loop per ottenere il corretto funzionamento di tali chiamate, ma dovrebbe essere fattibile.