解释 C++(C 绑定库)函数

Explaining C++ (C Binding Library) Function

我正在尝试理解库中的 Function/Method 以便将其移植到 Java 但是一些参数对我来说没有任何意义并且阅读库的源代码基于没有帮助。

函数(注意 API 的注释很少(我们也可以忽略 calc 句柄,因为它有供应商方法))
Ssr calc_ssr(CalcHandle *calc, NoteInfo *rows, size_t num_rows, float music_rate, float score_goal) {
        std::vector<NoteInfo> note_info(rows, rows + num_rows);

        auto skillsets = MinaSDCalc(
            note_info,
            music_rate,
            score_goal,
            reinterpret_cast<Calc*>(calc)
        );

        return skillset_vector_to_ssr(skillsets);
    }
NoteInfo 结构
struct NoteInfo
{
    unsigned int notes;
    float rowTime;
};
MinaSDCalc
// Function to generate SSR rating
auto
MinaSDCalc(const std::vector<NoteInfo>& NoteInfo,
           const float musicrate,
           const float goal,
           Calc* calc) -> std::vector<float>
{
    if (NoteInfo.size() <= 1) {
        return dimples_the_all_zero_output;
    }
    calc->ssr = true;
    calc->debugmode = false;

    return calc->CalcMain(NoteInfo, musicrate, min(goal, ssr_goal_cap));
}
计算预期的输入文件数据(只关心#Notes: ...

Pastebin

问题

  1. calc_ssr 中的 NoteInfo 是什么,我不知道任何 CC++ 所以 *rows 对我来说只是一个指针到 Noteinfo 实例,但是 MinaSDCalc 方法需要一个 Array/Vector ,它使用指向单个实例的指针对我来说没有意义(将其与 NoteInfo 需要另一个参数 rowTime,我认为这是文件中 Note 出现的时间,这意味着该值不能是常量,否则生成的结果将不准确)

Github 项目:https://github.com/kangalioo/minacalc-standalone(仅凭代码可能解释不够,但值得一试;最好查看 API.h 并辨别那里使用的内容。虽然我这样做警告你很多代码是深奥的)

抱歉,如果这没有多大意义,但我从 June/July 开始就一直在研究这个问题,这个 API 是我能找到的最接近裸露 C++ 代码的抽象。

  1. NoteInfo * rows这里是指针传递。所以,rows 实际上是一个指向 NoteInfo 类型实例的指针。这是在 C++ 中将数组传递给函数的方法之一。由于数组在内存中是连续的,所以我们可以将指针递增 1 并获取数组的下一个元素。

例如看看这三种方法来做一件事,将数组传递给函数的参数:-

1. void myFunction(int *param) {}

2. void myFunction(int param[10]) {}

3. void myFunction(int param[]) {}

查看此 link 以获得更多理解:https://www.tutorialspoint.com/cplusplus/cpp_passing_arrays_to_functions.htm

同时搜索指针传递和引用传递以了解 C++ 中传递参数的不同方式。

2.however the MinaSDCalc methods requires an Array/Vector which using a pointer to a single instance doesn't make sense to me:关于你的这个问题,你现在可以看到MinaSDCalc实际上是在获取一个数组而不是单个实例,因为传递指针也是传递数组的一种方式c++.