将无效参数传递给将无效参数视为致命的函数
An invalid parameter was passed to a function that considers invalid parameters fatal
我希望你能帮助我。我有这个函数,我用来保存位图图像,但我在文件名方面遇到了问题。我想在文件名上保存带有当前日期的图像,但我目前的做法是它给了我"将无效参数传递给认为无效参数致命的函数"错误,程序崩溃。
这是从主程序获取名称的函数:
void DoSave(char *Name)
{
time_t rawTime;
struct tm *timeInfo;
char buffer[100];
string date;
time(&rawTime);
timeInfo = localtime(&rawTime);
strftime(buffer, 100, " %c", timeInfo);
date = buffer;
string url("Images/");
string name(Name);
string extension(".bmp");
string path = url + name + date + extension;
// Open the file for writing
FILE *f = fopen((const char*)&path, "wb");
// Save the image as bmp file
BmpHelper::SaveTo8bppBmpFile(f, (LONG)m_ImageSizeX, (LONG)m_ImageSizeY, (unsigned char*)videoImage);
fclose(f);
}
这是保存位图的函数
void BmpHelper::SaveTo8bppBmpFile(FILE *output, LONG width, LONG height, unsigned char *buffer)
{
f8bppHeader_.bfSize = (DWORD)(s8bppHeader_ + width * height);
i8bppHeader_.biWidth = (LONG)width;
i8bppHeader_.biHeight = -(LONG)height;
fwrite(&f8bppHeader_, sizeof(BITMAPFILEHEADER), 1, output);
fwrite(&i8bppHeader_, sizeof(BITMAPINFOHEADER), 1, output); // I get the error in this line
fwrite(p8bpp, sizeof(RGBQUAD), 256, output);
fwrite(buffer, width, height, output);
}
不确定您是否需要这一点,但我也会添加它。
void BmpHelper::Init8bppHeaders()
{
f8bppHeader_.bfType = 'MB'; // Will be inverted during the fwrite
s8bppHeader_ = (DWORD)(sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD) + 256 * sizeof(RGBQUAD));
f8bppHeader_.bfReserved1 = 0;
f8bppHeader_.bfReserved2 = 0;
f8bppHeader_.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD);
i8bppHeader_.biSize = sizeof(BITMAPINFOHEADER);
i8bppHeader_.biPlanes = 1;
i8bppHeader_.biBitCount = 8;
i8bppHeader_.biCompression = BI_RGB;
i8bppHeader_.biSizeImage = 0;
i8bppHeader_.biXPelsPerMeter = 0;
i8bppHeader_.biYPelsPerMeter = 0;
i8bppHeader_.biClrUsed = 0;
i8bppHeader_.biClrImportant = 0;
for (size_t index = 0; index < 256; ++index)
{
p8bpp[index].rgbBlue = (BYTE)index;
p8bpp[index].rgbGreen = (BYTE)index;
p8bpp[index].rgbRed = (BYTE)index;
p8bpp[index].rgbReserved = 0;
}
}
如果我从路径中删除日期,它可以正常工作,但它只保存带有 url + 名称和文件格式的文件。我需要日期来区分文件。你们能发现代码有什么问题吗?提前谢谢。
日期/时间字符串包含:
个字符。Windows 文件名不接受这些字符中的任何一个/:*?"<>|
。您必须将:
替换为不同的字符。
此外,您的代码不考虑位图填充。仅当位图宽度(以字节为单位(是 4 的倍数时,它才有效。使用以下公式计算size
(而不是width * height
(:
int size = ((width * bpp + 31) / 32) * 4 * height;
s8bppHeader_ = (DWORD)...
是一个错字! bfSize
计算不正确。
您可以使用C++函数std::fstream
而不是混合使用 C++ 和 C
例:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <ctime>
#include <windows.h>
...
std::time_t t = std::time(nullptr);
char date[100];
std::strftime(date, sizeof(date), " %c", std::localtime(&t));
for(size_t i = 0, len = strlen(date); i < len; i++)
if(date[i] == ':')
date[i] = ','; //use a different character
char *Name = "_abc";
string url("c:\test\");
string name(Name);
string extension(".bmp");
string path = url + name + date + extension;
int width = i8bppHeader_.biWidth;
int height = i8bppHeader_.biHeight;
int bpp = i8bppHeader_.biBitCount;
int size = ((width * bpp + 31) / 32) * 4 * height;
f8bppHeader_.bfType = 'MB'; // Will be inverted during the fwrite
f8bppHeader_.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
+ 256 * sizeof(RGBQUAD) + size;
f8bppHeader_.bfReserved1 = 0;
f8bppHeader_.bfReserved2 = 0;
f8bppHeader_.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
+ 256 * sizeof(RGBQUAD);
ofstream fout(path, ios::binary);
fout.write((char*)&f8bppHeader_, sizeof(f8bppHeader_));
fout.write((char*)&i8bppHeader_, sizeof(i8bppHeader_));
fout.write((char*)p8bpp, 256 * sizeof(RGBQUAD));
fout.write((char*)buffer, size);
相关文章:
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 程序中的布尔函数返回输入的范围无论如何都是无效的
- 在这个函数中是有缺陷的,因为取消引用 null 是无效的,所以我想更改代码
- 在 Microsoft Access SQL 中调用自定义 DLL 函数时传递的内存地址无效
- C++无效的函数类型转换
- C++无效使用非静态成员函数?
- 模板和无效函数调用C++
- 控件到达非无效函数的末尾[-Wreturn类型]
- 获取控制权到达非无效函数警告的末尾,尽管我在 th 函数中有返回语句
- C++ 指针无效函数问题
- 为什么我总是得到 - 警告:控制达到非无效函数的末尾 [-Wreturn-type]
- 在无效函数中使用退出来纠正错误是否是一种好的做法
- 在C++ 通过按键进入和退出无效函数调用
- 指向指向无效函数参数的指针
- Xcode - 控制到达非无效函数运算符错误的末尾
- C++:对无效函数的未定义引用
- 二叉树无效函数
- 控件到达非无效函数的末尾
- 控件到达非无效函数的末尾
- 控制可能会到达非无效函数 xcode 的末尾