我的'next offset'算法中的错误 - C++
Bug in my 'next offset' algorithm - C++
我正在尝试将文件名应用于从存档加载的文件。
在第一步中,我创建了一个包含三位信息的结构体数组。文件名,文件大小和文件中的偏移量(从开始)。文件大小和偏移量最初被读入结构体。然后,我解码文件名并将其读入vector。
这就是棘手的地方。按顺序排列的文件名适用于偏移量的顺序。然而,抵消是不有序的。例如:
File 1:
Name:
Size: 20102
Offset: 16
File 2:
Name:
Size: 23419
Offset: 2040
File 3:
Name:
Size: 145
Offset: 350
有三个文件名解码成我的向量,我将文件名#1应用到文件1,文件名#2应用到文件3(因为它有一个较低的偏移量),最后文件名#3应用到文件2。
现在,我做这个的算法似乎不能正确工作。下面是代码:
// Keep track of the last offset we used
int last_offset = 0;
int current_offset = 0;
int index = 0;
// Finally, apply the correct filenames to the correct files
for(int i = 0; i < file_names.size(); i++)
{
for(int j = 0; j < file_count - 1; j++)
{
if(j == 0)
{
current_offset = files[j].offset;
}
if(files[j].offset > last_offset && files[j].offset < current_offset)
{
index = j;
current_offset = files[j].offset;
}
}
files[index].name = file_names[i];
last_offset = current_offset;
}
file_names是包含字符串的向量。File_count被减去1,因为它包含归档的目录文件,不需要对其进行计数。它也是最大的偏移量,因此甚至不处理。
基本上,这段代码每次都试图找到下一个最高偏移量,然后在vector中应用下一个文件名。
下面是我的错误日志的输出:
<-!-> File debug name:
<-!-> File size: 17464
<-!-> File offset: 47974
<-!-> File debug name: 1dirt.bmp
<-!-> File size: 17462
<-!-> File offset: 12
<-!-> File debug name: rrock.bmp
<-!-> File size: 17464
<-!-> File offset: 17011
<-!-> File debug name: mtfloor.bmp
<-!-> File size: 5176
<-!-> File offset: 30725
<-!-> File debug name:
<-!-> File size: 17640
<-!-> File offset: 134953
<-!-> File debug name:
<-!-> File size: 158
<-!-> File offset: 140286
<-!-> File debug name:
<-!-> File size: 134188
<-!-> File offset: 81658
<-!-> File debug name: lights.wld
<-!-> File size: 17464
<-!-> File offset: 34273
<-!-> File debug name:
<-!-> File size: 1496
<-!-> File offset: 139799
<-!-> File debug name:
<-!-> File size: 17464
<-!-> File offset: 61625
这表明它显然没有工作。
我可以做的另一个选择是按偏移量升序排序struct数组,我不知道怎么做,但会使这个过程更容易,因为我可以按顺序应用名称。
感谢您的时间,如果您看到错误请告诉我
排序,排序,排序!否则你将得到一个O(N2)算法。不好的。但是您不必对files
进行排序,而是构建files
数组的排序索引,如下所示:
#include <algorithm>
#include <vector>
struct CompareOffset {
bool operator ()(const file_type* x, const file_type* y) const {
return x->offset < y->offset;
}
};
vector<file_type*> vec;
for(size_t i = 0; i < files.size(); i++)
vec.push_back(&files[i]);
std::sort(vec.begin(), vec.end(), CompareOffset());
for(size_t i = 0; i < file_names.size(); i++)
vec[i]->name = file_names[i];
这里file_type
是你的struct
描述一个文件
你是正确的,你最好先排序你的偏移量,但具体的错误在你的算法是如何初始化current_offset
。就在for (j ...
循环之外,你需要将其设置为"无穷大",或者一些偏移值如此之高,以至于它不会阻止通过last_offset
测试的第一个j
成为电流。
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 在某些循环内使用vector.push_back时出现分段错误
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 错误:未在此范围内声明'reverse'