我试图弄清楚如何将数组索引传递给另一个函数。
我在这里:
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
。
如何将数组索引传递给另一个函数?
答案 0 :(得分: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);
/* ... */
}
答案 1 :(得分: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*)¶ms[i]);
printf("%s\n", filenames[i]);
}