void pointer ve tip dönüşümü/geridönüşümü? (C dili)

Başlatan ucahmetuc, 14 Eylül 2015, 14:29:53

ucahmetuc

Selam arkadaşlar...
(void *) konusunu pekiştirmek adına basit bir projemde kendisini kullanmaya çalışıyorum. Ancak çözümünü bilemediğim bir durum var. şöyle ki;

elimde farklı tiplerde değişkenler var ve bunları (void *) yoluyla bir fonksiyon içinde okumak/güncellemek istiyorum. ancak tip dönüşümlerinin tam olarak nasıl yapılması gerektiğini anlayamadım. sorumu anlatmak için bir fonksiyon yazayım:
static char digits[5];
void func(void *vptr){
	digits[0] = (*(TYPE *)vptr)%10;
	digits[1] = ((*(TYPE *)vptr)/10)%10;
	digits[2] = ((*(TYPE *)vptr)/100)%10;
	digits[3] = ((*(TYPE *)vptr)/1000)%10;
	digits[4] = ((*(TYPE *)vptr)/10000)%10;
	
	if(digits[1]<9) digits[1]++;
	else digits[1]=0;
	
	*(TYPE *)vptr = digits[0];
	*(TYPE *)vptr += digits[1]*10;
	*(TYPE *)vptr += digits[2]*100;
	*(TYPE *)vptr += digits[3]*1000;
	*(TYPE *)vptr += digits[4]*10000;
}

yukarıdaki kodda vptr göstericisinin cast edileceği tipi kısa bir yolla belirleyebilir miyiz?
aklıma sizeof yardımı ile şöyle bir kod yazmak gelmişti ama bu durumda void kullanmak çok da verimli gibi gelmediği için belki daha doğrusu vardır diye öğrenme arayışına girdim:
static char digits[5];
void func(void *vptr, size_t size){
	if(size==1){
		digits[0] = (*(uint8_t *)vptr)%10;
		digits[1] = ((*(uint8_t *)vptr)/10)%10;
		digits[2] = ((*(uint8_t *)vptr)/100)%10;
		
		if(digits[1]<9) digits[1]++;
		else digits[1]=0;
		
		*(uint8_t *)vptr = digits[0];
		*(uint8_t *)vptr += digits[1]*10;
		*(uint8_t *)vptr += digits[2]*100;
	}else if(size==2){
		digits[0] = (*(uint16_t *)vptr)%10;
		digits[1] = ((*(uint16_t *)vptr)/10)%10;
		digits[2] = ((*(uint16_t *)vptr)/100)%10;
		digits[3] = ((*(uint16_t *)vptr)/1000)%10;
		digits[4] = ((*(uint16_t *)vptr)/10000)%10;
		
		if(digits[1]<9) digits[1]++;
		else digits[1]=0;
		
		*(uint16_t *)vptr = digits[0];
		*(uint16_t *)vptr += digits[1]*10;
		*(uint16_t *)vptr += digits[2]*100;
		*(uint16_t *)vptr += digits[3]*1000;
		*(uint16_t *)vptr += digits[4]*10000;
	}
}