c-如何传递一个文件数组作为参数



我很难将一个文件数组作为参数传递给pthread_create函数。

FILE *arqvs[arq];
for(int i=1, count=0;i<=arq;i++, count++){
changeName(file, i); //change the name of the file based on the index
arqvs[count] = fopen(file, "r");

if(arqvs[count]==NULL){
printf("Erroro:(n");
exit(1);
}
}

上面的代码显示了我如何创建数组并在";r〃;模式我做了一些测试,看起来效果不错。Is根据变量arq的编号读取所有文件。如上所述,当我试图将数组传递给函数pthread_create时,问题就出现了。。

这是代码:

for(int i=0;i<trd; i++){
pthread_create(&thread[i], NULL, funcao, &**arqvs);
}

这里有一个功能:

void * funcao(void * args){
char voto[2];
FILE *** fileName = (FILE***) args;
while (fgets(voto, sizeof(voto), *fileName[0])) {
printf("%s", voto); 
pthread_exit(NULL);
}

这个代码不起作用,我不知道为什么。我已经有一段时间没有用C编程了,所以,如果有任何提示或答案,我将不胜感激。

传递给pthread_create的值(&**argvs(是FILE *。但在funcao中,您将其强制转换为不同的FILE ***,因此所有内容都会中断(未定义的行为(。

您需要确保传入的值和将void *强制转换为的值的类型相同。在您的情况下,使用FILE **可能是最有意义的。因此,您可以将pthread_create调用为:

pthread_create(&thread[i], NULL, funcao, arqvs);

在funcao中,将其用作:

FILE ** files = (FILE**) args;

请注意,当您将数组转换为指针时,arq(数组的大小(会丢失,因此您无法很好地了解funcao中有多少FILE *。创建一个同时保存(指向的指针(数组和数组大小的struct,并将指向该数组的指针传递给线程函数,这可能更有意义。

在C中,数组通常通过将指针传递到数组的第一个元素来传递给函数/线程。如果被调用的函数/线程不知道长度,则通常会传递一个额外的参数,该参数指定数组中的元素数。

如果数组中的元素数量(即arq的值(对两个线程都是已知的,那么您只需要将指针传递到数组的第一个元素。否则,您还必须将数组中的元素数传递给pthread_create,例如,将指针传递给同样包含此信息的struct

假设数组中的元素数量不必传递,则应该更改行

pthread_create(&thread[i], NULL, funcao, &**arqvs);

pthread_create(&thread[i], NULL, funcao, arqvs);

相当于:

pthread_create(&thread[i], NULL, funcao, &arqvs[0]);

这是因为当在该上下文中使用时,数组arqvs自动衰减为指向数组的第一个元素的指针。

由于数组的元素类型是FILE *,并且指向数组第一个元素的指针已传递给函数funcao,这意味着传递的指针的类型是FILE **。因此,您应该更改行

FILE *** fileName = (FILE***) args;

至:

FILE ** fileName = (FILE**) args;

此外,fileName似乎不是这个指针的合适名称。一个更好的名称应该是类似filesstreams的名称。

只需直接传递数组,就不需要使用&。数组用作函数参数时会自动衰减为指针。

for(int i=0;i<trd; i++){
pthread_create(&thread[i], NULL, funcao, arqvs);
}
void * funcao(void * args){
char voto[2];
FILE **fileName = args;
while (fgets(voto, sizeof(voto), fileName[0])) {
printf("%s", voto); 
}
pthread_exit(NULL);
}

相关内容

  • 没有找到相关文章

最新更新