在int args(threads)方面需要帮助

时间:2014-11-02 13:13:55

标签: c pointers pthreads args

我尝试编辑此代码以使用ints参数:

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 
#include <string.h> 


void* worker (void* param) {
      int* nr = (int *) param;
  printf ("I got: %d\n",nr);
}

int main (int argc, int *argv[])
{
  pthread_t th;
  int i;  
  for(i=1;i<argc;i++){
      pthread_create (&th, NULL, worker,(void*)argv[i]);
      pthread_join (th, NULL);
  }
}

这不起作用,关于指针,我不明白。有人能解释一下吗?我不想使用&#34; atoi&#34;功能。 对于5号和2号,我得到:-1078000975,-1078000973和警告:

  

11:3:警告:格式'%d'需要类型为'int'的参数,但参数2的类型为'int *'[-Wformat =]      printf(&#34;我得到了:%d \ n&#34;,nr);      ^

3 个答案:

答案 0 :(得分:0)

如果你收到的论点小于10,你可以这样做:

pthread_create (&th, NULL, worker,(void*)(argv[i][0]-'0'));

这可以完成,因为ASCII数字从48开始('0'值)。因此,如果你收到一个'7'(55 ascii数字),你可以减去'0'得到它:55-48 = 7。 如果参数可以是10或更大,则必须使用atoi或该函数的自我实现,因为您无法在C中从char *转换为int。

您的代码还有另一个问题,您尝试打印int *,它只是一个包含内存地址的变量。你应该把它当作一个int:

void* worker (void* param)
{
  int nr = (int) param;
  printf ("I got: %d\n",nr);
}

编辑: 所以你的代码应该是这样的:

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 
#include <string.h> 


void* worker (void* param) {
      int nr = (int) param;
  printf ("I got: %d\n",nr);
}

int main (int argc, char *argv[])
{
  pthread_t th;
  int i;  
  for(i=1;i<argc;i++){
      pthread_create (&th, NULL, worker,(void*)(argv[i][0]-'0'));
      pthread_join (th, NULL);
  }
}

对我有用......

答案 1 :(得分:0)

一些问题:

  1. argv应写为char * argv[],而不是int * argv[]

  2. (void *)来电中的pthread_create()演员阵容是不必要的。

  3. 您的线程函数应返回void *

  4. atoi(),或其功能更强大的表兄strtol()正好您正在寻找的内容,在此处。您可以使用它们,也可以手动转换字符串,这不是最理想的。

  5. 这是一个有效的版本:

    #include <stdio.h> 
    #include <stdlib.h> 
    #include <pthread.h> 
    
    void * worker (void * param)
    {
        char * numstr = param, * endptr;
    
        long num = strtol(numstr, &endptr, 0);
        if ( *endptr ) {
            printf("Invalid number.\n");
        }
        else {
            printf ("I got: %ld\n", num);
        }
    
        return NULL;
    }
    
    int main (int argc, char *argv[])
    {
        pthread_t th;
        for ( int i = 1; i < argc; ++i ) {
            pthread_create (&th, NULL, worker, argv[i]);
            pthread_join (th, NULL);
        }
        return 0;
    }
    

    和一些示例输出:

    paul@horus:~/src/sandbox$ ./trd 5 haha 10
    I got: 5
    Invalid number.
    I got: 10
    paul@horus:~/src/sandbox$
    

答案 2 :(得分:0)

您应该将指针传递给字符串,然后对其进行操作。

pthread_create (&th, NULL, worker, argv[i]);   //cast is not required

void* worker (void* param) {
      char* nr = param ;

现在你在线程中得到了你的字符串。获取第一个字符,并将其转换为整数。

    int n = nr[0]-'0' ;
    printf ("I got: %d\n",n);
}