2014-11-02 89 views
0

我试图修改此代码整数参数的工作:需要帮助整形变量(线程)

#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); 
    } 
} 

这不是工作,不便指点一下,我不明白。任何人都可以解释我?我不想使用“atoi”功能。 对于号码5和2获得:-1078000975,-1078000973以及警告:

11:3:警告:格式 '%d' 期望类型 'INT' 的参数,但参数2具有输入“INT *'[-Wformat =] printf(“我得到了:%d \ n”,nr); ^

+0

'INT NR = *(INT *)param' – 2014-11-02 13:42:28

+0

代码覆盖在“日”为创建的每个线程的值,因此在pthread_join将只能看到最后一个线程创建的,不是所有的线程 – user3629249 2014-11-02 21:32:20

回答

0

的几个问题:

  1. argv应该写成char * argv[]而不是int * argv[]

  2. 您的(void *)投在您的pthread_create()电话是不必要的。

  3. 你的线程函数应该返回一个void *

  4. atoi(),或者其更强大的表弟,strtol(),是正是你在找什么,在这里。你可以使用它们,或手动转换你的字符串,这是不理想的。

这里有一个工作版本:

#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; 
} 

一些样本输出:

[email protected]:~/src/sandbox$ ./trd 5 haha 10 
I got: 5 
Invalid number. 
I got: 10 
[email protected]:~/src/sandbox$ 
0

如果您收到的参数是小于10,你可以这样做:

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

这是可以做到,因为ASCII码为48( '0' 值)开始。所以如果你收到'7'(55 ASCII码),你可以减去'0'来得到它:55-48 = 7。 如果参数可以是10或更大,则必须使用atoi或该函数的自我实现,因为不能从char *转换为C中的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); 
    } 
} 

它为我...

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); 
} 
+1

它将无法工作。它会显示该号码的ascii代码... – 2014-11-02 13:36:09

+0

@AlbertoSotoBallesteros对,我忘了转换。 – 2501 2014-11-02 13:38:46

+0

建议的代码需要遍历字符串,直到看到'\ 0'或当前字符失败isdigit(),否则只处理第一个数字。在将每个连续数字添加到要打印的结果之前,'n'需要乘以10才能为下一个数字腾出空间 – user3629249 2014-11-02 21:43:04