【发布时间】:2020-09-30 06:33:41
【问题描述】:
我正在测试一个压缩库,它对我来说工作正常,但我需要一个包装函数来避免一些不需要的参数。库调用如下所示:
typedef int WINAPI OodleLZ_CompressFunc(
uint32_t codec, char *src_buf, uint64_t src_len, char *dst_buf, int64_t level,
void *opts, int64_t offs);
typedef int WINAPI OodleLZ_DecompressFunc(
char *src_buf, int64_t src_len, char *dst_buf, uint64_t dst_size, int fuzz, int crc, int verbose,
uint8_t *dst_base, size_t e, void *cb, void *cb_ctx, void *scratch, size_t scratch_size, int threadPhase
);
我分配的职能如下:
OodleLZ_CompressFunc* oodl_compress;
OodleLZ_DecompressFunc* oodl_decompress;
当我调用解压缩函数时,使用 oodl_compress 和 oodl_decompress 的压缩函数一切正常。但是,当我为函数创建包装器时,压缩停止工作。
工作场景:
// Predefined data, compressed_size, decompressed_size
char *dec_data = new char [decompressed_size];
oodl_decompress(data, compressed_size, dec_data, decompressed_size, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
char *com_data = new char [decompressed_size + 0x10000];
oodl_compress(c_type, dec_data, decompressed_size, com_data, c_level, 0, 0); //c_type and c_level are constants (7 in this case)
当我创建包装器Decompress 时,调用Decompress 有效,但调用oodl_compress 不再有效。
Decompress:
int Decompress(char* src_buf, int64_t src_len, char* dst_buf, uint64_t dst_len)
{
oodl_decompress(src_buf, src_len, dst_buf, dst_len, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
}
main.cpp:
// Predefined data, compressed_size, decompressed_size
char *dec_data = new char [decompressed_size];
Decompress(data, compressed_size, dec_data, decompressed_size);
char *com_data = new char [decompressed_size + 0x10000];
oodl_compress(c_type, dec_data, decompressed_size, com_data, c_level, 0, 0); //c_type and c_level are constants (7 in this case)
发生的情况是,在第二种情况下调用oodl_compress时,程序会冻结1秒钟然后退出,没有任何错误。之后我有代码将 fout<< 放入文件中,我可以看到在第二种情况下文件是空的,在第一种情况下文件被重新压缩,代表数据的原始状态。
我似乎不知道我的问题出在哪里,因为我只是将变量重新传递到另一个函数中,该函数只是用 0 填充剩余的参数,而不是将它放在 main 中。我知道这不是必需的,但了解这种情况下的问题将有助于我在未来避免这种情况。
【问题讨论】:
-
我和你一起完全没有发现任何错误,但可能有一个更早的错误最终被函数暴露出来。
-
@user4581301 上一个代码是
ifstream fin("file.bin", ios::binary); char data[100]; fin.read(data, 100);,下一个代码是ofstream fout("file.dec", ios::binary); for (int i = 0; i < decompressed_data; i++) fout<<dec_data[i]; -
你在哪里(以及如何)将实际的函数地址分配给你的函数指针?
-
@AdrianMole 在一个名为 Oodle 的类中,在一个名为 resolve_functions() 的函数中。问题不在于函数分配,因为它在其他场景中工作。