簡體   English   中英

C++中的arrays如何解決這個問題?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM