2010-06-22 121 views
1

這是推動我瘋了:如何傳遞數組作爲參數?

我有功能

void gst_init(int *argc, char **argv[]); 
在GStreamer的API

,我想用一些參數我定義,喜歡叫它:

int argc = 2; 
char* argv[2] = {"myvalue1", "myvalue2"}; 
gst_init(&argc, &argv); 

此代碼沒有按't彙編(我得到錯誤C2664):

error C2664: 'gst_init' : cannot convert parameter 2 from 'char *(*)[2]' to 'char **[]' 

問題如何定義argv值以將其作爲參數傳遞?我已經使用C++超過5年了,但自從...高中我想(超過五年前)以來,我還沒有使用原始數組。

編輯:我正在使用VS2010 Express。

回答

2

嘗試

int argc = 2; 
char* arg1[1] = {"myvalue1"}; 
char* arg2[1] = {"myvalue2"}; 
char** argv[2] = { arg1, arg2 }; 
gst_init(&argc, argv); 

char **argv[]char**陣列,其類似於char*數組的數組。

OTOH您嘗試傳遞的參數顯示爲char *(*)[2]:指向char*數組的指針。

+0

不起作用:'錯誤C2440:'初始化':無法從'const char [9]'轉換爲'char **' – utnapistim 2010-06-22 12:40:38

+0

@utnapistim,請參閱我的更新。 – 2010-06-22 12:44:52

+0

更新後的代碼編譯成功。我會過去的。謝謝。 – utnapistim 2010-06-22 12:53:53

4

通常您會按照manual中的說明進行操作,並將指針指向main提供的參數,以便gstreamer可以刪除它處理的參數。

#include <stdio.h> 
#include <gst/gst.h> 

int main (int argc, char *argv[]) 
{ 
    gst_init (&argc, &argv); 
    // handle the remaining argc values of argv 

如果你想創建自己的論點,然後創建相同類型的數組,其main將有:

void gst_init(int *argc, char **argv[]) 
{ 
    // strip one argument 
    --*argc; 
    ++*argv; 
} 

void foo() 
{ 
    int argc = 2; 

    char* args[] = {"myvalue1", "myvalue2"}; 
    char** argv = args; 

    for(int i= 0; i < argc; ++i) 
     printf("%s\n", argv[i]); 

    gst_init(&argc, &argv); 

    for(int i= 0; i < argc; ++i) 
     printf("%s\n", argv[i]); 
} 

如果你不使用C99,它更容易有一個單獨的指針到本地數組字符串。使用C99,您可以只寫char** argv = (char*[]){"myvalue1", "myvalue2"};以指向匿名數組中的第一個元素的指針開始。

您需要將指針傳遞給指向數組的變量,而不是指向數組中第一個元素的指針;在第一種情況下,將數組參數降級爲指針可以獲得與第二種情況下聲明指針局部變量相同的效果 - 然後您可以傳遞此變量的地址,並且函數可以對其進行修改。由於編譯器會推導出數組中元素的數量,因此32位機器上的sizeof(args)爲8; sizeof(argv)是4,因此++ args會將指針移動到數組的末尾,而不是像++ argv那樣移動到下一個元素。編譯器可以保護您免受這種操作。

但通常你會按照手冊的建議使用它。

+0

我知道我應該通過args和argv - 我只是很好奇如何手動定義參數(這就是爲什麼我沒有標記「gstreamer」這個問題 - 我只是對語法感興趣)。 感謝您的答案,雖然(我從中得到了別的東西)。 擁有+1 :) – utnapistim 2010-06-22 14:16:47