После приведения pParam, почему я возвращаю случайные символы? - PullRequest
1 голос
/ 17 февраля 2010

Это первый раз, когда я хочу использовать потоки, поэтому я не до конца понимаю их.

У меня есть две структуры:

struct ddata  //difference content
{
    char *filename;
    char *size;
};
struct ddata *difference = (struct ddata *) malloc( dif * sizeof *difference );    

struct test
{
 struct ddata* difference;
 int diff;
};
struct test *MSG2;
MSG2 = (struct test*)malloc(sizeof(test)); 

MSG2->difference = difference;
MSG2->diff = diff;

Я хочу "отправить" две структуры MSG2 в мой поток, и я сделал это следующим образом:

CreateThread( 
        NULL,                   // default security attributes
        0,                      // use default stack size  
        CopyThread,       // thread function name
        &MSG2,          // argument to thread function 
        0,                      // use default creation flags 
        NULL); 

А теперь вот моя проблема. В моей ветке я отыграл pParam назад, и я хочу распечатать некоторые данные для его проверки, но я получаю случайные символы. Моя тема:

DWORD WINAPI CopyThread( LPVOID pParam )
{
    char a[100];
    test *Test = (test*)(pParam);
     sprintf(a, "diff: %s", Test->difference->filename );
 MessageBoxA(NULL,a,0,0);
}

Что я делаю не так?

Заранее спасибо!

Kampi

Ответы [ 2 ]

1 голос
/ 17 февраля 2010

Это потому, что CopyThread ожидает получения теста * на соответствующие данные, но вы проходите тест ** - указатель на указатель на соответствующие данные. Затем вы приводите его к тесту * в CopyThread, и это приводит к случайным символам.

Вы должны изменить свой вызов CreateThread на:

CreateThread( 
        NULL,                   // default security attributes
        0,                      // use default stack size  
        CopyThread,       // thread function name
        MSG2,          // argument to thread function 
        0,                      // use default creation flags 
        NULL); 
0 голосов
/ 17 февраля 2010

Я понял, в чём была моя проблема. Когда я объявил свою тестовую структуру, я добавил туда *.

struct test 
{ 
  struct ddata* difference; 
  int diff; 
}; 
struct test *MSG2;  <-- here

Если убрать старт, он работает нормально:

struct test MSG2;

Спасибо за вашу помощь!

Kampi

...