gfy200866 发表于 2013-6-9 09:23:57

430C语言数组转换问题?

刚开始搞430用C。不是太熟悉。编了个数组转换的程序,子程序编译倒是通过了,但是一调用就出错。不知道是啥问题??

gfy200866 发表于 2013-6-9 09:24:40

附上,数组转换程序。
void mapcha(uchar inmap,uchar outmap)//数组转换
{
uint i;
uint n;
for(i=0;i<1024;++i) //共1024个数据
{
    n=inmap;
    outmap=n;
}
}

gfy200866 发表于 2013-6-9 09:25:34

子程序编译并没有出现错误提示。但是调用时就发生错误了{:mad:}

gfy200866 发表于 2013-6-9 09:27:08

调用程序如下:
uchar outmap={0,};
mapcha(QTU12864,outmap);//OTU12864是已知的数组。outmap是待求的数组。

gfy200866 发表于 2013-6-9 09:28:17

思路很简单就是数据倒蹬一下,错误也应该是很简单的问题,我刚上手C一时,一下也想不出问题根源。看看有知道的朋友能指点一二不。

lcofjp 发表于 2013-6-9 09:28:50

你把整个程序贴上来吧,你都说了,这段程序可以编译通过。

lcofjp 发表于 2013-6-9 09:31:01

uchar outmap={0,};
这是神马??

uchar outmap;

祥子 发表于 2013-6-9 10:39:07

void mapcha(uchar inmap,uchar outmap)//数组转换

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

dalarang 发表于 2013-6-9 22:55:40

这么大的数组,怎么不用指针?
你这一调用就要消耗2K的RAM,RAM小一些的片子直接就报错啦,哪能这么浪费

gfy200866 发表于 2013-6-13 08:11:40

lcofjp 发表于 2013-6-9 09:31 static/image/common/back.gif
这是神马??

uchar outmap;

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

gfy200866 发表于 2013-6-13 08:14:17

lcofjp 发表于 2013-6-9 09:28 static/image/common/back.gif
你把整个程序贴上来吧,你都说了,这段程序可以编译通过。

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

gfy200866 发表于 2013-6-13 08:14:33

祥子 发表于 2013-6-9 10:39 static/image/common/back.gif
void mapcha(uchar inmap,uchar outmap)//数组转换

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

好的,谢谢

gfy200866 发表于 2013-6-13 08:17:34

dalarang 发表于 2013-6-9 22:55 static/image/common/back.gif
这么大的数组,怎么不用指针?
你这一调用就要消耗2K的RAM,RAM小一些的片子直接就报错啦,哪能这么浪费 ...

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

laujc 发表于 2013-6-13 08:34:03

gfy200866 发表于 2013-6-13 08:17 static/image/common/back.gif
就是想做两个1024个数据的数组,然后让他们互相交换。(或者一个数组经过一个变换后送到另一个数组)。您 ...

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

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

dalarang 发表于 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,outmap;
mapcha(inmap,outmap);
}

gfy200866 发表于 2013-6-13 13:28:59

laujc 发表于 2013-6-13 08:34 static/image/common/back.gif
1024的数组太大了,你想交换,就说明这个数组是可读写的,要定义到RAM里。
一般的RAM可能没有这么大,LZ ...

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

gfy200866 发表于 2013-6-13 13:30:03

dalarang 发表于 2013-6-13 09:04 static/image/common/back.gif
问题很明显,用了这么大的数组后RAM空间不足。在不调用此函数时,是可以编译通过的,只要一调用就会RAM不足 ...

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

laujc 发表于 2013-6-13 16:23:24

gfy200866 发表于 2013-6-13 13:28 static/image/common/back.gif
谢谢,貌似有点明白啦,我用的是430149的芯片。

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

gfy200866 发表于 2013-6-14 08:13:37

laujc 发表于 2013-6-13 16:23 static/image/common/back.gif
149正好2Kbyte RAM
你一个函数就用这么多,调用时,肯定出错啦,呵呵

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

laujc 发表于 2013-6-14 11:54:29

gfy200866 发表于 2013-6-14 08:13 static/image/common/back.gif
谢谢大虾的指点,好像是找到问题根源了 。
但是我还不太明白函数是怎么在RAM分配空间的,怎么看才 ...

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

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

gfy200866 发表于 2013-6-15 11:16:38

laujc 发表于 2013-6-14 11:54 static/image/common/back.gif
其实你编译好后,编译器一般会给出一个输出,说明程序占用的Flash和RAM大小。
但是程序在运行时,也会动 ...

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

laujc 发表于 2013-6-15 12:46:13

gfy200866 发表于 2013-6-15 11:16 static/image/common/back.gif
非常感谢,大虾,不厌其烦的回答。我在搜搜相关知识吧。看来C也要考虑一下空间分配的问题呵呵。再次感谢{ ...

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

gfy200866 发表于 2013-6-17 08:04:49

laujc 发表于 2013-6-15 12:46 static/image/common/back.gif
是要好好看一下,C语言对临时变量,全局变量,局部静态变量,堆,栈,都分配不同的空间的,别然这些都是 ...

好的,大虾。非常感谢。

绿茶山人 发表于 2013-6-18 15:12:28

祥子 发表于 2013-6-9 10:39 static/image/common/back.gif
void mapcha(uchar inmap,uchar outmap)//数组转换

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

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

祥子 发表于 2013-6-18 15:28:20

绿茶山人 发表于 2013-6-18 15:12 static/image/common/back.gif
uchar inmap 和 uchar * inmap是完全等价的,传递形参就是传递的数组首地址,也就是指针 ...

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

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

绿茶山人 发表于 2013-6-18 15:32:32

祥子 发表于 2013-6-18 15:28 static/image/common/back.gif
恩,这个知道。数组是传首地址。

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

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

gfy200866 发表于 2013-6-18 16:24:51

绿茶山人 发表于 2013-6-18 15:32 static/image/common/back.gif
你定义了数组后,传递参数是不会再去申请内存空间的,直接传递数组首地址。 ...

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

绿茶山人 发表于 2013-6-18 16:29:58

gfy200866 发表于 2013-6-18 16:24 static/image/common/back.gif
值得回味,需要继续深入学习。

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

gfy200866 发表于 2013-6-18 16:32:52

绿茶山人 发表于 2013-6-18 16:29 static/image/common/back.gif
其实这就是C语言的一些问题和什么平台单片机没关系,C语言非常非常重要。 ...

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

绿茶山人 发表于 2013-6-18 16:56:40

gfy200866 发表于 2013-6-18 16:32 static/image/common/back.gif
刚入门C语言,所以搞出这么多笑话,实在汗颜啊呵呵。我还有另一个问题,不知到你能给指点下。后面是连接h ...

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

gfy200866 发表于 2013-6-19 08:01:23

绿茶山人 发表于 2013-6-18 16:56 static/image/common/back.gif
已经给你回帖了,以前参加TI的活动得了两块430的板子,可惜没用它做东西。 ...

非常感谢{:victory:}
页: [1]
查看完整版本: 430C语言数组转换问题?