2016-03-26 32 views
2

'daki başka bir işleve nasıl geçirilir Bir dizi dizininin başka bir işleve nasıl iletileceğini anlamaya çalışıyorum. İşteDizi dizini, c

Ben: işlevi get_checksum yılında

for(i=0; i<file_cnt; i++){ 

      iret1 = pthread_create(&(file[i]), NULL, get_checksum, (void*)&filenames[i]); 
      printf("%s\n", filenames[i]); 
     } 

, sonunda dosya adları dizinini gerekiyor, ama i o işlevinde kullanılamaz. get_checksum işlevi

,

void* get_checksum(void* a){ 

      char *filename = (char *) a; 
..... 
} 

I filenames[i] ile ilgili olarak bir karakter işaretçi olarak a geçirilir. Ancak, bir dizi dizinin indeksini almayı içeren get_checksum işlevinde daha sonra hesaplama yapmam gerekiyor. Bu nedenle, bunun yerine get_checksum işlevine geçirilmek üzere filenames dizinine ihtiyacım var.

Dizi dizini başka bir işleve nasıl iletilir?

+2

Bir yapı oluşturun, ilgili tüm parametrelerle yapıyı doldurun ve bunu pthread_create dosyasına aktarın - http://www.amparo.net/ce155/thread-ex.html – OldProgrammer

cevap

2

Normalde 2 parametresini geçmeniz yeterlidir, ancak burada pthread_create olduğundan bulamıyorsunuz, böylece bir işaretçi bir öbekte ayrılmış yapıya geçiriyorsunuz. Ya statik oluşturmak veya dinamically tip params_t bir değişken tahsis, bunu başlatmak ve get_checksum e adresini geçersiniz Sonra

typedef struct params_s 
{ 
    char * filename; 
    int index; 
    // additional params 
} params_t; 

:

struct params { 
    char *filename; 
    int i; 
}; 

/* ... */ 

for(i=0; i<file_cnt; i++){ 
     struct params *p = malloc(sizeof(struct params)); 
     p->filename = filenames[i]; 
     p->i = i; 
     iret1 = pthread_create(&(file[i]), NULL, get_checksum, (void*)p); 
     if (iret1) { 
      free(p); 
      printf("OOPS %s\n", filenames[i]); 
     } else { 
      printf("%s\n", filenames[i]); 
     } 
    } 

/* ... */ 

void* get_checksum(void* p){ 
    char *filename = ((struct params *)p)->filename; 
    int i = ((struct params *)p)->i; 
    free(p); 
    /* ... */ 
} 
+0

Uyumsuz işaretçi türünden atama 'p-> Dosya adı = & dosya isimleri [i] ' – SamSmith

+0

Olası dosya isimleri const char dosya isimleri []? Eğer params.filename daha yapılıyorsa const char * olması gerekiyor. – Joshua

+0

'char ** dosya isimleri 'bu sözdizimi hala geçerli olur mu? – SamSmith

2

İstediğin kadar parametreleri aktarmak için bir yapı tanımlayabilirsiniz:

Örnek

params_t params[NUM_OF_THREADS]; 
... 
for(i=0; i<file_cnt; i++){ 
    params[i].filename = &filenames[i]; 
    params[i].index = i; 
    iret1 = pthread_create(&(file[i]), NULL, get_checksum, (void*)&params[i]); 
    printf("%s\n", filenames[i]); 
} 
+0

Öyleyse, yığın veya yığın ayırmanın sizin için işe yarayıp yaramadığına karar vermelisiniz. Eğer iş parçacığı işlevin kapsamını aşarsa, kötü şeyler olur, ancak bu durumda olmayabilirler. NUMBER_OF_THREADS değerinin sabit olmadığını ve genel bir tahsisin işe yaramadığını lütfen unutmayın. – Joshua

+0

@Joshua. Haklısın. Ama yazdığım şey sadece bir örnektir. Cevabımda, OP'nin ya statik olarak kullanması gerektiğini ya da dinamik olarak tahsis etmesini yazdım. Tasarıma göre OP seçimidir. –