我的'next offset'算法中的错误 - C++

Bug in my 'next offset' algorithm - C++

本文关键字:错误 C++ offset next 我的 算法      更新时间:2023-10-16

我正在尝试将文件名应用于从存档加载的文件。

在第一步中,我创建了一个包含三位信息的结构体数组。文件名,文件大小和文件中的偏移量(从开始)。文件大小和偏移量最初被读入结构体。然后,我解码文件名并将其读入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成为电流。