调试断言失败

时间:2011-07-18 13:56:40

标签: c++

使用Visual Studio 2010,C ++。 编程水平:初学者。

我有一本Windows游戏编程大师的书中的代码,到目前为止我已经遇到了我偶然发现的所有问题。

但我不知道它是什么。

以下是错误的屏幕截图:

enter image description here

这是一个很好的8位图像...

现在,它说文件:f:\ dd ...

在我的情况下f:驱动器是空的CD-ROM ...

这就是我认为错误发生的地方:

_lseek(file_handle, -((int) (bitmap->bitmapinfoheader.biSizeImage)), SEEK_END);   

这是什么东西?

5 个答案:

答案 0 :(得分:3)

f:\dd目录是“C运行时库”(CRT)的源代码所在的位置。由于Microsoft构建了它,它与您的F:驱动器不对应。

无论如何,CRT检测到其中一个文件句柄是错误的。你把它传递给CRT,所以你应该检查它为什么是错的。如果按重试,您将被置于调试器中。在那里,您可以看到哪些函数放在错误的文件句柄中。

但它不会告诉你为什么句柄错误。一个常见的原因是你试图打开一个文件,忘了检查它是否成功。如果文件名有效,您只能获得文件句柄,并且您可以读取该文件。

答案 1 :(得分:2)

断言发生在C库中。它确保您将有效参数传递给lseek()函数。

在对文件执行open()creat()后,您可能没有检查错误。

答案 2 :(得分:1)

看起来你的file_handle错了。你确定你的图像开放成功吗?

答案 3 :(得分:0)

使用C ++ ifstream而不是低级IO功能的全功能代码。 乔纳森和我试图使_lseek工作只是为了得出结论它不起作用...... 不知道这是否完全正确,也许有一些方法可以正常工作。 如果您(读者)知道,请随时给我发消息。 该功能现在可以正常工作,虽然主程序显示错误的图像,但这不是问题的问题,_lseek事情已经解决了:)

