2014-11-02 110 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