3

ここでの私の質問は、マルチスレッドアプリケーションで次のようなコードを見たことがあるということです。

void Thread( void* pParams )
{  
    int *milliseconds = (int *)pParams;
    Sleep(milliseconds);
    printf("Finished after %d milliseconds", milliseconds); //or something like that
}

これは非常に興味をそそられmallocました。voidポインターが返され、必要なものにキャストできることを知っていました。これは、任意のデータ型を受け入れることができる関数を作成できることを意味しますか?

たとえば、テストせずに作成した関数:

void myfunc( void* param )
{  
    switch(sizeof(param)) {
       case 1:
       char *foo = (char *)param; break;
       case 2:
       short *foo = (short *)param; break;
       case 4: 
       int *foo = (int *)param; break;
    }
}
myfunc(3.1415);
myfunc(0);
myfunc('a');

私は完全に間違っているかもしれませんが、これがうまくいくとしても、それは恐ろしい練習ですか?ありがとう。

4

5 に答える 5

7

はい、void *ジェネリック関数の作成に最適です。ただし、特定のデータ型へのポインタを を受け取る関数に渡すと、void *すべての型情報が失われます。渡された型をプログラムが認識できるようにプログラムを操作する 1 つの方法は、enumINT、FLOAT、DOUBLE などの値を持つ型の 2 番目のパラメーターを使用することです。

#include <stdio.h>

typedef enum inputTypes
{
    INT,
    DOUBLE,
    CHAR
} inType;

void myfunc(void*, inType);

int main(void)
{
    int    i = 42;
    double d = 3.14;
    char   c = 'a';

    myfunc(&i, INT);
    myfunc(&d, DOUBLE);
    myfunc(&c, CHAR);

    return 0;
}

void myfunc(void* param, inType type)
{  
    switch(type) {
       case INT:
           printf("you passed in int %d\n", *((int *)param));
           break;
       case DOUBLE:
           printf("you passed in double %lf\n", *((double *)param));
           break; 
       case CHAR: 
           printf("you passed in char %c\n", *((char *)param));
           break;
    }
}

出力

you passed in int 42
you passed in double 3.140000
you passed in char a
于 2010-12-08T21:22:15.573 に答える
7

はい、複数の型を受け入れる関数を作成することは可能ですが、それはあなたのやり方ではありません。

ではmyfuncsizeof(param)常に同じになりsizeofます。コンパイル時に決定され、ポインターのサイズになります。

スレッドで機能する理由は、一般に、コンパイル時にポインターが指すものをコーダーが知っているため、必要なのは単純なキャストだけです。コンパイル時に が何を指しているのかわからない場合はvoid *、実行時に何らかの方法で渡す必要があります。

のキーvoid *: それらをキャストして元の状態に戻すことしかできません。それが何であるかを知るのはあなた次第です。simplevoid *だけでは、それが何を指しているのかわかりません。

于 2010-12-08T21:22:41.540 に答える
0

sizeof(param)は常にポインターのサイズを返すため、64 ビット システムの場合はおそらく 8 になります。これは、それが指しているものとは何の関係もありません。

于 2010-12-08T21:20:57.383 に答える
0

sizeof(param)はポインターのサイズを取得しようとしているため、機能しません。

于 2010-12-08T21:21:12.793 に答える
0

のサイズはvoid*システムに完全に依存し、実際に含まれているものではなく、コンパイル時に決定されます。

于 2010-12-08T21:21:47.693 に答える