搜索
bottom↓
回复: 25

51单片机的一个赋值问题--数组

[复制链接]

出0入0汤圆

发表于 2013-8-19 11:29:57 | 显示全部楼层 |阅读模式
本帖最后由 and001 于 2013-8-19 11:49 编辑

存在如下一个赋值问题:

我的目的是将一个4位数分别单独转换成数字显示出来:


方法一:

char i=1;
unsigned ring_lengther[2]={2023,6723};
unsigned ring_lengther;   
unsinged k2,

        ring_lengther=ring_length;
         k2= ring_length/1000;

         k3=ring_length%1000/100;
         k4=ring_length%100/10;
         k5=ring_length%10;

运行最后显示的是: 0000

方法二:

char i=1;
unsigned ring_length[2]={2023,6723};
unsigned ring_lengther;   
unsinged k2,

         ring_lengther=ring_length;
         k2= ring_lengther/1000;

         k3=ring_lengther%1000/100;
         k4=ring_lengther%100/10;
         k5=ring_lengther%10;

运行最后显示的是:K2=6  K3=7 K4=2  K5=3


请弄过的朋友解释下为啥方法一得不到所需要的结果?!

各抒己见!

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2013-8-19 11:51:23 | 显示全部楼层
事实上ring_lengther=ring_length;
应该为 ring_lengther=ring_length[i];
不知道为啥改不了!

出0入10汤圆

发表于 2013-8-19 12:00:31 | 显示全部楼层
什么地方不一样?看了几遍都没有看出来。难道我眼神不好?

出0入0汤圆

 楼主| 发表于 2013-8-19 12:13:13 | 显示全部楼层
哈哈!
一个是数组直接操作除和取余运行,一个是数组赋给一变量后进行运算!
楼下看清了吗?

出0入0汤圆

发表于 2013-8-19 12:21:16 | 显示全部楼层
unsigned ring_lengther[2]={2023,6723};
什么数据类型?  应该是unsigned int ring_lengther[2]={2023,6723};

出0入0汤圆

 楼主| 发表于 2013-8-19 12:21:33 | 显示全部楼层
本帖最后由 and001 于 2013-8-19 15:47 编辑

不好意思再贴一次问题(贴上去的时候是漏了东西)

再贴一次:


方法一:

unsigned char i=1;
unsigned short ring_length[2]={2023,6723};
unsigned short ring_lengther;   
unsinged char k2,k3,k4,k5;

ring_lengther=ring_length;
k2= ring_length/1000;

k3=ring_length%1000/100;
k4=ring_length%100/10;
k5=ring_length%10;

运行结果: 0000


方法二:

unsigned char i=1;
unsigned short ring_length[2]={2023,6723};
unsigned short ring_lengther;   
unsinged char k2,k3,k4,k5;

ring_lengther=ring_length;
k2= ring_lengther/1000;

k3=ring_lengther%1000/100;
k4=ring_lengther%100/10;
k5=ring_lengther%10;

运行结果: k2=6 k3=7 k4=2 k5=3

出0入0汤圆

 楼主| 发表于 2013-8-19 15:46:40 | 显示全部楼层
贴得还有问题,我已经更新了!非常不好意思!

出0入0汤圆

 楼主| 发表于 2013-8-19 15:51:49 | 显示全部楼层
晕贴上了后好像不能修改了!

再贴(忽略之前的)

目的:想得到数组各位的数据(转换后得到)

方法一:

unsigned char i=1;
unsigned short ring_length[2]={2023,6723};
unsigned short ring_lengther;   
unsinged char k2,k3,k4,k5;

ring_lengther=ring_length[i];
k2= ring_length/1000;

k3=ring_length[i]%1000/100;
k4=ring_length[i]%100/10;
k5=ring_length[i]%10;

运行结果: 0000


方法二:

unsigned char i=1;
unsigned short ring_length[2]={2023,6723};
unsigned short ring_lengther;   
unsinged char k2,k3,k4,k5;

ring_lengther=ring_length[i];
k2= ring_lengther/1000;

k3=ring_lengther%1000/100;
k4=ring_lengther%100/10;
k5=ring_lengther%10;

运行结果: k2=6 k3=7 k4=2 k5=3

出0入0汤圆

发表于 2013-8-19 15:52:44 | 显示全部楼层
ring_length是unsigned short的指针
ring_lengther是unsigned short变量
怎么赋值?
应该是
unsigned short * ring_lengther;
ring_lengther = ring_length;
k2= *ring_lengther/1000;

出0入0汤圆

 楼主| 发表于 2013-8-19 16:07:45 | 显示全部楼层
谢谢!
可是我的是ring_lengther=ring_length[i];  不就是数据赋给数据了!!

我需要的是数组中的各数据都能能转换,也就是说 i=1,2都要可以的!
谢谢指点

出0入0汤圆

 楼主| 发表于 2013-8-19 16:08:52 | 显示全部楼层
可否直接数组操作呢?

出0入0汤圆

发表于 2013-8-19 16:10:48 | 显示全部楼层
我看错了,ring_lengther=ring_length[i];  是可以的
不过数组是从0开始的,所以第二个的答案是对的