int Load_Bitmap_File(BITMAP_FILE_PTR bitmap, char *filename)   
{   
    int file_handle = 0;        // the file handle
    int index = 0;                  // looping index   
    int bitmapWidth = 0;
    int bitmapHeight = 0;
    int bitmapSize = 0;
    UCHAR *temp_buffer = NULL; // used to convert 24 bit images to 16 bit   
    streampos pos_cur;

    ifstream bitmapFile = ifstream ();
    bitmapFile.open (filename, ifstream::in);
    if (! bitmapFile.is_open ())
    {
    printError ("Error: OpenFile function failure. ");

        // abort
        return(0);
    }


    // load the bitmap file header:   
    //_lread(file_handle, &(bitmap->bitmapfileheader), sizeof(BITMAPFILEHEADER)); 
    bitmapFile.read ((char *) &(bitmap->bitmapfileheader), sizeof (BITMAPFILEHEADER));

    // test if this is a bitmap file   
    if (bitmap->bitmapfileheader.bfType != BITMAP_ID)   
    {   
        // close the file   
        //_lclose(file_handle);   
        bitmapFile.close ();
        printError ("error: wrong bitmap type");
        cout << "error: wrong bitmap type" << endl;
        // return error   
        return(0);   
    } // end if   

    // now we know this is a bitmap, so read in all the sections.   
    if (bitmap->bitmapinfoheader.biSizeImage == 0)
    printError ("error: biSizeImage equals 0");


    // now the bitmap infoheader:   

    //_lread(file_handle, &bitmap->bitmapinfoheader, sizeof(BITMAPINFOHEADER));   
    bitmapFile.seekg (sizeof (BITMAPFILEHEADER), ios::beg);
    pos_cur = bitmapFile.tellg (); // save current stream position
    bitmapFile.read ((char *) &(bitmap->bitmapinfoheader), sizeof (BITMAPINFOHEADER));

    //cout << bitmap->bitmapinfoheader.biBitCount << endl;


    // now load the color palette if there is one   
    if (bitmap->bitmapinfoheader.biBitCount == 8)   
    {   
        //_lread(file_handle, &bitmap->palette, MAX_COLORS_PALETTE * sizeof(PALETTEENTRY));   
        // not tested: 
        bitmapFile.read ((char *) &(bitmap->palette), MAX_COLORS_PALETTE * sizeof(PALETTEENTRY)); 

        // now set all the flags in the palette correctly and fix the reversed    
        // BGR RGBQUAD data format   
        for (index = 0; index < MAX_COLORS_PALETTE; index++)   
        {   
            // reverse the red and green fields   
            int temp_color                = bitmap->palette[index].peRed;   
            bitmap->palette[index].peRed  = bitmap->palette[index].peBlue;   
            bitmap->palette[index].peBlue = temp_color;   

            // always set the flags word to this   
            bitmap->palette[index].peFlags = PC_NOCOLLAPSE;   
        } // end for index   

    } // end if   

    bitmapWidth = bitmap->bitmapinfoheader.biWidth * (bitmap->bitmapinfoheader.biBitCount / 8);
    bitmapHeight = bitmap->bitmapinfoheader.biHeight; 
    bitmapSize = bitmapWidth * bitmapHeight;


    // finally the image data itself:  
    //_lseek(file_handle, -((int) (bitmap->bitmapinfoheader.biSizeImage)), SEEK_END);
    bitmapFile.seekg (-((int) bitmapSize), ios::end);
    //bitmapFile.seekg (sizeof (BITMAPINFOHEADER) + sizeof (BITMAPFILEHEADER) + MAX_COLORS_PALETTE * sizeof(PALETTEENTRY), ios::beg);

    // now read in the image, if the image is 8 or 16 bit then simply read it   
    // but if its 24 bit then read it into a temporary area and then convert   
    // it to a 16 bit image   

    if (bitmap->bitmapinfoheader.biBitCount == 8  || 
         bitmap->bitmapinfoheader.biBitCount == 16 ||    
         bitmap->bitmapinfoheader.biBitCount == 24)   
    {   
        // delete the last image if there was one   
        if (bitmap->buffer)   
            free(bitmap->buffer);   

        // allocate the memory for the image   
        //if (!(bitmap->buffer = (UCHAR *) malloc (bitmap->bitmapinfoheader.biSizeImage))) // error: biSizeImage == 0 !
        if (!(bitmap->buffer = (UCHAR *) malloc (bitmapSize)))
        {   
            // close the file   
            //_lclose(file_handle);   
            bitmapFile.close ();

            // return error   
            return(0);   
        } // end if   

        // now read it in   
        //_lread(file_handle, bitmap->buffer, bitmap->bitmapinfoheader.biSizeImage);  
        bitmapFile.read ((char *) (bitmap->buffer), bitmapSize);

    } // end if   
    else   
    {   
        // serious problem   
        return(0);   

    } // end else   


    // close the file   
    //_lclose(file_handle);  
    bitmapFile.close ();

    // flip the bitmap   

    Flip_Bitmap(bitmap->buffer,    
                    bitmap->bitmapinfoheader.biWidth * (bitmap->bitmapinfoheader.biBitCount / 8),
                    bitmap->bitmapinfoheader.biHeight);   
    //cout << "biSizeImage: " << bitmap->bitmapinfoheader.biSizeImage << endl;
    //cout << (bitmap->bitmapinfoheader.biWidth * (bitmap->bitmapinfoheader.biBitCount / 8)) * bitmap->bitmapinfoheader.biHeight << endl;

    // return success   
    return(1);   

} // end Load_Bitmap_File   

///////////////////////////////////////////////////////////   

当前完整源代码: http://pastebin.com/QQ6fMD7P 到期日期设置为从不。

感谢所有人为这个问题做出贡献!

答案 4 :(得分:0)

lseek因调试断言失败错误而崩溃,因为它是16位函数。我通过查看Microsoft网站上的16位和32位函数图表发现了这一点。

解决方案是使用_llseek。 _llseek是32位功能,可以在64位计算机上运行。 您无需将_lseek的任何参数更改为使用_llseek。

_lseek(file_handle, -((int) (bitmap->bitmapinfoheader.biSizeImage)), SEEK_END); 

成为

_llseek(file_handle, -((int) (bitmap->bitmapinfoheader.biSizeImage)), SEEK_END);