2010-06-22 10 views
1

Ce me rend fou:Comment transmettre un tableau en tant que paramètre?

Je fonction

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

dans le api GStreamer et je veux l'appeler avec quelques paramètres je définis comme:

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

Ce code doesn 't compiler (j'obtiens l'erreur C2664):

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

La question: Comment définir la valeur argv pour la transmettre en paramètre? J'utilise le C++ depuis plus de 5 ans, mais je n'ai pas utilisé de tableau brut depuis ... le lycée je pense (il y a plus de cinq ans).

Modifier: J'utilise VS2010 Express.

Répondre

2

Try

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

char **argv[] est un tableau de char**, qui est analogue à un réseau de char* tableaux.

OTOH ce que vous avez essayé de transmettre en tant que paramètre est représenté par char *(*)[2]: un pointeur vers un tableau de char*.

+0

ne fonctionne pas: 'erreur C2440: 'initialisation': impossible de convertir 'const char [9]' en 'char **'' – utnapistim

+0

@utnapistim, voir ma mise à jour. –

+0

Le code mis à jour compile OK. Je vais y aller. Merci. – utnapistim

4

Normalement, vous devez suivre les instructions du manual et passer des pointeurs aux arguments fournis par main, afin que gstreamer puisse supprimer les arguments qu'il gère.

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

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

Si vous voulez créer vos propres arguments, puis créer le même genre de tableau qui main aurait:

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]); 
} 

Si vous ne l'utilisez C99, il est plus facile d'avoir un pointeur séparé à la matrice locale de littéraux de chaîne. En utilisant C99, vous pouvez simplement écrire char** argv = (char*[]){"myvalue1", "myvalue2"}; pour commencer avec un pointeur vers le premier élément d'un tableau anonyme.

Vous devez passer un pointeur vers une variable pointant vers le tableau plutôt qu'un pointeur vers le premier élément du tableau; Dans le premier cas, la dégradation d'un paramètre de tableau vers un pointeur produit le même effet que le deuxième cas en déclarant une variable locale de pointeur - vous pouvez alors passer l'adresse de cette variable et la fonction peut la modifier. sizeof (args) est 8 sur une machine 32 bits car le compilateur déduit le nombre d'éléments dans le tableau; sizeof (argv) vaut 4, donC++ args déplacerait le pointeur vers la fin du tableau plutôt que vers l'élément suivant comme le fait ++ argv. Le compilateur vous protège d'une telle opération. Mais normalement, vous l'utiliseriez de la manière suggérée par le manuel.

+0

Je sais que je devrais passer les args et argv - J'étais juste curieux sur la façon de définir manuellement les paramètres (c'est pourquoi je n'ai pas tagué la question "gstreamer" - J'étais juste intéressé par la syntaxe). Merci pour la réponse si (j'ai quelque chose d'autre). Avoir un +1 :) – utnapistim

Questions connexes