Я знаю, что существует шаблон функции C ++ (std :: inner_product), но я хочу попробовать написать свой собственный. Вот некоторый код, который я нашел, но он работает в основной функции:
#include <iostream>
using namespace std;
int main(){
float vectorA[3], vectorB[3], scalar=0.0;
int i;
// Get input vectors from user.
cout << "Enter elements of first vector: " << endl;
for(i=0;i<3;i++)
{
cin >> vectorA[i];
}
cout << "Enter elements of second vector: " << endl;
for(i=0;i<3;i++)
{
cin >> vectorB[i];
}
// Calculate scalar product.
for(i=0;i<3;i++)
{
scalar = scalar + (vectorA[i] * vectorB[i]);
}
// Output result.
cout << "The scalar product is " << scalar << endl;
return 0;
}
Далее я хочу записать это в отдельную многократно используемую функцию, которую я могу вызвать из моего основного цикла. Это лучшее, что я мог придумать.
float scalarProduct(float a1, float a2, float a3, float b1, float b2, float b3) {
float vectorA[3], vectorB[3], scalar;
vectorA[0]=a1;
vectorA[1]=a2;
vectorA[2]=a3;
vectorB[0]=b1;
vectorB[1]=b2;
vectorB[2]=b3;
for(int i=0;i<3;i++) // Calculate scalar product.
{
scalar = scalar + (vectorA[i] * vectorB[i]);
}
return scalar;
}
int main() {
cout << scalarProduct(1,2,3,4,5,6);
}
Итак, мои вопросы:
Когда я запускаю программу в XCode, я получаю предупреждение «Переменная скаляр может быть неинициализирована при использовании здесь» в строке
scalar = scalar + (vectorA[i] * vectorB[i]);
Программа по-прежнему работает и вычисляет правильный ответ, но как я могу убрать это предупреждение?
Вопрос
Как я могу передать массив в эту функцию? Должен быть лучший способ, чем шесть параметров, но я не могу понять, как это сделать.
Измените функцию, чтобы принимать два массива в качестве аргумента. В целях безопасности также передайте количество элементов в массиве.
float scalarProduct(float a[], float b[], size_t num);
Измените функцию, чтобы принять два std:vector
в качестве аргумента.
float scalarProduct(std::vector<float> const& a, std::vector<float> const& b);
Измените функцию, чтобы принять два std:array
в качестве аргумента.
float scalarProduct(std::array<float, 3> const& a, std::array<float, 3> const& b);
Во всех этих случаях вы можете получить доступ к элементам коллекции, используя синтаксис массива.
float scalarProduct(std::array<float, 3> const& a, std::array<float, 3> const& b)
{
// Initialize scalar to 0
float scalar = 0.0f;
for(int i=0;i<3;i++) // Calculate scalar product.
{
scalar = scalar + (a[i] * b[i]);
}
return scalar;
}
Реализации будут немного отличаться, если вы используете другие сигнатуры, но не слишком разные.
Вопрос
Когда я запускаю программу в XCode, я получаю предупреждение «Переменная скаляр может быть неинициализирована при использовании здесь» в строке
Я уже добавил строку для инициализации scalar
, Без этого начальное значение scalar
не предсказуемо. Кроме того, доступ к значению неинициализированной переменной является причиной неопределенного поведения.
- Как я могу передать массив в эту функцию? Должен быть лучший способ, чем шесть параметров, но я не могу понять, как.
Чтобы передать массив в вашу функцию, просто выполните:
float scalarProduct(float arr[6])
В вашем main()
, это будет выглядеть так:
float array[6] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0};
cout << scalarProduct(array);
Оттуда вы можете использовать свой массив как:
vectorA[0]=arr[0];
vectorA[1]=arr[1];
vectorA[2]=arr[2];
vectorB[0]=arr[3];
vectorB[1]=arr[4];
vectorB[2]=arr[5];
- Когда я запускаю программу в XCode, я получаю предупреждение «Переменная скаляр может быть неинициализирована при использовании здесь» в строке
Возможно попытайтесь инициализировать скаляр с начальным значением:
float scalar = 0.0;
Просто пусть ваша функция принимает ссылку на вектор (или массив, как указано Хейденом). Вектор лучше, так как вам не нужно жестко задавать размер вектора.
Также полезно иметь шаблонную функцию для этого случая.
#include <iostream>
#include <vector>
using namespace std;
template <typename T>
T scalarProduct(const vector<T>& a, const vector<T>& b)
{
// Check that the size of a and b match here.
// If not, do what you deem is necessary.
T product = 0; // Not initializing variable is cause of your warning.
for (int i = 0; i < a.size(); i++)
product += a[i] * b[i];
return product;
}
int main(void)
{
// Compile for c++ 11
// vector<float> a = {1.0, 2.0, 3.0};
// vector<float> b = {1, 1, 1};
// Else
vector<float> a;
vector<float> b;
a.push_back(1);
a.push_back(2);
a.push_back(3);
b.push_back(1);
b.push_back(1);
b.push_back(1);
cout << scalarProduct<float>(a, b) << endl;
return 0;
}