2010-10-30 5 views
9

Il se trouve que j'ai plusieurs fonctions qui accèdent à différents arguments du programme à travers le tableau argv[]. À l'heure actuelle, ces fonctions sont imbriquées dans la fonction main() en raison d'une extension de langage fournie par le compilateur pour autoriser de telles structures. Je voudrais me débarrasser des fonctions imbriquées afin que l'interopérabilité soit possible sans dépendre d'une extension de langue. Tout d'abord je pensais à un pointeur de tableau que je pointerais vers argv[] une fois le programme démarré, cette variable serait en dehors de la fonction main() et déclarée avant les fonctions afin qu'elle puisse être utilisée par eux.Comment accéder à argv [] depuis l'extérieur de la fonction main()?

Je déclare un pointeur comme suit:

char *(*name)[]; 

Ce qui devrait être un pointeur sur un tableau de pointeurs vers des personnages. Cependant, lorsque je tente de le pointer vers argv[] je reçois un avertissement sur une cession d'un type pointeur incompatible:

name = &argv; 

Quel pourrait être le problème? Pensez-vous à un autre moyen d'accéder au tableau argv[] en dehors de la fonction main()?

Répondre

6
char ** name; 
... 
name = argv; 

fera l'affaire :)

vous voyez char *(*name) [] est un pointeur sur un tableau de pointeurs sur des caractères. Alors que votre argument de fonction argv a un pointeur de type pointeur sur char, et donc & argv a un pointeur de type pointeur sur pointeur sur char. Pourquoi? Parce que lorsque vous déclarez une fonction pour prendre un tableau, c'est la même chose pour le compilateur qu'une fonction prenant un pointeur. C'est-à-dire,

void f(char* a[]); 
void f(char** a); 
void f(char* a[4]); 

sont des déclarations équivalentes absolument identiques. Pas qu'un tableau est un pointeur, mais comme un argument de la fonction est

HTH

+0

+1 pour être la première réponse * et * la seule réponse jusqu'à présent, expliquant l'erreur. –

+0

Merci pour l'explication! J'utilisais 'argv' comme' char * argv [] 'donc j'ai pensé à un pointeur de tableau au début. – Sergi

+0

@Johannes, @Sergi: Merci, je souhaite que les livres en C/C++ mettent un accent plus important sur les différences de tableaux et de pointeurs. Ceux-ci deviennent trop souvent mélangés ... –

3

Cela devrait fonctionner,

char **global_argv; 


int f(){ 
printf("%s\n", global_argv[0]); 
} 

int main(int argc, char *argv[]){ 
    global_argv = argv; 
f(); 
} 
0
#include <stdio.h> 

int foo(int pArgc, char **pArgv); 

int foo(int pArgc, char **pArgv) { 
    int argIdx; 

    /* do stuff with pArgv[] elements, e.g. */  
    for (argIdx = 0; argIdx < pArgc; argIdx++) 
     fprintf(stderr, "%s\n", pArgv[argIdx]); 

    return 0; 
} 

int main(int argc, char **argv) { 
    foo(argc, argv); 
} 
Questions connexes