I have a function in C++ that looks like:
//ellipsis are irrelevant variables. Not variadic
lint find_max(const void* ptr, ... , const vector<lint> &nums, ...)
{
const mm (*arr)[nums.size()] = (const mm (*)[nums.size()]) ptr;
//or
const mm (*arr1)[nums.size()] = reinterpret_cast<const mm (*)[nums.size()]>
(ptr);
}
The two casts produce an error with little detail as to why.
error: cannot convert ‘const mm (*)[(<anonymous> + 1)]’ {aka ‘const min_and_max (*)[(<anonymous> + 1)]’} to ‘const mm (*)[(<anonymous> + 1)]’ {aka ‘const min_and_max (*)[(<anonymous> + 1)]’} in initialization
42 | const mm (*arr)[nums.size()] = (const mm(*)[nums.size()])ptr;
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| |
| const mm (*)[(<anonymous> + 1)] {aka const min_and_max (*)[(<anonymous> + 1)]}
If I am not mistaken, both lvalue type and the corresponding cast is similar. For future reference, should I have more than 2 dimensions, how can I add them? I'm still an amateur in pointer manipulation so this will help alot.
EDIT this does not produce any errors in g++:
typedef long long int lint;
lint pInf = ~((unsigned long long int)0) >> 1;
lint nInf = ~pInf;
typedef struct min_and_max
{
lint min{pInf};
lint max{nInf};
}mm;
const lint find_max(const void* ptr, int i, int j, const vector<lint> &nums,
const vector<char> &ops)
{
const int dim = nums.size();
const mm (*arr)[dim] = reinterpret_cast<const mm (*)[dim]>
(ptr);
//algorithm which I haven't figured out yet.
some_lint_value = arr[i][j].max + arr[i-232414][j+46846].min;
return some_lint_value;
}
void caller(vector<lint> &nums, vector<char> &ops)
{
mm arr[ops.size()][nums.size()]; //ISO variable size forbid warn
for (int i = 1; i <= ops.size(); i++)
{
for (int j = 1; j <= nums.size(); j++)
//looped logic for solving the max/min value for an expression problem
arr[i][j].max = find_max(arr, i, j, nums, ops);
}
}