2016-04-22 325 views
3

將返回的整數值強制轉換爲void指針有問題。已嘗試從這個網站的一些選項,但我的問題似乎仍然沒有得到解決。雖然程序編譯時沒有代碼錯誤,但我得到了分段錯誤。我瞎了,在我的代碼中有一些錯誤?將int函數強制轉換爲void *

#include<pthread.h> 
#include<stdio.h> 
#include<stdint.h> 

int ackermann(int a, int b) 
{ 
    if(a==0) 
     return a+1; 
    else if(a>0 && b==0) 
    { 
     return ackermann(a-1, 1); 
    } 
    else if(a>0 && b>0) 
    { 
     return ackermann(a-1,ackermann(a,(b-1))); 
    } 
} 

int main(int argc, char* argv[]) 
{ 
    int a = atoi(argv[1]); 
    int b = atoi(argv[2]); 
    int c = ackermann(a,b); 
    void *ptr = &c; 
    pthread_t mythread; 
    if(pthread_create(&mythread, NULL, ptr, NULL)) 
    { 
     printf("Could not create a thread\n"); 
    } 

    pthread_exit(NULL); 
    return 0; 
} 
+0

適合我:http://ideone.com/AMD4k0 – CinCout

+2

提示:爲什麼浪費'argc'? –

+6

「pthread_create」的第三個參數是一個指向函數的指針(本例中爲'ackerman'),但是你正在傳遞一個指向'int'的指針。 –

回答

2

正如在評論中提到的,你實際上並沒有調用該函數ackermann在一個單獨的線程。你正在做的是從main直接調用該函數,將結果存儲在int中,並將指向該int的指針作爲pthread_create的第三個參數傳遞,該指針應該是指向要運行的函數的指針。

現在,ackermann沒有相應的簽名傳遞給pthread_create。啓動一個新的線程函數應該聲明如下:

void *my_thread_function(void *parameter); 

鑑於ackermann被遞歸調用,這將是清潔劑AA包裝函數傳遞給pthread_create和有包裝的呼叫ackermann而不是修改ackermann匹配上面的簽名。

由於您需要將多個參數傳遞給您的線程函數,因此您需要創建一個包含所有參數的struct,並將指向該線程函數的指針傳遞給該線程函數struct

您還可以將返回值存儲在此結構中,以便啓動線程的函數可以訪問它。

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

int ackermann(int a, int b) 
{ 
    if(a==0) { 
     return a+1; 
    } else if(a>0 && b==0) { 
     return ackermann(a-1, 1); 
    } else if(a>0 && b>0) { 
     return ackermann(a-1,ackermann(a,(b-1))); 
    } 
    // if none of the above conditions are true, no value is returned 
    // better check for this 
} 

struct ackermann_params { 
    int a; 
    int b; 
    int result; 
}; 

void *ackermann_thr(void *arg) 
{ 
    struct ackermann_params *params = arg; 
    params->result = ackermann(params->a, params->b); 
    return NULL; 
} 

int main(int argc, char* argv[]) 
{ 
    struct ackermann_params params; 
    if (argc < 3) { 
     printf("invalid number of arguments\n"); 
     exit(1); 
    } 
    params.a = atoi(argv[1]); 
    params.b = atoi(argv[2]); 
    pthread_t mythread; 
    if(pthread_create(&mythread, NULL, ackermann_thr, &params)) 
    { 
     perror("Could not create a thread\n"); 
     exit(1); 
    } 
    if (pthread_join(mythread, NULL)) { 
     perror("join failed\n"); 
     exit(1); 
    } 
    printf("result=%d\n", params.result); 

    return 0; 
} 
相關問題