鱼C论坛

 找回密码
 立即注册
查看: 1185|回复: 8

[已解决]程序/C++利用函数模板编写一个程序求出数组的长度。

[复制链接]
发表于 2019-11-5 14:00:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <iostream>
using namespace std;
template <class T>
T sum(T *a,int length) {
        T sum = 0;
        for (int i = 0; i < length; i++) {
                sum += a[i];
        }
        return sum;
}

int GetArrayLength(const T(&)[N])
{
        return N;
}

void main() {
        int a[] = { 1,2,3,4,5,6,7,8,9,10 };
        int length = GetArrayLength(a);
        int sum_int = sum(a,length);
        printf("总长度为:%d\nsum= %d\n",length , sum_int);
        system("PAUSE");
}



#include <iostream>
using namespace std;

template<class T>
void display(T& a,int n){
        cout<<"该数组为:"<<endl;
        for(int i=0;i<n;i++)
               
                cout<<a[i]<<"\t";
        cout<<endl;
}


template <class T>
T sum(T a[], size_t n)
{
    T sum = 0;
    for (size_t i = 0; i < n; i++)
    {
        sum += a[i];
    }
    return sum;
}

void main()
{
    int a[] = {1,2,3,4,5,6,7,8,9};
        display(a,9);
    cout<<"该数组元素之和为:"<<sum(a, 9)<<endl;
   
}

上面是我编写的一个求数组元素和的一个程序,可以有大佬在其中利用函数模板编写一个求数组长度的程序吗?

我之前编写的用VC 6.0运行不出来,不知道应该怎么办?希望得到大佬们的帮助。
最佳答案
2019-11-6 07:08:37
#include <iostream>
template <typename T, size_t N>
/*适用一维数组*/
size_t GetArrayLength(const T (&arr)[N])
{
    return N;
}
template <typename T, size_t N>
/*二维数组*/
size_t GetArrayLength(const T *(&arr)[N])
{
    return N;
}
int main(int argc, char const *argv[])
{
    int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    std::cout << "arr[] --- " << GetArrayLength(arr) << std::endl;
    char ch[] = "hello";
    std::cout << "ch[] --- " << GetArrayLength(ch) << std::endl;
    double arr1[][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
    std::cout << "arr1[][] --- " << GetArrayLength(arr1) << std::endl;
    char ch1[][6] = {"hello", "fishC", "Clang", "&C++"};
    std::cout << "ch1[][] --- " << GetArrayLength(ch1) << std::endl;
    return 0;
}
-------------------------------------------------------------------------------
Microsoft Windows [版本 10.0.18363.418]
(c) 2019 Microsoft Corporation。保留所有权利。

E:\Users\admin\Documents\VScode>c:\Users\admin\.vscode\extensions\ms-vscode.cpptools-0.26.1\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-sbztw5o1.xqm --stdout=Microsoft-MIEngine-Out-jisfivrp.1vv --stderr=Microsoft-MIEngine-Error-m1ykmf1z.1ho --pid=Microsoft-MIEngine-Pid-uxwp34jl.bmh --dbgExe=D:\MinGW\bin\gdb.exe --interpreter=mi
arr[] --- 11
ch[] --- 6
arr1[][] --- 3
ch1[][] --- 4

E:\Users\admin\Documents\VScode>

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-5 15:45:52 From FishC Mobile | 显示全部楼层
VC6太老了,有些东西不支持,换个编译器把
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-5 20:45:40 | 显示全部楼层
本帖最后由 superbe 于 2019-11-6 11:28 编辑

template <class T>
int GetArrayLength(T &array)
{
    return sizeof(array)/sizeof(array[0]);
}

main里调用不变:
int length = GetArrayLength(a);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-6 04:41:12 From FishC Mobile | 显示全部楼层
superbe 发表于 2019-11-5 20:45
template
int GetArrayLength(T &array)
{


数组引用不是你这样的
T arr[9] = {0};
T (&ren)[9] = arr;//这才是数组引用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-6 07:08:37 | 显示全部楼层    本楼为最佳答案   
#include <iostream>
template <typename T, size_t N>
/*适用一维数组*/
size_t GetArrayLength(const T (&arr)[N])
{
    return N;
}
template <typename T, size_t N>
/*二维数组*/
size_t GetArrayLength(const T *(&arr)[N])
{
    return N;
}
int main(int argc, char const *argv[])
{
    int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    std::cout << "arr[] --- " << GetArrayLength(arr) << std::endl;
    char ch[] = "hello";
    std::cout << "ch[] --- " << GetArrayLength(ch) << std::endl;
    double arr1[][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
    std::cout << "arr1[][] --- " << GetArrayLength(arr1) << std::endl;
    char ch1[][6] = {"hello", "fishC", "Clang", "&C++"};
    std::cout << "ch1[][] --- " << GetArrayLength(ch1) << std::endl;
    return 0;
}
-------------------------------------------------------------------------------
Microsoft Windows [版本 10.0.18363.418]
(c) 2019 Microsoft Corporation。保留所有权利。

E:\Users\admin\Documents\VScode>c:\Users\admin\.vscode\extensions\ms-vscode.cpptools-0.26.1\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-sbztw5o1.xqm --stdout=Microsoft-MIEngine-Out-jisfivrp.1vv --stderr=Microsoft-MIEngine-Error-m1ykmf1z.1ho --pid=Microsoft-MIEngine-Pid-uxwp34jl.bmh --dbgExe=D:\MinGW\bin\gdb.exe --interpreter=mi
arr[] --- 11
ch[] --- 6
arr1[][] --- 3
ch1[][] --- 4

E:\Users\admin\Documents\VScode>

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-6 13:37:20 | 显示全部楼层
bin554385863 发表于 2019-11-6 04:41
数组引用不是你这样的
T arr[9] = {0};
T (&ren)[9] = arr;//这才是数组引用

测试结果是正确的 。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-8 08:00:30 | 显示全部楼层
bin554385863 发表于 2019-11-5 15:45
VC6太老了,有些东西不支持,换个编译器把

确实是这个问题,老师建议我们初学者用VC6.0,但是是真的很不方便。谢谢你呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-8 08:01:07 | 显示全部楼层
bin554385863 发表于 2019-11-6 07:08
#include
template
/*适用一维数组*/

我理解了这个代码了,已经可以运行出来了,谢谢你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-8 08:02:02 | 显示全部楼层
superbe 发表于 2019-11-5 20:45
template
int GetArrayLength(T &array)
{

谢谢你呀!代码可以运行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 13:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表