贰硕 发表于 2021-1-26 20:44:49

排序小程序

#include<iostream>
using namespace std;

//交换函数
template <class T>
void mySwap(T& a, T& b)
{
        T temp = a;
        a = b;
        b = temp;
}

//打印函数
template <class T>
void print(T arr[], int len)
{
        for (int i = 0; i < len; i++)
        {
                cout << arr << " ";
        }
        cout << endl;
}

//获取长度函数
template <class T>
int get_len(T arr[])
{
        return (sizeof(arr) / sizeof(T));
}


//排序函数 (选择排序)
template <class T>
void myRank(T arr[], int len)
{
        for (int i = 0; i < len; i++)
        {
                int min = i;
                for (int j = i + 1; j < len; j++)
                {
                        if (arr > arr)
                        {
                                min = j;
                        }
                }
                if (min != i)
                {
                        mySwap(arr, arr);
                }
        }
        print(arr, len);
}

void test01()
{
        char charArr[] = "bdcfeagh";
        int len = get_len(charArr);
        cout << len << endl;
        myRank(charArr, len);
}

void test02()
{
        int intArr[] = { 7, 5, 8, 1, 3, 9, 2, 4, 6 };
        int len = get_len(intArr);
        cout << len << endl;
        myRank(intArr, len);
}

int main()
{

        test01();
        test02();

        system("pause");

        return 0;

}

输出结果:
4
b c d f
1
7
请按任意键继续. . .

这是我写的一个给数组内元素升序排列的程序,期待的输出结果是:
9
a b c d e f g h
9
1 2 3 4 5 6 7 8 9
请按任意键继续. . .
现在我只知道问题出在了函数get_len()这里,但是不知道具体原理是什么,求各位大佬解答

风过无痕1989 发表于 2021-1-26 21:13:58

C++呀,我做不了,帮你顶

贰硕 发表于 2021-1-26 21:30:28

风过无痕1989 发表于 2021-1-26 21:13
C++呀,我做不了,帮你顶

谢谢啦

xieglt 发表于 2021-1-27 10:48:21

贰硕 发表于 2021-1-26 21:30
谢谢啦

原因是 数组作为参数传递到函数里它就变成了指针。
指针是不能用sizeof()求出其指向的数组长度的。
在32位系统中,指针的长度固定是4字节,所以你的 test01()函数里求出的 len 是 4/1 = 4
而test02()函数里求出的 len 是 4/4 =1
如果是64位系统,指针的长度固定是8字节。

所以不能用 get_len 这样的函数去求数组的长度
不用函数直接写就可以了 。


void test01()
{
        char charArr[] = "bdcfeagh";
        int len = sizeof(charAr)/sizeof(char);
        cout << len << endl;
        myRank(charArr, len);
}

void test02()
{
        int intArr[] = { 7, 5, 8, 1, 3, 9, 2, 4, 6 };
        int len = sizeof(intArr)/(int);
        cout << len << endl;
        myRank(intArr, len);
}



如果觉得一定要写个啥更高大上一点,可以用宏

#define _GET_LEN(obj,t) (sizeof(obj)/sizeof(t))

int len = _GET_LEN(charArr,char);
int len = _GET_LEN(intArr,int);

心驰神往 发表于 2021-1-27 11:41:41

本帖最后由 心驰神往 于 2021-1-27 11:47 编辑

4l说得对,但是写错了
void test01()
{
      char charArr[] = "bdcfeagh";
      int len = sizeof(charArr)/sizeof(char);
      cout << len << endl;
      myRank(charArr, len);
}

void test02()
{
      int intArr[] = { 7, 5, 8, 1, 3, 9, 2, 4, 6 };
      int len = sizeof(intArr)/sizeof(int);
      cout << len << endl;
      myRank(intArr, len);
}

附一个strlen和sizeof区别https://blog.csdn.net/ly_6699/article/details/89482591

贰硕 发表于 2021-1-27 16:57:24

xieglt 发表于 2021-1-27 10:48
原因是 数组作为参数传递到函数里它就变成了指针。
指针是不能用sizeof()求出其指向的数组长度的。
在3 ...

多谢啦,我还在跟教程,还没学到宏
不过写一个获取长度的函数确实是我自己为了看着高大上加的,教程没有写{:5_109:}

贰硕 发表于 2021-1-27 16:58:20

心驰神往 发表于 2021-1-27 11:41
4l说得对,但是写错了

附一个strlen和sizeof区别https://blog.csdn.net/ly_6699/article/details/894825 ...

多谢多谢{:5_95:}
页: [1]
查看完整版本: 排序小程序