2013-07-12 112 views
1

需要一些幫助類型conversaion與字符串指針在C.我具有從主循環得到的*argv通過命令行參數傳遞給它的功能。由於參數是固定的,我想給我自己*argv風格參數,但GCC每次發出警告:的C指針和類型轉換

passing argument 2 of ‘DirectFBInit’ from incompatible pointer type 

代碼:

int main (int argc, char *argv[]) 
{ 
    ... 
    char *argx[2] = {"self","--dfb:no-vt"}; 
    char *argxPtr = argx; 

    DFBCHECK (DirectFBInit (&fakeArgc, &argxPtr)); 
    ... 
} 

我應該指出,該功能操作argv(因此argx)。

這裏是DirectFBInit定義:

DFBResult DirectFBInit(
        int   *argc, /* pointer to main()'s argc */ 
        char  *(*argv[]) /* pointer to main()'s argv */ 
       ); 

的PROG正在運行,但我很擔心它。

+0

字符* argxPtr = argx;是無效的,你能告訴我們DirectFbInit的定義 – Alexis

+0

歡迎來到Stack Overflow。請儘快閱讀[關於]頁面。直到您提供'DirectFBInit()'函數的原型之前,我們無法幫助您。我們可以使用Google來搜索信息,但我們不應該這麼做。有可能你不想在呼叫中的姓名前面加上&符號,但這是一個猜測。關注這樣的編譯器警告是一個好主意 - 它們很重要,應該修復已確定的問題。 –

回答

1

如果我們調用char *「字符串」,那麼,它簡化了它一下。該函數需要一個指向字符串數組的指針。你傳遞一個字符串,並在此不正確的初始化字符串(argx具有類型char*[]但你將其分配給類型char*的變量)。

&argxPtr實際上應該是&argx(函數期望的類型爲char*(*[])的表達式),並且根本不需要argxPtr

0

像這樣的事情?

int myargc = 2; 
const char *myargv[] = { "self", "--dfb:no-vt" }; 
DirectFBInit(&myargc, &myargv); 
+0

謝謝你,但是這並不能消除編譯器有關不兼容指針類型的警告。也許它可以被忽略,但是通過main的argv(沒有警告)和製作的argv( - > argx) – user2578155

3

網址爲DirectFB的網站可能有用的信息。

你的代碼也許應該是:

int main(int argc, char **argv) 
{ 
    ... 
    char *argvxData[] = { "self", "--dfb:no-vt", 0 }; 
    char **argvx  = argvxData; 
    int argcx  = 2; 

    DFBCHECK(DirectFBInit(&argcx, &argvx)); 
    ... 
} 

注意添加空指針在main()程序在argv[argc]空指針相匹配。我沒有閱讀手冊以確保這是必需的,但一致性很好。當我檢查我的答案的第一版時,它沒有編譯沒有警告 - 事實上,它得到了你的警告;我已經用argvxData數組和argvx雙指針修復了這個問題。在原型中的[]主要是一個紅鯡魚,但避免了成爲一名three-star programmer指責。它相當於char ***argv

或者你也可以傳遞參數給主:

DFBCHECK(DirectFBInit(&argc, &argv)); 
+0

thnx顯然有區別,但是它再次給了我警告(警告:從不兼容的事件中傳遞'DirectFBInit'的參數2指針類型 )。從主傳遞它沒有警告,但那不是我想要的。只是要說話:我想要釋放用戶輸入不需要更改的選項。 – user2578155

+1

查看更新 - 我檢查編譯,我解決了你和我遇到的問題。請注意,如果您傳遞自己的選項,則會拒絕用戶從其命令行調整DirectFB行爲的選項。您還可能發現程序報告的錯誤前​​綴名爲'self',而不是程序的實際名稱。爲了避免這種情況,你可以用'argv [0]'初始化'argvxData [0]'。 –

+0

完美,就是這樣。我的c-fu太弱了,花了幾個小時才弄清楚了。感謝您關於用戶調整的提示,但那是因爲它是一個嵌入式系統。 (編輯:投票+1) – user2578155

0

一個簡單的方法來驗證是-g和運行GDB編譯。一旦進入gdb,運行該程序,然後鍵入ptype,您將看到不同之處。我用foo取代了func名稱()

foo(int *argc, char *(*argv[])) 
{        
}        

int 
main (int argc, char *argv[]) 
{        
    char *argx[2] = {"self","--dfb:no-vt"}; 
    char *argxPtr = argx;     

    foo (&argc, &argxPtr); 
}        

(gdb) ptype foo 
type = int (int *, char ***) 

(gdb) ptype main 
type = int (int, char **) 

因此警告。希望這可以幫助。