Вопрос:
Я работаю над проектом, где мне нужно преобразовать некоторые длинные переменные в BCD.
У меня уже есть код, который работает, но я чувствую, что его можно улучшить…
void main(void){ unsigned long input = 0; unsigned long convert = 0; float convert2 = 0; char buffer[200]; unsigned char Ones, Tens, Hundreds, Thousands, TenThousands, HundredThousands; printf(«Input: «); scanf(«%d», &input); convert = input*12; convert2 = input * 0.0001224896; BCD(convert, &Ones, &Tens, &Hundreds, &Thousands, &TenThousands, &HundredThousands); sprintf(buffer, «%d%d%dKG», HundredThousands, TenThousands, Thousands); printf(«nnInputted: %d», input); printf(«nADC Conversion: %d», convert); printf(«nBCD Conversion: %s», buffer); printf(«nFloat Conversion: %f», convert2); getchar(); getchar(); } void BCD (unsigned long Pass, unsigned char *Ones, unsigned char *Tens, unsigned char *Hundreds, unsigned char *Thousands, unsigned char *TenThousands, unsigned char *HundredThousands){ unsigned char temp1, temp2, temp3, temp4, temp5, temp6; unsigned int count = 0; *Ones = 0; *Tens = 0; *Hundreds = 0; *Thousands = 0; *TenThousands = 0; *HundredThousands = 0; temp1 = 0; temp2 = 0; temp3 = 0; temp4 = 0; temp5 = 0; temp6 = 0; for(count = 0; count <= 31; count++){ if (*Ones >= 5){ *Ones = (*Ones + 3)&0x0F; } if (*Tens >= 5){ *Tens = (*Tens + 3)&0x0F; } if (*Hundreds >= 5){ *Hundreds = (*Hundreds + 3)&0x0F; } if (*Thousands >= 5){ *Thousands = (*Thousands + 3)&0x0F; } if (*TenThousands >= 5){ *TenThousands = (*TenThousands + 3)&0x0F; } if (*HundredThousands >= 5){ *HundredThousands = (*HundredThousands + 3)&0x0F; } temp1 = (Pass & 2147483648) >> 31; temp2 = (*Ones & 8) >> 3; temp3 = (*Tens & 8) >> 3; temp4 = (*Hundreds & 8) >> 3; temp5 = (*Thousands & 8) >> 3; temp6 = (*TenThousands & 8) >> 3; Pass = Pass << 1; *Ones = ((*Ones << 1) + temp1) & 15; *Tens = ((*Tens << 1) + temp2) & 15; *Hundreds = ((*Hundreds << 1) + temp3) & 15; *Thousands = ((*Thousands << 1) + temp4) & 15; *TenThousands = ((*TenThousands << 1) + temp5) & 15; *HundredThousands = ((*HundredThousands << 1) + temp6) & 15; printf(«nnLoop: %dnOnes: %dn», count, *Ones); printf(«Tens: %dn», *Tens); printf(«Hundreds: %dn», *Hundreds); printf(«Thousands: %dn», *Thousands); printf(«TenThousands: %dn», *TenThousands); printf(«HundredThousands: %dn»,*HundredThousands); } }
Проблема, с которой я сталкиваюсь, заключается в том, что она кажется беспорядочной и неэффективной. Я думал, что вместо использования нескольких переменных для каждого блока BCD (Ones, Tens и т.д.) Я мог бы использовать массивы для выполнения одного и того же процесса. Я реализовал это в коде, но у меня есть несколько проблем. Кажется, что в коде отображается эквивалентный элемент “Ones”. Я также прошел через код и обнаружил, что другие элементы не заполняются во время процесса преобразования. Любые указания относительно того, что происходит?
Реализация массива:
void main(void){ unsigned long input = 0; unsigned long convert = 0; char buffer[200]; unsigned char BCD_Units[6]; unsigned char temp[6]; unsigned int count = 0; unsigned int count1 = 0; unsigned char buff_store = 0; unsigned char buff_store2 = 0; printf(«Input: «); scanf(«%d», &input); convert = input; memset(temp, 0, sizeof(temp)); memset(BCD_Units, 0, sizeof(BCD_Units)); for(count = 0; count <= 31; count++){ for (count1 = 0; count1 < 6; count1++){ if (BCD_Units[count1] >= 5){ buff_store = BCD_Units[count1]; buff_store = ((buff_store + 3) & 15); BCD_Units[count1] = buff_store; } } temp[0] = (convert & 2147483648) >> 31; for (count1 = 0; count1 < 5; count1++){ buff_store = BCD_Units[count1]; temp[(count+1)] = (buff_store & 8) >> 3; } convert = convert << 1; for(count1 = 0; count1 < 6; count1++){ buff_store = BCD_Units[count1]; buff_store2 = temp[count1]; buff_store = ((buff_store << 1) + buff_store2) & 15; BCD_Units[count1] = buff_store; temp[count1] = buff_store2; } printf(«nnLoop: %dnOnes: %dn», count, BCD_Units[0]); printf(«Tens: %dn», BCD_Units[1]); printf(«Hundreds: %dn», BCD_Units[2]); printf(«Thousands: %dn», BCD_Units[3]); printf(«TenThousands: %dn», BCD_Units[4]); printf(«HundredThousands: %dn», BCD_Units[5]); } sprintf(buffer, «%d%d%dKG», BCD_Units[5], BCD_Units[4], BCD_Units[3]); printf(«nnInputted: %d», input); printf(«nBCD Conversion: %s», buffer); getchar(); getchar(); }
PS. В настоящий момент я просто играю с идеями. Я планирую разделить код на функции на более поздний срок.
Ответ №1
этот код кажется чрезвычайно сложным. Вам просто нужно сделать следующее
make a buffer loop till n = 0 get n % 10 (get digit) or digit into left or right nibble of curretn buffer byte (need a toggle for left or right) increment buffer pointer if filled left nibble n = n / 10
попробуйте преобразовать целое число из (чистого) двоичного кода в BCD