浮动灌溉的划分算法

时间:2013-01-30 23:30:19

标签: c algorithm division

//------------------------------------------------------------------------------------------//
//  divisionAlg -- This will take the incoming value and "asciify" each byte according to
//                 a character lookup table
//
//  Parameters:
//      unsigned int value -- the value to be asciified
//
//------------------------------------------------------------------------------------------//

void divisionAlg(unsigned int value);

int main(int argc, char *argv[])        // Always remember to pass an argument while executing
{
 divisionAlg(45);
}

void divisionAlg(unsigned int value)
{
    int MAX_REM=2;
    int MAX_BASE=10;
    const char *charTable = {"0123456789ABCDEF"};  // lookup table for converting remainders
    char rembuf[MAX_REM + 1];   // holds remainder(s) and provision null at the end
    int  index;                 // 
    int  i;                     // loop variable

    unsigned int rem;           // remainder
    unsigned int base;          // we'll be using base 10 
    ssize_t numWritten;         // holds number of bytes written from write() system call

    base = 10;

    // validate base
    if (base < 2 || base > MAX_BASE)
        err_sys("oops, the base is wrong");

    // For some reason, every time this method is called after the initial call, rembuf
    // is magically filled with a bunch of garbage; this just sets everything to null.
    // NOTE: memset() wasn't working either, so I have to use a stupid for-loop
    for (i=0; i<MAX_REM; i++)
        rembuf[i] = '\0';

    rembuf[MAX_REM] = 0;    // set last element to zero
    index = MAX_REM;        // start at the end of rembuf when adding in the remainders

    do
    {
        // calculate remainder and divide valueBuff by the base
        rem = value % base;
        value /= base;

        // convert remainder into ASCII value via lookup table and store in buffer
        index--;
        rembuf[index] = charTable[rem];

    } while (value != 0);

    // display value
    if ((numWritten = write(STDOUT_FILENO, rembuf, MAX_REM + 1)) == -1)
        err_sys("something went wrong with the write");

} // end of divisionAlg()

我正在尝试制作一个除法算法而且我不知道为什么不能正常工作,请帮忙!

这个“划分alg”用于获取传入值并根据字符查找表“asciify”每个字节

1 个答案:

答案 0 :(得分:0)

我认为这就是原因:

首先将整个数组(长度为MAX_REM + 1,例如0到MAX_REM为有效索引)初始化为空(0x00)。所以rembuf看起来像这样(0x00是ascii null):

'0x00','0x00','0x00','0x00','0x00','0x00',...'0x00','0x00','0x00','0x00'

现在,我们通过执行以下操作将值插入rembuf:

index = MAX_REM;
index--;
rembuf[index] = charTable[rem];

因此,如果我们在12上运行你的算法,那么在循环结束时我们可能会有这样的东西:

'0x00','0x00','0x00','0x00','0x00','0x00',...'0x00','1','2','0x00'

现在打印你这样做:

if ((numWritten = write(STDOUT_FILENO, rembuf, MAX_REM + 1)) == -1)

问题是你传递了它rembuf。当它从rembuf读取时,它立即看到0x00,并决定'这个字符串是空的,我无事可做'。你实际上应该做的是传递一个指针,指向你的号码开始的位置 - '1'在内存中。 (编辑:正如评论所说,write()写出的字节数与你告诉的一样多,并且不会在空值上停止,所以这不是原因)

编辑:当你在它时,MAX_REM应该更大(对于将2 ^ 32保持为字符串的情况,它需要为10 - 对于2 ^ 64,需要20)