Explaining C++ (C Binding Library) Function

I’m trying to understand a Function/Method in a Library in order to port it to Java however some parameters don’t make any sense to me and reading the source code the library is based on is not helping.

Function (Note the API has few comments (We can also ignore the calc handle since it’s got a supplier method))
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
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));
}
Calc expected input file data (Only care about the #Notes: ...)

Pastebin

Question

  1. What is NoteInfo in calc_ssr, I don’t know any C or C++ so the *rows to me just seems like a pointer to a Noteinfo instance, however the MinaSDCalc methods requires an Array/Vector which using a pointer to a single instance doesn’t make sense to me (pairing this with the fact that NoteInfo needs another parameter rowTime which I think is time of Note occurrence in the file which means that value must not be constant otherwise the produced result would be inaccurate)

Github Project: https://github.com/kangalioo/minacalc-standalone (The code alone may not explain enough but it’s worth a try; best to look at API.h and discern what’s used from there. Though I do warn you a lot of the Code is esoteric)

Sorry if this doesn’t make much sense but I’ve been looking into this since June/July and this API is the closest abstraction from the bare C++ code I could find.

Answer

  1. NoteInfo * rows here is pass by pointer. So, rows actually is a pointer to an instance of type NoteInfo. This is one of the ways to pass arrays in c++ to a function. Since arrays are contiguous in memory so we can just increment the pointer by one and get the next element of the array.

for example look at these three ways to do exactly one thing, parameter to pass an array to a function :-

1. void myFunction(int *param) {}

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

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

Look into this link for more understanding : https://www.tutorialspoint.com/cplusplus/cpp_passing_arrays_to_functions.htm

Also search for pass by pointer and pass by reference to look into different ways of passing arguments in c++.

2.however the MinaSDCalc methods requires an Array/Vector which using a pointer to a single instance doesn't make sense to me: as to this question of yours, you can now see MinaSDCalc is actually getting an array and not a single instance as passing the pointer is also one of the ways of passing an array in c++.