2016-11-17 4 views
0

Я сделал функцию C с передачей указателя, которая дает правильный результат, только если указатели разные. Например:Почему моя функция C++ имеет разные аргументы указателя?

void dotransform(Point *pout, const Point *pin, transform mat) 
{ 
    pout->x = mat[0][0] * pin->x + mat[1][0] * pin->y + mat[2][0] * pin->z + mat[3][0] * 1.0; 
    pout->y = mat[0][1] * pin->x + mat[1][1] * pin->y + mat[2][1] * pin->z + mat[3][1] * 1.0; 
    pout->z = mat[0][2] * pin->x + mat[1][2] * pin->y + mat[2][2] * pin->z + mat[3][2] * 1.0; 
} 

dotransform() должен называться так:

//... 
Transform toWorldMat; 
Point local; 
Point world; 
dotransform(&world, &local, toWorldMat); 

Проблема заключается в том, кто-то в моей команде назвал это так:

Point p; 
dotransform(&p, &p, toWorldMat); 

Он просто взял меня одну неделю, чтобы выяснить, почему окончательный выход программы изменился.

Что такое лучший стиль для объявления такого рода функций, чтобы избежать этого случая? Не так ли, чтобы написать это так?

+4

Только отправьте один параметр 'Point',' pin' и используйте возвращаемое значение функции в противном случае в качестве результата вывода. – WhozCraig

+0

Вы (предположительно) используете C++: не пропускайте объекты указателем на тривиальные примеры, подобные этому. Перейдите по ссылке. – Xirema

ответ

3

Видя, как вы уже пропускание transform объекта непосредственно (хотя и не const&: вы должны действительно сделать это вместо этого) есть какая-либо причина вы не можете писать код так:

Point dotransform(Point const& pin, transform const& mat) 
{ 
    Point pout 
    pout.x = mat[0][0] * pin.x + mat[1][0] * pin.y + mat[2][0] * pin.z + mat[3][0] * 1.0; 
    pout.y = mat[0][1] * pin.x + mat[1][1] * pin.y + mat[2][1] * pin.z + mat[3][1] * 1.0; 
    pout.z = mat[0][2] * pin.x + mat[1][2] * pin.y + mat[2][2] * pin.z + mat[3][2] * 1.0; 
    return pout; 
} 

Каких затем позволит вам писать код, как это:

Transform toWorldMat; 
Point local; 
Point world = dotransform(local, toWorldMat); 

Или это:

Point p; 
p = dotransform(p, toWorldMat); 

Это правильный, идеоматический способ написания кода на C++.