I have the following function:
/* Calculate if there is an intersection with given intial position and
direction */
vector<double> intersection(vector<double> startPos, vector<double> direction)
{
if(there is intersection)
return (intersection coordinates);
else {
return NULL;
}
}
Could I do this and check against NULL
if an intersection exists:
vector<double> v = intersection(pos, dir);
if(v == NULL)
/* Do something */
else
/* Do something else */
If this is not allowed/bad coding practice, what is another way I may go about this?
But practically there is no such term as a null vector but we can return a null vector in C++. Include necessary header files. Declare using std::cout and std::vector. Declare function with vector type return type which accepts vector as a variable. Then return null vector inside function body.
You cannot set a value type to null (which includes data types like String, int, float, char, and also includes structs). But that will require casting into a normal Vector3 for use. Setting it to zero is not the same as setting it to null. As null it doesn't exist, as zero it's at a specific value. McGravity, EDartBlade and pgomes like this.
In most cases, a function will return NULL if any of its arguments are NULL (but there are exceptions). Many built-in functions can return NULL even if none of the arguments are NULL. In fact, that's the whole point of the NULLIF function.
A std::vector<int> is always a vector, it is never NULL (or equal to nullptr ). The reason you can't return remainderResult.push_back (numbers [i]); is because the result of push_back is nothing, not the vector. You will need to push_back then return.
NULL
really is only a concept of pointers. Since we have a container we can check something else, namely, whether or not the container is empty
. If it is then we know we have no elements and if it is not then we know there is stuff to process. That lets you write code like
vector<double> intersection(vector<double> startPos, vector<double> direction)
{
if(there is intersection)
return (intersection coordinates);
else {
return {}; // this means return a default constructed instance
}
}
and then you can use it like
vector<double> v = intersection(pos, dir);
if(v.empty())
/* Do something */
else
/* Do something else */
Also note that if you want to get a set intersection you can use std::set_intersection
and use it like
#include <iostream> #include <vector> #include <algorithm> #include <iterator> int main() { std::vector<int> v1{1,2,3,4,5,6,7,8}; std::vector<int> v2{ 5, 7, 9,10}; std::sort(v1.begin(), v1.end()); std::sort(v2.begin(), v2.end()); std::vector<int> v_intersection; std::set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), std::back_inserter(v_intersection)); for(int n : v_intersection) std::cout << n << ' '; }
Output:
5 7
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With