Давайте посмотрим на вашу addVat
функцию.
double * addVAT(static double sum)
{
sum = sum + (sum*VAT);
return ∑
}
Вам необходимо удалить static
из списка параметров. По крайней мере, с GCC на Linux это вызывает ошибку компиляции. Когда я это делаю, я получаю
<source>: In function 'double* addVAT(double)':
<source>:8:24: warning: address of local variable 'sum' returned
[-Wreturn-local-addr]
double * addVAT(double sum)
~~~~~~~^~~
Compiler returned: 0
Вроде то, что я ожидал.
В вашем main
есть total
, который передается в виде копии на addVat
, где он имеет имя sum
. Таким образом, в памяти (в стеке выполнения) у вас есть
основной: всего
Main-> addVat: сумма
addVat изменяет sum
и возвращает указатель на него. Проблема в том, что по возвращении addVat
автоматически освобождает память, содержащую sum
.
Так что теперь у вас есть
основной: всего (без изменений)
main: totalWithVat -> память, где sum
было
Это неопределенное поведение. Это может работать, но также некоторые другие процедуры могут повторно использовать и изменять память, где раньше было sum
. Это, наверное, то, что вы видите. printf
везет и получает неизмененное значение sum
, в то время как cout
получает измененное значение.
В качестве решения вашей проблемы есть две возможности. Вы можете иметь только одно входное значение, которое вы изменяете, например,
void addVat(double& sum)
{
sum += sum*VAT;
}
double total = 1.0;
addVat(total);
// total now ~1.17
Или вы можете иметь два значения и не беспокоиться об указателях / ссылках
double addVat(double sum)
{
return sum + sum*VAT;
}
double total = 1.0;
double totalWithVat = addVat(total);
// totalWithVat now ~1.17