2010-10-30 14 views
9

Mam kilka funkcji, które uzyskują dostęp do różnych argumentów programu za pośrednictwem tablicy argv[]. W tej chwili funkcje te są zagnieżdżane wewnątrz funkcji main() z powodu rozszerzenia języka, które zapewnia kompilator umożliwiający takie struktury.Jak uzyskać dostęp do argv [] spoza funkcji main()?

Chciałbym pozbyć się zagnieżdżonych funkcji, tak aby możliwa była interoperacyjność bez uzależnienia od rozszerzenia języka.

Przede wszystkim pomyślałem o wskaźniku tablicy, który wskazywałbym na argv[] po uruchomieniu programu, zmienna ta byłaby poza funkcją main() i zadeklarowana przed funkcjami, aby mogła być przez nich używana.

Więc zadeklarował takiego wskaźnika w następujący sposób:

char *(*name)[]; 

który powinien być wskaźnikiem do tablicy wskaźników do znaków. Jednak, gdy staram się skierować go do argv[] otrzymuję ostrzeżenie na cesji z niekompatybilnego typu wskaźnika:

name = &argv; 

Co może być problemem? Czy myślisz o innym sposobie dostępu do tablicy argv[] spoza funkcji main()?

Odpowiedz

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

rade :)

widać char *(*name) [] jest wskaźnikiem do tablicy wskaźników do Char. Podczas gdy argument funkcji argv ma wskaźnik typu na wskaźnik do znaku, a zatem & argv ma wskaźnik typu wskaźnik do wskaźnika na znak. Czemu? Ponieważ, gdy deklarujesz funkcję przyjmowania tablicy, jest ona taka sama dla kompilatora, jak funkcja przyjmująca wskaźnik. To znaczy, że są to absolutnie identyczne deklaracje równoważne. Nie dlatego, że tablica jest wskaźnikiem, ale jako argument funkcji jest

HTH

+0

+1 za to, że pierwsza odpowiedź * i * tylko odpowiedź do tej pory wyjaśniając błąd. –

+0

Dziękuję za wyjaśnienie! Używałem 'argv' jako' char * argv [] ', więc pomyślałem o wskaźniku tablicy na początku. – Sergi

+0

@Johannes, @Sergi: Dzięki, chciałbym, aby książki w C/C++ kładły większy nacisk na różnice w tablicach i wskaźnikach. Te stają się zbyt często mieszane ... –

3

To powinno działać,

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); 
} 
Powiązane problemy