2010-10-30 6 views
9

argv[] dizisi aracılığıyla programın farklı argümanlarına erişen çeşitli işlevlere sahip olacağım. Şu anda, bu işlevler derleyicinin bu tür yapılara izin vermesini sağladığı bir dil uzantısı nedeniyle main() işlevinin içine yerleştirilmiştir.argv [], main() işlevinin dışından nasıl erişilir?

İç içe geçmiş işlevlerden kurtulmak istiyorum, böylece bir dil uzantısına bağlı olmadan birlikte çalışabilirlik mümkündür.

Her şeyden önce, program başlatıldıktan sonra argv[] işaretine işaret edecek bir dizi işaretçiyi düşündüm, bu değişken main() işlevinin dışında olurdu ve işlevlerden önce bunların tarafından kullanılabileceği şekilde bildirildi.

Yani şöyle böyle bir işaretçi ilan: karakterlere işaretçiler bir dizi için bir işaretçi olmalıdır

char *(*name)[]; 

. Ben argv[] yönlendirin çalıştığınızda Ancak, ben uyumsuz bir işaretçi türünden bir ödev üzerinde bir uyarı olsun:

name = &argv; 

Sorun ne olabilir? main() işlevinin dışından argv[] dizisine erişmenin başka bir yolunu mu düşünüyorsunuz?

cevap

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

Eğer char *(*name) [] char işaretçiler dizisi bir göstericidir bkz hile :)

yapacağız. Fonksiyon argüman argv, char işaretçisine tip işaretçisi vardır ve bu nedenle & argv işaretçisine işaretçi için tip işaretçisine sahiptir. Niye ya? Çünkü bir dizi almak için bir işlev bildirdiğinizde, bir işaretçi alarak bir işlev olarak derleyici için aynıdır. Bu,

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

kesinlikle aynı eşdeğer bildirimlerdir. Bir dizi bir işaretçi, ancak bir işlev argüman olarak ilk cevap * ve * tek cevap olduğu için HTH

Bu çalışması gerekir
+0

+1

olduğunu Değil Şimdiye kadar hata açıklayan. –

+0

Açıklama için teşekkürler! 'Argv'' char * argv [] olarak kullanıyordum, bu yüzden başlangıçta bir dizi işaretçi düşündüm. – Sergi

+0

@Johannes, @Sergi: Teşekkürler, C/C++ kitaplarının diziler ve işaretçilerdeki farklılıklar hakkında daha büyük bir vurgu yapmasını dilerim. Bunlar çok sık karışırlar ... –

3

,

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