[email protected] 发表于 2015-7-6 23:30:20

求助,怎么计算数组长度

我用(sizeof(nums) / sizeof(nums))这种方式计算数组长度,总是不对。求大神指点。
int a = 3; //定义数字接口3 连接a 段数码管
int b = 4; // 定义数字接口4 连接b 段数码管
int c = 5; // 定义数字接口5 连接c 段数码管
int d = 6; // 定义数字接口6 连接d 段数码管
int e = 7; // 定义数字接口7 连接e 段数码管
int f = 8; // 定义数字接口8 连接f 段数码管
int g = 9; // 定义数字接口9 连接g 段数码管
int dp = 2; // 定义数字接口2 连接dp 段数码管

int one[] = {b, c};
int two[] = {3, 4, 9, 6, 7};
int three[] = {a, b, c, d, g};
int four[] = {f, g, b, c};
int five[] = {a, f, g, c, d};
int six[] = {f, e, d, c, g};
int seven[] = {a, b, c};
int eight[] = {a, b, c, d, e, g, f};
int nine[] = {a, b, c, d, f, g};

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

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

digitalWrite(dp, HIGH);
display_smg(one , 2);
delay(1000);
display_smg(two , 5);
delay(1000);
display_smg(three , 5);
delay(1000);
display_smg(four , 4);
delay(1000);
display_smg(five , 5);
delay(1000);
display_smg(six , 5);
delay(1000);
display_smg(seven , 3);
delay(1000);
display_smg(eight , 7);
delay(1000);
display_smg(nine , 6);
delay(1000);
}

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

Peter_wbgk 发表于 2015-7-7 07:41:51

二维数组不应该是这样么int all[][]={{one,two},{three,four}};

Peter_wbgk 发表于 2015-7-7 07:48:07

没看你的代码。我书里计算数组长度是这样做的while(mystring){strlength++}
mystring 为已知数组striength 为数组长度

liuxue4503 发表于 2015-7-7 09:22:37

本帖最后由 liuxue4503 于 2015-7-7 09:35 编辑

早上试运行了下。下面是我的部分见解:
第一:关于数组长度的计算,本身 (sizeof(nums) / sizeof(nums)) 这个算法是正解的,官方的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)) 的时候,结果一直都是1。

[email protected] 发表于 2015-7-7 10:44:51

Peter_wbgk 发表于 2015-7-7 07:48 static/image/common/back.gif
没看你的代码。我书里计算数组长度是这样做的while(mystring){strlength++}
mystring 为已知 ...

这应该是循环数组里的元素吧,这样可以吗,晚上试试

[email protected] 发表于 2015-7-7 10:54:19

liuxue4503 发表于 2015-7-7 09:22 static/image/common/back.gif
早上试运行了下。下面是我的部分见解:
第一:关于数组长度的计算,本身 (sizeof(nums) / sizeof(nums) ...

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

[email protected] 发表于 2015-7-7 10:57:51

Peter_wbgk 发表于 2015-7-7 07:41 static/image/common/back.gif
二维数组不应该是这样么int all[][]={{one,two},{three,four}};

因为我的one,two,也是数组,这样就变成三围数组了吧,有点晕

liuxue4503 发表于 2015-7-7 15:43:07

本帖最后由 liuxue4503 于 2015-7-7 16:00 编辑

[email protected] 发表于 2015-7-7 10:54 static/image/common/back.gif
谢谢解惑
遍历一个数组应该如何实现,我是想通过一个函数传递进去数组, ...

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