出0入0汤圆

 楼主| 发表于 2013-8-19 16:21:36 | 显示全部楼层
我很想知道方法一错在哪里?

出0入0汤圆

发表于 2013-8-20 00:28:10 | 显示全部楼层
怎么看来看去都一样的?

出0入0汤圆

发表于 2013-8-20 00:38:30 | 显示全部楼层
方法1,直接对数组操作,数组名只是数组的首地址,你对数组名求余、取除,应该是对地址操作后得到的内存地址的值

出0入0汤圆

 楼主| 发表于 2013-8-20 09:21:30 | 显示全部楼层
请上面以8楼信息为准,之前的是错误的!
8楼不是针对数组名的

出0入30汤圆

发表于 2013-8-20 09:39:41 | 显示全部楼层
方法1中,k2= ring_length/1000;看看这句。

出0入0汤圆

 楼主| 发表于 2013-8-20 09:48:36 | 显示全部楼层
上面说得对确实这句有问题,但已经改不了了!
这句本该是k2= ring_length[i]/1000;   //上传笔误

其实问题还在存在!

出0入42汤圆

发表于 2013-8-20 10:14:39 | 显示全部楼层
是脑子不清晰还是遮遮掩掩舍不得贴那几行原版代码? 就这么几行代码, 贴了两天改来改去还错误百出... 要是我就直接找地缝去了. 有些错咱可以犯, 有些错, 咱不可以犯...

还有,对于把i初始化为1的行为... 我们表示很

方法一工作起来没有问题:
点这里看结果

出0入0汤圆

 楼主| 发表于 2013-8-20 10:30:24 | 显示全部楼层
本帖最后由 and001 于 2013-8-20 10:32 编辑

楼上误会了!确实剪切后粘贴就会掉""导致老丢,这几行代码本就是让人帮忙看得那还---值得遮遮掩掩吗!!!冤枉呀 !

请问楼上是用啥工具编译的,我是KEIL 提示输出 全是“0”


初始化为=1或者0,是我任意选的!我的目的是要都能访问就可以了!

出0入42汤圆

发表于 2013-8-20 11:23:47 | 显示全部楼层
and001 发表于 2013-8-20 10:30
楼上误会了!确实剪切后粘贴就会掉""导致老丢,这几行代码本就是让人帮忙看得那还---值得遮遮掩掩吗!!! ...

在gcc 4.1.1 测试, 得到完全相同的结果. 事实上,任意编译器都应该得到正确的结果. 也许你的kx被优化了, 这部分操作是不存在任何疑问的,非常标准的.

你可以把你的完整测试代码放上来看,不要为了方便理解, 把它改得四不像, 这样只会增加沟通障碍.  如果你要简化到方便理解,请在keil里面修改好, 编译测试后再贴上来. 保证贴上来的代码和你测试的代码是完全一样的.否则... 大家都在做无用功.
请帖一份类似下面的代码上来:

Link: http://codepad.org/V6MDCDTn    [ raw code | output | fork ]       

C, pasted 1 hour ago:

#include<stdio.h>

int main(void) {
    unsigned char i=1;
    unsigned short ring_length[2]={2023,6723};
    unsigned short ring_lengther;
    unsigned char k2,k3,k4,k5;

    ring_lengther=ring_length;
    k2= ring_length/1000;

    k3=ring_length%1000/100;
    k4=ring_length%100/10;
    k5=ring_length%10;

    printf("k2:%d, k3:%d, k4:%d, k5:%d\n", k2, k3, k4, k5);
    return 0;
}


Output:
1
k2:6, k3:7, k4:2, k5:3

出0入93汤圆

发表于 2013-8-20 11:31:15 | 显示全部楼层
and001 发表于 2013-8-20 10:30
楼上误会了!确实剪切后粘贴就会掉""导致老丢,这几行代码本就是让人帮忙看得那还---值得遮遮掩掩吗!!! ...

态度极其不端正,遮遮掩掩就别找理由了

我只问你一句,
方法1的“运行最后显示的是: 0000”
和方法2的“运行最后显示的是:K2=6  K3=7 K4=2  K5=3”
是等价的吗?一个是0000我都不知道你到底想表达啥,另一个则是非常明确地K2、K3、K4、K5,而且大小写还不一样,你家的C编译器不区分大小写的?

出0入0汤圆

发表于 2013-8-20 11:32:03 | 显示全部楼层
贴一段乱78糟的代码,问模糊不清的问题,,,,

出0入0汤圆

 楼主| 发表于 2013-8-20 12:05:28 | 显示全部楼层
我向各位检讨!!

后面的结果是我手敲的!是小写!抱歉各位兄弟!

出0入0汤圆

 楼主| 发表于 2013-8-20 12:07:06 | 显示全部楼层
本帖最后由 and001 于 2013-8-20 12:10 编辑
albert_w 发表于 2013-8-20 11:23
在gcc 4.1.1 测试, 得到完全相同的结果. 事实上,任意编译器都应该得到正确的结果. 也许你的kx被优化了,  ...


非常感谢楼上指导!

出0入0汤圆

发表于 2013-8-20 15:00:39 来自手机 | 显示全部楼层
高手挺多的学习了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 16:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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