Как передать массив в качестве параметра? - PullRequest
1 голос
/ 22 июня 2010

Это сводит меня с ума:

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

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

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

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 ]

4 голосов
/ 22 июня 2010

Обычно вы должны следовать инструкциям руководства и передавать указатели на аргументы, предоставленные 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. Компилятор защищает вас от такой операции.

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

2 голосов
/ 22 июня 2010

Попробуйте

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*.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...