如何编写一个单独的函数来计算标量积?
How to write a separate function that computes scalar product?
我知道有一个 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 中运行程序时,在第
行收到警告 'Variable scalar may be uninitialised when used here'
scalar = scalar + (vectorA[i] * vectorB[i]);
程序仍在运行并计算出正确答案,但我怎样才能让这个警告消失?
- How can I pass an array into this function? There must be a better way than having six parameters but I can't figure out how.quote
要将数组传递给您的函数,只需执行以下操作:
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];
- When I run the program in Xcode, I get the warning 'Variable scalar may be uninitialised when used here' at the line
也许尝试用初始值初始化标量:
float scalar = 0.0;
问题
How can I pass an array into this function? There must be a better way than having six parameters but I can't figure out how.
更改函数以接受两个数组作为参数。为了安全起见,还要传入数组的元素个数。
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;
}
如果您使用其他签名,实现会略有不同,但差别不会太大。
问题
When I run the program in Xcode, I get the warning 'Variable scalar may be uninitialised when used here' at the line
我已经添加了初始化行scalar
。否则, scalar
的初始值是不可预测的。此外,访问未初始化变量的值是未定义行为的原因。
只需让您的函数接受对向量(或 Hayden 所述的数组)的引用。矢量更好,因为您不必硬编码矢量的大小。
另外,在这种情况下有一个模板函数是很有用的。
#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;
}
我知道有一个 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 中运行程序时,在第
行收到警告 'Variable scalar may be uninitialised when used here'scalar = scalar + (vectorA[i] * vectorB[i]);
程序仍在运行并计算出正确答案,但我怎样才能让这个警告消失?
- How can I pass an array into this function? There must be a better way than having six parameters but I can't figure out how.quote
要将数组传递给您的函数,只需执行以下操作:
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];
- When I run the program in Xcode, I get the warning 'Variable scalar may be uninitialised when used here' at the line
也许尝试用初始值初始化标量:
float scalar = 0.0;
问题
How can I pass an array into this function? There must be a better way than having six parameters but I can't figure out how.
更改函数以接受两个数组作为参数。为了安全起见,还要传入数组的元素个数。
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;
}
如果您使用其他签名,实现会略有不同,但差别不会太大。
问题
When I run the program in Xcode, I get the warning 'Variable scalar may be uninitialised when used here' at the line
我已经添加了初始化行scalar
。否则, scalar
的初始值是不可预测的。此外,访问未初始化变量的值是未定义行为的原因。
只需让您的函数接受对向量(或 Hayden 所述的数组)的引用。矢量更好,因为您不必硬编码矢量的大小。 另外,在这种情况下有一个模板函数是很有用的。
#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;
}