【问题标题】:How to pass array index into another function in c如何将数组索引传递给c中的另一个函数
【发布时间】:2016-03-26 20:20:06
【问题描述】:

我想弄清楚如何将数组索引传递给另一个函数。

这里有:

 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

对如何将数组索引传递给另一个函数有什么建议吗?

【问题讨论】:

标签: c arrays


【解决方案1】:

通常你只传递 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);
    /* ... */
}

【讨论】:

  • 来自p-&gt;filename = &amp;filenames[i]的不兼容指针类型的赋值
  • 可能的文件名是 const char filenames[] ?如果是这样,params.filename 需要是 const char *.
  • char **filenames 那么该语法是否仍然适用?
【解决方案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]);
}

【讨论】:

  • 所以我想你必须决定堆或堆栈分配是否适合你。如果线程超出了函数的范围,就会发生坏事,但在这种情况下可能不会。请注意,NUMBER_OF_THREADS 不是常数,因此全局分配不起作用。
  • @Joshua。你说的对。但我写的只是一个例子。在我的回答中,我写道 OP 应该静态使用它或动态分配它。这是根据设计选择的 OP。
猜你喜欢
  • 2017-12-09
  • 2011-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-12
  • 2015-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多