簡體   English   中英

將int函數轉換為void *

[英]Casting int function to void*

我有一個問題,將返回的整數值轉換為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;
}

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

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

void *my_thread_function(void *parameter);

鑒於ackermann是遞歸調用的,將包裝器函數傳遞給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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM