Передайте массив String и индексы, используя Struct, потоку в C - PullRequest
0 голосов
/ 17 сентября 2018

Я пытаюсь передать строковый массив и индексы, откуда начать и завершить поиск в массиве, я не могу решить его за последние два дня. Я отправляю в pthread_create struct data thread_data, здесь я могу отправлять данные типа int и long, но не массив строк, может кто-нибудь мне помочь, как их передать.

struct data{
        int  tid;
        unsigned long start;
        unsigned long end;
        char * word;
        char * str;
        };

struct data thread_data[NUM_THREADS];
void *searchString(void *passeddata)
{
   struct data *t_data;
   int tid1;
   char * str[3];
   t_data=(struct data *) passeddata;
   tid1=t_data->tid;
   str=t_data->str;
  .....
   pthread_exit(NULL);
}       
int main(int argc, char *argv[])
{
...
char  work[]={"First Line","Second line","Third line"};
...

   while(fgets(arr[index],120, fp)!=NULL){
        index=index+1;
        thread_data[index].tid=index;
        thread_data[index].str=work;
        ...
        rc=pthread_create(&threads[index],NULL,searchString,(void *)&thread_data[index]);
...     
        }

   pthread_exit(NULL);
}

1 Ответ

0 голосов
/ 17 сентября 2018

Для хранения нескольких строк вам нужен 2D массив.

const char  *work[]={"First Line","Second line","Third line", "Fourth Line"};

Вам нужно использовать указатель на указатель в struct data для хранения вышеуказанного массива.

struct data{
        .....
        const char **str;
        size_t lenOfStr;
        };

И явно передать длину массива функции потока из функции main.

Ваш пример кода может выглядеть следующим образом.

#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
struct data{
        int  tid;
        unsigned long start;
        unsigned long end;
        char * word;
        const char **str;
        size_t lenOfStr;
        };

struct data thread_data[3];

void *searchString(void *passeddata)
{
   struct data *t_data;
   int tid1;
   const char **str = NULL;
   t_data=(struct data *) passeddata;

   tid1=t_data->tid;
   str=t_data->str;

  int i = 0;
   for (i = 0;i<t_data->lenOfStr;i++)
   printf("%s\n", str[i]);

   pthread_exit(NULL);
}

int main(int argc, char *argv[])
{
        const char  *work[]={"First Line","Second line","Third line", "Fourth Line"};
        int index = 0;
        pthread_t threadid=0;

        thread_data[index].tid=index;
        thread_data[index].str=work;
        thread_data[index].lenOfStr = sizeof(work)/sizeof(*work); // Calculate the size of work here

        int rc=pthread_create(&threadid,NULL,searchString,&thread_data[index]);

        pthread_exit(NULL);
}
...