2015-06-19 48 views
3

我在Vector CANoe中開發了CAPL腳本,我需要定義幾個返回文本字符串的函數。在C語言中,我會寫這樣的事:是否可以定義一個返回文本字符串的CAPL函數?

char * ErrorCodeToMsg(int code) 

char [] ErrorCodeToMsg(int code) 

在CAPL,兩個定義失敗,並parse error。我想出了迄今爲止唯一的工作解決方法是:

variables { 
    char retval[256]; 
} 

void ErrorCodeToMsg(int code) { 
    char [] msg = "Hello word"; 
    strncpy(retval, msg, 256); 
} 

當然,這是非常醜陋的,因爲每次調用ErrorCodeToMsg需要兩個語句,而不是一個。有沒有更好的辦法?

回答

2

你必須這樣做,你會與基於字符串的函數執行:

void ErrorCodeToMsg(char buffer[], int code){ 
buffer = myListOfCodes[code]; 
} 

值將被存儲在使用它的參考值的緩衝區。無法在Capl中返回字符串。這就是您無法使用@選擇器訪問字符串系統變量的原因。

+1

+1用於避免全局變量。我仍然希望一個真正的'char *'返回值能夠'write(「Error:%s」,ErrorCodeToMsg(errno))',這要感謝你確認它不會發生。 –

0

我已經實現了返回字符串常量的函數的解決方法。它包括在界定可能的返回值char errorMsg[][]的陣列,並且定義一個函數int ErrorCodeToMsg(errno)其是陣列中的回報和指數,因此它被稱爲是這樣的:

write("Error: %s", errorMsg[ErrorCodeToMsg(errno)]); 

注意,手動編碼時該方法是容易出錯的,因爲修改後很容易使功能和陣列不同步。在我的情況下,錯誤代碼是在規範(XML文件)中定義的,以便自動生成錯誤消息數組和函數。

相關問題