2010-06-22 4 views
1

Это сводит меня с ума:Как передать массив в качестве параметра?

У меня есть функция

void gst_init(int *argc, char **argv[]); 

в GStreamer API, и я хочу, чтобы назвать его с некоторыми параметрами я определяю, как:

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

Этот код Безразлично (я получаю ошибку 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: 'initializing': не может преобразовать из 'const char [9]' в 'char **'' – utnapistim

+0

@utnapistim, см. Мое обновление. –

+0

Обновленный код компилируется ОК. Я пройду через это. Благодарю. – utnapistim

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"};, чтобы начать с указателя на первый элемент в анонимном массиве.

Вам нужно передать указатель на переменную, указывающую на массив, а не на указатель на первый элемент массива; в первом случае деградация параметра массива указателю достигает того же эффекта, что и второй случай, объявляющий локальную переменную указателя - тогда вы можете передать адрес этой переменной, и функция может ее изменить. sizeof (args) - 8 на 32-битной машине, поскольку компилятор выводит количество элементов в массиве; sizeof (argv) - 4, поэтому ++ args переместит указатель в конец массива, а не в следующий элемент, как это делает ++ argv. Компилятор защищает вас от такой операции.

Но обычно вы должны использовать его так, как это предлагает руководство.

+0

Я знаю, что мне нужно передать args и argv - мне было просто интересно узнать, как вручную определить параметры (поэтому я не поставил вопрос «gstreamer» - меня просто интересовал синтаксис). Спасибо за ответ, хотя (у меня есть что-то еще от него). У вас есть +1 :) – utnapistim

Смежные вопросы