xsnk
xsnk

Reputation: 43

C++ float value of a local variable explanation?

I have a simple math vector struct

struct vec3d {
  float x;
  float y;
  float z;
  float w;
public:
  vec3d(float a, float b, float c) { a = x; b = y; c = z; w = 1; }
  vec3d() { x = 0; y = 0; z = 0; w = 1; }
};

With the following operation in a function (I am not using operator overloading)

vec3d vsubvector(vec3d& v1, vec3d& v2)
{
  return vec3d(v1.x - v2.x, v1.y - v2.y,v1.z - v2.z);
}

I am using it inside the main function within a loop block like this

{
...
            vec3d normal, line1, line2;

            line1 = vsubvector(p[1], p[0]);
            line2 = vsubvector(p[2], p[0]);

            normal = vcrossproduct(line1, line2);
            normal = vnormalise(normal);
...
}

Here p is an array of three vectors

Now while debugging, when I enter the block where the local variable is defined, line1.x, line1.y and line1.z are assigned a big signed float value (-107374176.0f) and they do not change after the subtract function is returned into them.

What is the reason that vsubvector function is not working?

Upvotes: 0

Views: 285

Answers (1)

Jesper Juhl
Jesper Juhl

Reputation: 31465

vec3d(float a, float b, float c) { a = x; b = y; c = z; w = 1; }

Is assigning to the constructor arguments from the uninitialised member variables. Obviously wrong. You'd want to reverse the order of assignment.

Additionally, you should use the constructors initialization list to initialize members rather than the constructor body. Do this:

vec3d(float a, float b, float c) : x(a), y(b), z(c), w(1) { }

For basic types like ints or floats it makes little difference, but for user defined types it can make a big difference. It is wasteful to first let the constructor default initialize members and then subsequently assign to them in the constructor body. Also, for some types, doing so is not even possible, not all types support assignment so initialization is the only option.

Additionally, the default constructor vec3d() can delegate to the other constructor:

vec3d() : vec3d(0.f, 0.f, 0.f) {}

Upvotes: 4

Related Questions