Ads 468x60px

##EasyReadMore##

22 9月, 2017

[C] pthread 傳值 error: cast from 'void*' to 'int' loses precision 型別資料轉換

編譯下面的 code 出現 error: cast from 'void*' to 'int' loses precision  錯誤:

static void *create_alarm_thread(void *port){
	int test=0;
	
	alarm_execute alr_exe;
	alr_exe.SocketRcv((int)port);
	pthread_exit(&test);
	
}

(int)port 這樣做通常是用在常數間型態的強制轉換

至於port 轉 int 是不同型別資料之轉換

雖然有些 compiler 可以編譯沒問題

也就是說該 compiler 有幫你做修正

void *port 要轉成 int 正確作法如下:

*((int*)(&port))

拆解成下面的步驟:

*()  <-(int*)   <-(&port)
(取值)<-(指標轉型)<-(取址)

所以應該要改成這樣:

static void *create_alarm_thread(void *port){
	int test=0;

	alarm_execute alr_exe;
	alr_exe.SocketRcv(*((int*)(&port)));
	pthread_exit(&test);
	
}


alarm_thread::alarm_thread(int server_port, pthread_t &tt){
	int retval;

	printf("Create_sub_thread\n");
	retval = pthread_create(&tt, NULL, &create_alarm_thread, (void *)server_port);
	if (retval) {
		printf("Create_alarm_thread fail\n");
	}

	printf("Create_alarm_thread ok\n");
}

PS:雖然 改成 *(int *)port 也會過 但在執行上會出現 segment fault

Refer:

C 語言:型別轉換 (Type Casting) 技巧之二 (不同型別資料之轉換) @ 傑克! 真是太神奇了! :: 痞客邦 PIXNET :: - https://goo.gl/8uxn1T

c++ - error: cast from 'void*' to 'int' loses precision - Stack Overflow - https://goo.gl/Y6PA4h

程式語言教學誌 FB, YouTube: PYDOING: C 語言快速導覽 - 型態轉換 - https://goo.gl/ySc7rx

0 意見:

張貼留言

 
Blogger Templates