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);
}
}
void *, will only result in headaches, mysterious bugs, and crashes. It is unclear what this is supposed to do, but one thing is clear: whatever is attempted here, it should be scrapped and rewritten from scratch, without any messyvoid *s, and with strong type-safety. The only practical reason for usingvoid *is when there's a need to interact with legacy C code.numsis not used in find_max except to get the size of the vector, is that correct? In the sample caller codearrnever has any values assigned to it, butfind_maxreads them. Isarrsupposed to be poplated fromnumsandopsin the caller somehow? It's not clear to me what the relationship between nums, ops and arr isarr) is filled with processednumsandopsvalues. I need the two input-data vectors for both functions (at least in this iteration). In other words, assume that I use nums ,besides its use in identifying the dimension, and arr has been initialized to default infinity values.