2010-10-30 27 views
9

Tengo varias funciones que acceden a diferentes argumentos del programa a través de la matriz argv[]. En este momento, esas funciones están anidadas dentro de la función main() debido a una extensión de lenguaje que proporciona el compilador para permitir tales estructuras.¿Cómo acceder a argv [] desde fuera de la función main()?

Me gustaría deshacerme de las funciones anidadas para que la interoperabilidad sea posible sin depender de una extensión de idioma.

En primer lugar pensé en un puntero de la lista, que me gustaría señalar a argv[] una vez que se inicie el programa, esta variable sería fuera de la función main() y declaró antes de las funciones de modo que pudiera ser utilizado por ellos.

Así que declara un puntero como sigue:

char *(*name)[]; 

que debe ser un puntero a un array de punteros a caracteres. Sin embargo, cuando trato de apuntar a argv[] recibo una advertencia en una asignación de un tipo de puntero incompatible:

name = &argv; 

Cuál podría ser el problema? ¿Piensa en otra forma de acceder a la matriz argv[] desde fuera de la función main()?

Respuesta

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

hará el truco :)

ves char *(*name) [] es un puntero a la matriz de punteros a char. Mientras que su argumento de función argv tiene un puntero tipo a puntero a char, y por lo tanto & argv tiene un puntero de tipo a puntero a puntero a char. ¿Por qué? Porque cuando declaras una función para tomar una matriz, es la misma para el compilador que una función que toma un puntero. Es decir,

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

son declaraciones equivalentes absolutamente idénticas. No es que una matriz es un puntero, sino como un argumento de la función es

HTH

+0

+1 por ser la primera * la única respuesta respuesta y * hasta ahora explicando el error. –

+0

¡Gracias por la explicación! Estaba usando 'argv' como' char * argv [] 'así que pensé en un puntero de array al principio. – Sergi

+0

@Johannes, @Sergi: Gracias, deseo que los libros C/C++ pongan un mayor acento sobre las diferencias de matrices y punteros. Estos se mezclan demasiado a menudo ... –

3

Esto debería funcionar,

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); 
} 
Cuestiones relacionadas