У меня проблема с функцией, которая должна печатать любой тип целого числа на моем KS0108 lcd. Здесь возникает проблема: когда я хочу скопировать void* numb
значение в void* temp
в первый swtich - ничего не происходит. во втором переключателе при использовании %I
получить 0
. (Значение void* numb
о 48
и тип _uint8_t
) Код:копировать значение указателя void C
void glcd_WriteInt(void* numb, type type)
{
void* temp = 0;
int8_t buff[10];
int8_t size = 0;
int8_t flag = 1;
int8_t sign = 1;
switch(type)
{
case _int8_t: memcpy(temp, numb, sizeof(int8_t)); break;
case _int16_t: memcpy(temp, numb, sizeof(int16_t)); break;
case _int32_t: memcpy(temp, numb, sizeof(int32_t)); break;
case _int64_t: /*memcpy(temp, numb, sizeof(int64_t)); break;*/return; //if want 64 - uncomment
case _uint8_t: *(uint8_t*) temp = *(uint8_t*) numb/*memcpy(temp, numb, sizeof(uint8_t))*/; break;
case _uint16_t: memcpy(temp, numb, sizeof(uint16_t)); break;
case _uint32_t: memcpy(temp, numb, sizeof(uint32_t)); break;
case _uint64_t: /*memcpy(temp, numb, sizeof(uint64_t)); break;*/return; //if want 64 - uncomment
}
while(flag)
{
switch(type)
{
case _int8_t:
buff[size] = *(int8_t*) temp % 100;
flag = (*(int8_t*) temp /= 100) != 0;
break;
case _int16_t:
buff[size] = *(int16_t*) temp % 100;
flag = (*(int16_t*) temp /= 100) != 0;
break;
case _int32_t:
buff[size] = *(int32_t*) temp % 100;
flag = (*(int32_t*) temp /= 100) != 0;
break;
case _int64_t:
/*buff[size] = *(int64_t*) temp % 100; //if want 64 - uncomment
flag = (*(int64_t*) temp /= 100) != 0;*/
break;
case _uint8_t:
buff[size] = *(uint8_t*) temp % 100;
flag = (*(uint8_t*) temp /= 100) != 0;
break;
case _uint16_t:
buff[size] = *(uint16_t*) temp % 100;
flag = (*(uint16_t*) temp /= 100) != 0;
break;
case _uint32_t:
buff[size] = *(uint32_t*) temp % 100;
flag = (*(uint32_t*) temp /= 100) != 0;
break;
case _uint64_t:
/*buff[size] = *(uint64_t*) temp % 100; //if want 64 - uncomment
flag = (*(uint64_t*) temp /= 100) != 0;*/
break;
}
if(buff[size] < 0){
buff[size] = -buff[size];
sign = -1;
}
size++;
}
if(sign == -1) glcd_Character((char) 45);
glcd_WIntTab(buff, size);
}
Я попытался версии с memcpy
, и как здесь: слепки. Удивительно, что эта функция была в порядке несколько дней назад.
Удивительно, что он когда-либо работал; не удивительно, что это может потерпеть неудачу по-разному. Вы копируете в пространство, на которое указывает 'temp'. 'temp == NULL', так что вряд ли получится хорошо. –
может быть вам нужен 'union' вместо' void * '. –
Поскольку все это работало несколько дней назад, почему бы вам не вернуться к версии, которую вы проверили в своей VCS (системе управления версиями), когда она работает _was_? (О, вы не использовали VCS? Теперь вы знаете, почему вы всегда должны использовать VCS, если вы будете заботиться о том, что происходит, когда вы что-то меняете.) –