搜索
bottom↓
回复: 30

430C语言数组转换问题?

[复制链接]

出0入0汤圆

发表于 2013-6-9 09:23:57 | 显示全部楼层 |阅读模式
刚开始搞430用C。不是太熟悉。编了个数组转换的程序,子程序编译倒是通过了,但是一调用就出错。不知道是啥问题??

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

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2013-6-9 09:24:40 | 显示全部楼层
附上,数组转换程序。
void mapcha(uchar inmap[1024],uchar outmap[1024])//数组转换
{
  uint i;
  uint n;
  for(i=0;i<1024;++i) //共1024个数据
  {
    n=inmap[i];
    outmap[i]=n;
  }
}

出0入0汤圆

 楼主| 发表于 2013-6-9 09:25:34 | 显示全部楼层
子程序编译并没有出现错误提示。但是调用时就发生错误了

出0入0汤圆

 楼主| 发表于 2013-6-9 09:27:08 | 显示全部楼层
调用程序如下:
uchar outmap[1024]={0,};
mapcha(QTU12864,outmap);//OTU12864是已知的数组。outmap是待求的数组。

出0入0汤圆

 楼主| 发表于 2013-6-9 09:28:17 | 显示全部楼层
思路很简单就是数据倒蹬一下,错误也应该是很简单的问题,我刚上手C一时,一下也想不出问题根源。看看有知道的朋友能指点一二不。

出0入0汤圆

发表于 2013-6-9 09:28:50 | 显示全部楼层
你把整个程序贴上来吧,你都说了,这段程序可以编译通过。

出0入0汤圆

发表于 2013-6-9 09:31:01 | 显示全部楼层
uchar outmap[1024]={0,};

这是神马??

uchar outmap[1024];

出0入0汤圆

发表于 2013-6-9 10:39:07 | 显示全部楼层
void mapcha(uchar inmap[1024],uchar outmap[1024])//数组转换

---试下把这个改成指针传递

出0入0汤圆

发表于 2013-6-9 22:55:40 | 显示全部楼层
这么大的数组,怎么不用指针?
你这一调用就要消耗2K的RAM,RAM小一些的片子直接就报错啦,哪能这么浪费

出0入0汤圆

 楼主| 发表于 2013-6-13 08:11:40 | 显示全部楼层
lcofjp 发表于 2013-6-9 09:31
这是神马??

uchar outmap[1024];

这个是我定义了一整个1024长度的数组??有问题不?

出0入0汤圆

 楼主| 发表于 2013-6-13 08:14:17 | 显示全部楼层
lcofjp 发表于 2013-6-9 09:28
你把整个程序贴上来吧,你都说了,这段程序可以编译通过。

大虾,我吧程序都贴上来了。一个是子程序,一个是调用子程序。子程序编译没提示错误,以条用就出错了。我就是简单的编了一个程序,然后调用一下,还没看最终结果是不正确。调用时就出现错误提示啦。

出0入0汤圆

 楼主| 发表于 2013-6-13 08:14:33 | 显示全部楼层
祥子 发表于 2013-6-9 10:39
void mapcha(uchar inmap[1024],uchar outmap[1024])//数组转换

---试下把这个改成指针传递 ...

好的,谢谢

出0入0汤圆

 楼主| 发表于 2013-6-13 08:17:34 | 显示全部楼层
dalarang 发表于 2013-6-9 22:55
这么大的数组,怎么不用指针?
你这一调用就要消耗2K的RAM,RAM小一些的片子直接就报错啦,哪能这么浪费 ...

就是想做两个1024个数据的数组,然后让他们互相交换。(或者一个数组经过一个变换后送到另一个数组)。您的意思是这个数组忒长了,还是怎么滴??

出0入4汤圆

发表于 2013-6-13 08:34:03 | 显示全部楼层
gfy200866 发表于 2013-6-13 08:17
就是想做两个1024个数据的数组,然后让他们互相交换。(或者一个数组经过一个变换后送到另一个数组)。您 ...

1024的数组太大了,你想交换,就说明这个数组是可读写的,要定义到RAM里。
一般的RAM可能没有这么大,LZ如果将你所用芯片型号,源程序发一下,这里的大侠们会帮你搞定的。

用指针开销就比较小,也方便各种大小的数组交换

出0入0汤圆

发表于 2013-6-13 09:04:28 | 显示全部楼层
问题很明显,用了这么大的数组后RAM空间不足。在不调用此函数时,是可以编译通过的,只要一调用就会RAM不足报错。
数组尽量用指针来传递。
void mapcha(uchar *p1,uchar *p2)//数组转换
{
  uint i;
  for(i=0;i<1024;++i) //共1024个数据
  {
    *(p2+i)=*(p1+i);
  }
}

调用的时候
void main()
{
uchar inmap[1024],outmap[1024];
mapcha(inmap,outmap);
}

出0入0汤圆

 楼主| 发表于 2013-6-13 13:28:59 | 显示全部楼层
laujc 发表于 2013-6-13 08:34
1024的数组太大了,你想交换,就说明这个数组是可读写的,要定义到RAM里。
一般的RAM可能没有这么大,LZ ...

谢谢,貌似有点明白啦,我用的是430149的芯片。

出0入0汤圆

 楼主| 发表于 2013-6-13 13:30:03 | 显示全部楼层
dalarang 发表于 2013-6-13 09:04
问题很明显,用了这么大的数组后RAM空间不足。在不调用此函数时,是可以编译通过的,只要一调用就会RAM不足 ...

谢谢,大虾的指点。我试试,你的办法。

出0入4汤圆

