2013-10-05 50 views
1

有沒有辦法讓代碼每次運行時自行修改?通過這個我的意思是增加新的功能和修改現有的功能。例如,如果我有一個運行特定函數的c程序來檢查文件是否存在,我可以修改程序,使得在運行期間我可以打開另一個文件並永久存儲這個新程序。c中的自我修改代碼

實施例:

void eng_run() 
{ 

    int itr = 0; 
    int itr2 = 0; 
    int check = 0; 
    int conf = 0; 
    char arg1[10]; 
    char arg2[10]; 
    while(act_arg[itr] != NULL) 
    { 
     if((strcmp(act_arg[itr],"what") == 0) || (strcmp(act_arg[itr],"how") == 0) || (strcmp(act_arg[itr],"whats") == 0)) 
     { 
      for(itr2 = itr + 1; act_arg[itr2] != NULL ; itr2++) 
      { 
       if((strcmp(act_arg[itr2],"list") == 0) || (strcmp(act_arg[itr2],"ls") == 0)) 
       { 
        printf("\E[32mThe \"ls\" system call lists out all the files in the current directory. \n\E[0m"); 
        conf++; 
       } 
} 
} 
     else if((strcmp(act_arg[itr],"list") == 0) && conf == 0) 
     { 
      bzero(act_arg,100); 
      act_arg[0] = (char *)malloc(sizeof(char) * 100); 
      strcat(act_arg[0],"ls"); 
      check++; 
     } 
} 
} 

在上面的函數act_arg具有預先解析的命令lline參數。現在這個功能可以回答如下問題:

列表是幹什麼的? (或) 列表中的所有文件

現在我希望它通過添加類似的方式來處理CP command.Meaning它接受執行過程中修改本身,如果使用它想:

是什麼做的cp ? (或) 將fileone複製到filetwo

使用copy作爲關鍵字。

+3

不,沒有可行的方法來做到這一點。如果您希望程序更改其默認參數,則應將其存儲在配置文件中,並在更改時更新它們。如果它應該「學習」,它應該實現某種解釋器,並將新知識存儲在它處理的腳本文件中。 – Barmar

+0

你也可以將這樣的東西存儲在數據庫中。 – Barmar

+0

您不需要自我修改代碼。您的問題是關於如何將代碼更改爲數據,即理解的命令列表不應該被硬編碼,而是從數據結構中讀取,而數據結構可以在運行時修改。 –

回答

1

您可以實現可擴展的命令列表,而無需進入自修改代碼。最簡單的方法是將擴展插入程序啓動時讀入的數據文件中。用戶輸入時,程序可以在數據文件的末尾附加新條目。