鱼C论坛

 找回密码
 立即注册
查看: 1006|回复: 6

[已解决]排序小程序

[复制链接]
发表于 2021-1-26 20:44:49 | 显示全部楼层 |阅读模式

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

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

x
  1. #include<iostream>
  2. using namespace std;

  3. //交换函数
  4. template <class T>
  5. void mySwap(T& a, T& b)
  6. {
  7.         T temp = a;
  8.         a = b;
  9.         b = temp;
  10. }

  11. //打印函数
  12. template <class T>
  13. void print(T arr[], int len)
  14. {
  15.         for (int i = 0; i < len; i++)
  16.         {
  17.                 cout << arr[i] << " ";
  18.         }
  19.         cout << endl;
  20. }

  21. //获取长度函数
  22. template <class T>
  23. int get_len(T arr[])
  24. {
  25.         return (sizeof(arr) / sizeof(T));
  26. }


  27. //排序函数 (选择排序)
  28. template <class T>
  29. void myRank(T arr[], int len)
  30. {
  31.         for (int i = 0; i < len; i++)
  32.         {
  33.                 int min = i;
  34.                 for (int j = i + 1; j < len; j++)
  35.                 {
  36.                         if (arr[min] > arr[j])
  37.                         {
  38.                                 min = j;
  39.                         }
  40.                 }
  41.                 if (min != i)
  42.                 {
  43.                         mySwap(arr[min], arr[i]);
  44.                 }
  45.         }
  46.         print(arr, len);
  47. }

  48. void test01()
  49. {
  50.         char charArr[] = "bdcfeagh";
  51.         int len = get_len(charArr);
  52.         cout << len << endl;
  53.         myRank(charArr, len);
  54. }

  55. void test02()
  56. {
  57.         int intArr[] = { 7, 5, 8, 1, 3, 9, 2, 4, 6 };
  58.         int len = get_len(intArr);
  59.         cout << len << endl;
  60.         myRank(intArr, len);
  61. }

  62. int main()
  63. {

  64.         test01();
  65.         test02();

  66.         system("pause");

  67.         return 0;

  68. }
复制代码


输出结果:
  1. 4
  2. b c d f
  3. 1
  4. 7
  5. 请按任意键继续. . .
复制代码


这是我写的一个给数组内元素升序排列的程序,期待的输出结果是:
  1. 9
  2.   a b c d e f g h
  3. 9
  4. 1 2 3 4 5 6 7 8 9
  5. 请按任意键继续. . .
复制代码

现在我只知道问题出在了函数get_len()这里,但是不知道具体原理是什么,求各位大佬解答
最佳答案
2021-1-27 10:48:21

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

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


  1. void test01()
  2. {
  3.         char charArr[] = "bdcfeagh";
  4.         int len = sizeof(charAr)/sizeof(char);
  5.         cout << len << endl;
  6.         myRank(charArr, len);
  7. }

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

复制代码


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

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

  2. int len = _GET_LEN(charArr,char);
  3. int len = _GET_LEN(intArr,int);
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-1-26 21:13:58 | 显示全部楼层
C++呀,我做不了,帮你顶
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-1-26 21:30:28 | 显示全部楼层
风过无痕1989 发表于 2021-1-26 21:13
C++呀,我做不了,帮你顶

谢谢啦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-27 10:48:21 | 显示全部楼层    本楼为最佳答案   

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

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


  1. void test01()
  2. {
  3.         char charArr[] = "bdcfeagh";
  4.         int len = sizeof(charAr)/sizeof(char);
  5.         cout << len << endl;
  6.         myRank(charArr, len);
  7. }

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

复制代码


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

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

  2. int len = _GET_LEN(charArr,char);
  3. int len = _GET_LEN(intArr,int);
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-27 11:41:41 | 显示全部楼层
本帖最后由 心驰神往 于 2021-1-27 11:47 编辑

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

  8. void test02()
  9. {
  10.         int intArr[] = { 7, 5, 8, 1, 3, 9, 2, 4, 6 };
  11.         int len = sizeof(intArr)/sizeof(int);
  12.         cout << len << endl;
  13.         myRank(intArr, len);
  14. }
复制代码

附一个strlen和sizeof区别https://blog.csdn.net/ly_6699/article/details/89482591
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

多谢啦,我还在跟教程,还没学到宏
不过写一个获取长度的函数确实是我自己为了看着高大上加的,教程没有写
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-27 16:58:20 | 显示全部楼层
心驰神往 发表于 2021-1-27 11:41
4l说得对,但是写错了

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

多谢多谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-2 02:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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