发表于 2013-6-13 16:23:24 | 显示全部楼层
gfy200866 发表于 2013-6-13 13:28
谢谢,貌似有点明白啦,我用的是430149的芯片。

149正好2Kbyte RAM
你一个函数就用这么多,调用时,肯定出错啦,呵呵

出0入0汤圆

 楼主| 发表于 2013-6-14 08:13:37 | 显示全部楼层
laujc 发表于 2013-6-13 16:23
149正好2Kbyte RAM
你一个函数就用这么多,调用时,肯定出错啦,呵呵

谢谢大虾的指点,好像是找到问题根源了
但是我还不太明白函数是怎么在RAM分配空间的,怎么看才知道会超出呢。函数是怎么占用RAM的呢?能不能给讲讲,或者我该看那方面的知识呢。再次感谢!

出0入4汤圆

发表于 2013-6-14 11:54:29 | 显示全部楼层
gfy200866 发表于 2013-6-14 08:13
谢谢大虾的指点,好像是找到问题根源了 。
但是我还不太明白函数是怎么在RAM分配空间的,怎么看才 ...

其实你编译好后,编译器一般会给出一个输出,说明程序占用的Flash和RAM大小。
但是程序在运行时,也会动态地占用RAM(堆栈就是在RAM中,每次压栈就进入一部分数据到RAM的堆栈中)
一般仿真时,会给出警告。

详细讲的话,里面有很多东西

出0入0汤圆

 楼主| 发表于 2013-6-15 11:16:38 | 显示全部楼层
laujc 发表于 2013-6-14 11:54
其实你编译好后,编译器一般会给出一个输出,说明程序占用的Flash和RAM大小。
但是程序在运行时,也会动 ...

非常感谢,大虾,不厌其烦的回答。我在搜搜相关知识吧。看来C也要考虑一下空间分配的问题呵呵。再次感谢

出0入4汤圆

发表于 2013-6-15 12:46:13 | 显示全部楼层
gfy200866 发表于 2013-6-15 11:16
非常感谢,大虾,不厌其烦的回答。我在搜搜相关知识吧。看来C也要考虑一下空间分配的问题呵呵。再次感谢{ ...

是要好好看一下,C语言对临时变量,全局变量,局部静态变量,堆,栈,都分配不同的空间的,别然这些都是在RAM区。
看一下对自己以后写程序有好处。。。。

出0入0汤圆

 楼主| 发表于 2013-6-17 08:04:49 | 显示全部楼层
laujc 发表于 2013-6-15 12:46
是要好好看一下,C语言对临时变量,全局变量,局部静态变量,堆,栈,都分配不同的空间的,别然这些都是 ...

好的,大虾。非常感谢。

出70入0汤圆

发表于 2013-6-18 15:12:28 | 显示全部楼层
祥子 发表于 2013-6-9 10:39
void mapcha(uchar inmap[1024],uchar outmap[1024])//数组转换

---试下把这个改成指针传递 ...

uchar inmap[1024] 和 uchar * inmap是完全等价的,传递形参就是传递的数组首地址,也就是指针

出0入0汤圆

发表于 2013-6-18 15:28:20 | 显示全部楼层
绿茶山人 发表于 2013-6-18 15:12
uchar inmap[1024] 和 uchar * inmap是完全等价的,传递形参就是传递的数组首地址,也就是指针 ...

恩,这个知道。  数组是传首地址。

定义了数组[1024],在传递参数的时候,会先申请这么大的内存空间吗?  还是只申请指针大小的空间?

出70入0汤圆

发表于 2013-6-18 15:32:32 | 显示全部楼层
祥子 发表于 2013-6-18 15:28
恩,这个知道。  数组是传首地址。

定义了数组[1024],在传递参数的时候,会先申请这么大的内存空间吗?  ...

你定义了数组[1024]后,传递参数是不会再去申请内存空间的,直接传递数组首地址。

出0入0汤圆

 楼主| 发表于 2013-6-18 16:24:51 | 显示全部楼层
绿茶山人 发表于 2013-6-18 15:32
你定义了数组[1024]后,传递参数是不会再去申请内存空间的,直接传递数组首地址。 ...

值得回味,需要继续深入学习。

出70入0汤圆

发表于 2013-6-18 16:29:58 | 显示全部楼层
gfy200866 发表于 2013-6-18 16:24
值得回味,需要继续深入学习。

其实这就是C语言的一些问题和什么平台单片机没关系,C语言非常非常重要。

出0入0汤圆

 楼主| 发表于 2013-6-18 16:32:52 | 显示全部楼层
绿茶山人 发表于 2013-6-18 16:29
其实这就是C语言的一些问题和什么平台单片机没关系,C语言非常非常重要。 ...

刚入门C语言,所以搞出这么多笑话,实在汗颜啊呵呵。我还有另一个问题,不知到你能给指点下。后面是连接http://www.amobbs.com/forum.php? ... p;page=1#pid6760877

出70入0汤圆

发表于 2013-6-18 16:56:40 | 显示全部楼层
gfy200866 发表于 2013-6-18 16:32
刚入门C语言,所以搞出这么多笑话,实在汗颜啊呵呵。我还有另一个问题,不知到你能给指点下。后面是连接h ...

已经给你回帖了,以前参加TI的活动得了两块430的板子,可惜没用它做东西。

出0入0汤圆

 楼主| 发表于 2013-6-19 08:01:23 | 显示全部楼层
绿茶山人 发表于 2013-6-18 16:56
已经给你回帖了,以前参加TI的活动得了两块430的板子,可惜没用它做东西。 ...

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

本版积分规则

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

GMT+8, 2024-5-18 13:33

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

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