极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 21081|回复: 7

求助,怎么计算数组长度

[复制链接]
发表于 2015-7-6 23:30:20 | 显示全部楼层 |阅读模式
我用(sizeof(nums) / sizeof(nums[0]))这种方式计算数组长度,总是不对。求大神指点。

  1. int a = 3; //定义数字接口3 连接a 段数码管
  2. int b = 4; // 定义数字接口4 连接b 段数码管
  3. int c = 5; // 定义数字接口5 连接c 段数码管
  4. int d = 6; // 定义数字接口6 连接d 段数码管
  5. int e = 7; // 定义数字接口7 连接e 段数码管
  6. int f = 8; // 定义数字接口8 连接f 段数码管
  7. int g = 9; // 定义数字接口9 连接g 段数码管
  8. int dp = 2; // 定义数字接口2 连接dp 段数码管

  9. int one[] = {b, c};
  10. int two[] = {3, 4, 9, 6, 7};
  11. int three[] = {a, b, c, d, g};
  12. int four[] = {f, g, b, c};
  13. int five[] = {a, f, g, c, d};
  14. int six[] = {f, e, d, c, g};
  15. int seven[] = {a, b, c};
  16. int eight[] = {a, b, c, d, e, g, f};
  17. int nine[] = {a, b, c, d, f, g};

  18. void setup() {
  19.   // put your setup code here, to run once:
  20.   Serial.begin(9600);
  21.   int i;//定义变量
  22.   for (i = 2; i <= 9; i++) {
  23.     pinMode(i, OUTPUT); //设置4~11 引脚为输出模式
  24.   }
  25. }

  26. void loop() {
  27.   // put your main code here, to run repeatedly:

  28.   digitalWrite(dp, HIGH);
  29.   display_smg(one , 2);
  30.   delay(1000);
  31.   display_smg(two , 5);
  32.   delay(1000);
  33.   display_smg(three , 5);
  34.   delay(1000);
  35.   display_smg(four , 4);
  36.   delay(1000);
  37.   display_smg(five , 5);
  38.   delay(1000);
  39.   display_smg(six , 5);
  40.   delay(1000);
  41.   display_smg(seven , 3);
  42.   delay(1000);
  43.   display_smg(eight , 7);
  44.   delay(1000);
  45.   display_smg(nine , 6);
  46.   delay(1000);
  47. }

  48. void display_smg(int nums[], int len) {
  49.   for (int i = 3; i <= 9; i++) {
  50.     digitalWrite(i, LOW);
  51.   }
  52.   Serial. println((sizeof(nums) / sizeof(nums[0])));
  53.   for (int i = 0; i < len; i++) {
  54.     Serial. println(nums[i]);
  55.     digitalWrite(nums[i], HIGH);
  56.   }
  57. }
复制代码
还有我想定义一个二维数组类似这样
  1. int all[][]={{one},{two}};
复制代码
编译不能通过,怎么修改?
另外能不能定义类一样的函数。我整过java,arduino这样写代码,总感觉很累{:soso_e154:} ,求指点
回复

使用道具 举报

发表于 2015-7-7 07:41:51 | 显示全部楼层
二维数组不应该是这样么int all[][]={{one,two},{three,four}};
回复 支持 反对

使用道具 举报

发表于 2015-7-7 07:48:07 | 显示全部楼层
没看你的代码。我书里计算数组长度是这样做的  while(mystring[strlength]){strlength++}
mystring 为已知数组  striength 为数组长度
回复 支持 反对

使用道具 举报

发表于 2015-7-7 09:22:37 | 显示全部楼层
本帖最后由 liuxue4503 于 2015-7-7 09:35 编辑

早上试运行了下。下面是我的部分见解:
第一:关于数组长度的计算,本身 (sizeof(nums) / sizeof(nums[0])) 这个算法是正解的,官方的sizeof()介绍里是这样说的:sizeof returns the total number of bytes 返回的是总的字节数,后面也给出了int型数组长度的说明,就是楼主用的这个。
第二:关于楼主为什么要求这个长度,从程序来看,你调用函数时所传入的len,不就是数组的长度么?
第三:二维数组的定义,我认为应该从数组的定义本身来理解为什么不行。数组是不能直接赋值的,要么在定义的时候直接给值,要么通过循环一个一个元素去做。像  int all[][]={{one},{two}} 这样做就像是你要对数组进行这样的赋值。
第四:面向对象,本身arduino这个环境当然是支持的,我们所用的这些好用的库就是这样实现的。但是在写实际流程的时候,还是返回来单片机本身面向过程的编程思想先,当然也可以实现,你自己先写好对应的库(要用C++),然后在用new()就行,后面就能调用你写好的方法了。其实arduino的编程相比起原来用avr studio来说,已经很方便了。
最后还想到一点,我也学了一点Java,所以你的感受我当然也有些。在Java里面,除了几个基本的数据类型以外,其它的东东都是对象,还特别对基本数据类型进行了包装,Integer对应int之类的。以实现完全地面向对象。用完全面向对象的思想回来写面向过程的,就会感觉有些别扭,有时候都不知道错在哪里。
补充一点,上面那个数组长度的问题,我觉得问题是出在传参那里,我没弄过纯C++,不懂其较为底层的东东,刚去翻了翻,发现这么一句 “C++中根本不存在所谓的“数组形参”,因为数组在传入时,实质上只传入指向其首元素的指针。”所以你上面传进去的其实都只是每个数组的第一个元素的指针,那么在算 (sizeof(nums) / sizeof(nums[0])) 的时候,结果一直都是1。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-7-7 10:44:51 | 显示全部楼层
Peter_wbgk 发表于 2015-7-7 07:48
没看你的代码。我书里计算数组长度是这样做的  while(mystring[strlength]){strlength++}
mystring 为已知 ...

这应该是循环数组里的元素吧,这样可以吗,晚上试试
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-7-7 10:54:19 | 显示全部楼层
liuxue4503 发表于 2015-7-7 09:22
早上试运行了下。下面是我的部分见解:
第一:关于数组长度的计算,本身 (sizeof(nums) / sizeof(nums[0]) ...

谢谢解惑
遍历一个数组应该如何实现,我是想通过一个函数传递进去数组,然后把所有应该亮的阵脚输出高平电,这样可重用性高点,不用定义很多函数。
另外如果我想把两个数组合并成一个二维数组,需要循环两个数组赋值,是这个意思吗?
还有指针有数组吗,可以定义一个指针数组,传入其他数组的指针,不知道C语言支持吗
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-7-7 10:57:51 | 显示全部楼层
Peter_wbgk 发表于 2015-7-7 07:41
二维数组不应该是这样么int all[][]={{one,two},{three,four}};

因为我的one,two,也是数组,这样就变成三围数组了吧,有点晕
回复 支持 反对

使用道具 举报

发表于 2015-7-7 15:43:07 | 显示全部楼层
本帖最后由 liuxue4503 于 2015-7-7 16:00 编辑
[email protected] 发表于 2015-7-7 10:54
谢谢解惑
遍历一个数组应该如何实现,我是想通过一个函数传递进去数组, ...


我上面说的只是你在求sizeof的时候不对,实际传数组当然是没问题的,使用也一样。我没上LED管子,只试了println输出,你那个代码应该工作正常啊。
数组合并是需要循环两次,对新数组的每个元素单独赋值。这点在Java里面也需要同样的操作.
指针这个,我也没学好,现在理解着理解着又乱了。。指针数组,数组指针什么的都有,C语言也都支持。
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-17 04:10 , Processed in 0.037178 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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