[英]How can I solve this problem with arrays in C++?
我正在應對 Edabit 挑戰:獲取給定數組的算術平均值。 現在我有這樣的代碼:
#include <iostream>
int data;
using namespace std;
int mean(int data);
int main()
{
int data[] = { 1, 2, 3, 4 };
cout << mean(data);
}
int mean(int data)
{
double mean = 0;
for (int i = 0; i < sizeof(data) / sizeof(data[0]); i++)
{
mean += data[i];
}
mean /= sizeof(data) / sizeof(data[0]);
}
我被困住了。 我在 Windows 7 Professional 上使用 Visual Studio 2019,我在 3 個字符(data[i] 和 2x data[0])上加了下划線。 為此 x Visual Studio 表示expression must have pointer-to-object type (Error E0142)
,我不知道這意味着什么。 我只知道什么是指針。
在 Visual Studio 中,我添加了 return 語句,但是在此處縮短用於發布的代碼時我忘記了添加它。 否則,這不是實際問題。 現在我不能在問題中添加它,因為評論是錯誤的。 評論與上面的問題有關,但我真正的問題(對於未來的讀者堅持這個問題)是:
如何在 function 中將數組作為參數傳遞。
現在,我更精通 C++,我知道術語以及如何使用它 state,而且我也知道這對初學者來說不是那么清楚:你不能只寫f(int[] arr)
(你不能傳遞數組),但你必須寫f(int* arr)
(你可以傳遞一個指向該數組的指針)。 當時我不能只搜索它,因為我對 C++ 術語了解不多。
你的mean
function,嗯,是意思。
1.它沒有返回值; 沒有return
聲明。
2. 它使用與 function 相同的變量名(不是推薦的編碼風格)。
3. 有一個全局變量data
,被main
里面的一個局部變量data
隱藏了。
4. 你混淆了編譯器和讀者:全局data
變量是一個單一的int
。 main
中的局部變量是一個int
數組。
你應該讓最后一行是:
return mean;
當作為參數傳遞給函數時,Arrays 會衰減為指針(在本例中為int*
)。 你的mean
function 只接受一個int
。
當數組衰減為指針時,大小信息將丟失。 但是,您可以通過定義一個 function 來防止這種情況,該 function 接受您需要的確切類型和大小的 arrays。 這可以通過模板來完成:
#include <iostream>
template<typename T, size_t N>
double mean(const T (&data)[N]) {
double sum = 0;
for (size_t i = 0; i < N; ++i)
{
sum += data[i];
}
return sum / N;
}
int main()
{
int input[] = { 1, 2, 3, 4, 5, 6, 7 };
std::cout << mean(input) << '\n';
}
如果您不想使用模板(或只接受特定大小的 arrays),則需要手動將大小信息傳遞給 function:
#include <iostream>
#include <iterator> // std::size
double mean(const int* data, size_t N)
{
double sum = 0;
for (size_t i = 0; i < N; ++i)
{
sum += data[i];
}
return sum / N;
}
int main()
{
int input[] = { 1, 2, 3, 4, 5, 6, 7 };
std::cout << mean(input, std::size(input)) << '\n';
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.