2016-03-26 3 views
2

Я пытаюсь понять, как передать индекс массива в другую функцию.Как передать индекс массива в другую функцию в c

Вот у меня есть:

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

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

В функции get_checksum, я в конце концов нужно индекс имен файлов, но i не доступен в этой функции.

В функции get_checksum,

void* get_checksum(void* a){ 

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

Я прошел в a как указатель полукокса по отношению к filenames[i].

Однако мне нужно сделать вычисления позже в функции: get_checksum, которые включают в себя получение индекса массива сумм. Поэтому мне действительно нужен индекс filenames, который вместо этого будет передан в функцию get_checksum.

Любые предложения, как передать индекс массива в другую функцию?

+2

Создайте структуру, заполните структуру всеми соответствующими параметрами и передайте ее в pthread_create - http://www.amparo.net/ce155/thread-ex.html – OldProgrammer

ответ

2

Обычно вы просто передаете 2 параметра, но вы не можете здесь, потому что pthread_create, чтобы передать указатель на выделенную кучей структуру.

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

Назначение из несовместимого типа указателя на 'p-> filename = & filenames [i] ' – SamSmith

+0

Возможные имена файлов: const char filenames []? Если это так, то param.filename должен быть const char *. – Joshua

+0

'char ** filenames', так будет ли этот синтаксис применяться? – SamSmith

2

Вы можете определения структуры, чтобы передать все параметры, которые вам нужны:

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

Затем либо создать статический или выделять динамически переменную типа params_t, инициализировать его и передать его адрес в get_checksum:

ПРИМЕР

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

Итак, я полагаю, вам нужно решить, будет ли работать куча или стек. Если потоки проходят через область действия функции, происходят плохие вещи, но в этом случае они могут отсутствовать. Обратите внимание, что NUMBER_OF_THREADS не является константой, поэтому глобальное распределение не будет работать. – Joshua

+0

@ Joshua. Ты прав. Но то, что я написал, является лишь примером. В своем ответе я писал, что OP должен либо использовать его статически, либо распределять его динамически. Это выбор OPs в соответствии с дизайном. –

Смежные вопросы