主题:c语言如何把数组作为函数的参数?
程序是用keil c写的,用单片机仿真软件proteus软件进行仿真, #include "reg52.h"
sbit DS = P2^0;
sbit SH = P2^1;
sbit ST = P2^2;
#define uchar unsigned char
#define uint unsigned int
#define uchar unsigned char
uchar a1=0x01,a2=0x02,a3=0x04,a4=0x08,a5=0x10,a6=0x20,a7=0x40,a8=0x80;
uint a9=0x0100,a10=0x0200,a11=0x0400,a12=0x0800,a13=0x1000,a14=0x2000,a15=0x4000,a16=0x8000,s1=0x00,s1t=0x00;
uchar ul1[]={5,3,0x01,0x02,0x04};ul0[]={5,3,0x04,0x02,0x01};w[]={5,3,0x08,0x10,0x20};
void delay(unsigned int delay)
{
unsigned char i;
for(;delay>0;delay--)
for(i=0;i<125;i++);
}
void s_d(uchar d[])//发送数据
{
uchar i,j;
for(i=2;i<d[0];i++)
{
s1=s1^d;
s1t=s1;
ST=0;
for(j=0;j<16;j++)
{
SH=0;
s1t=s1t<<1;
DS = CY;
SH=1;
}
delay(d[1]); //延迟
ST=1; //输出结果
}
}
main
{
main ()
{
s_d(ul1);
delay(10);
s_d(ul0);
delay(10);
s_d(w)
}
}
我是这么考虑的,a1到a16分别对应两片595的16个输出端,s1和s1l是输出的最终结果。
数组ul1[]和ul0[]是控制a1,a2,a3开启和关闭的,这三台电机作为一个整体实现一个功能,用ul0和ul1来整体控制。
ul1{5,3,0x01,0x02,0x04}这五个元素分别代表,5:数组有5个元素,3:每个电机开启的间隔时间为3秒,0x01,0x02,0x04就代表ul组的三个电机。
我用ul1这个数组作为子程序s_d的参数。但是程序这样写不行,模拟运行后发现一个灯都不能亮。于是找问题,我先不用模块化,先把函数写到main里。
main
{
i=2;
s1=ul1;
s1t=s1;
ST=0;
for(h=0;h<16;h++)
{
SH=0;
s1t=s1t<<1;
DS = CY;
SH=1;
}
ST=1;
}
这样写完全正常,我不停的手动改i的值,i=2,i=3,i=4,模拟运行结果正常,
但是我如果加入一个for的循环之后,模拟运行的结果就完全错误,代码是这样的:
main
{
i=2;
for(i=2;i<ul1[0];i++)
{
s1=ul1;
s1t=s1;
ST=0;
for(h=0;h<16;h++)
{
SH=0;
s1t=s1t<<1;
DS = CY;
SH=1;
}
ST=1;
i++
}
}
把for改成for(;i<5;) 也是一样的。
我想问一下,我的代码到底错在哪里?麻烦大家帮忙看看。
还有一个问题就是如果按最初的想法模块化,子程序应该如何才能接收数组作为参数呢?应该怎么写才对?
sbit DS = P2^0;
sbit SH = P2^1;
sbit ST = P2^2;
#define uchar unsigned char
#define uint unsigned int
#define uchar unsigned char
uchar a1=0x01,a2=0x02,a3=0x04,a4=0x08,a5=0x10,a6=0x20,a7=0x40,a8=0x80;
uint a9=0x0100,a10=0x0200,a11=0x0400,a12=0x0800,a13=0x1000,a14=0x2000,a15=0x4000,a16=0x8000,s1=0x00,s1t=0x00;
uchar ul1[]={5,3,0x01,0x02,0x04};ul0[]={5,3,0x04,0x02,0x01};w[]={5,3,0x08,0x10,0x20};
void delay(unsigned int delay)
{
unsigned char i;
for(;delay>0;delay--)
for(i=0;i<125;i++);
}
void s_d(uchar d[])//发送数据
{
uchar i,j;
for(i=2;i<d[0];i++)
{
s1=s1^d;
s1t=s1;
ST=0;
for(j=0;j<16;j++)
{
SH=0;
s1t=s1t<<1;
DS = CY;
SH=1;
}
delay(d[1]); //延迟
ST=1; //输出结果
}
}
main
{
main ()
{
s_d(ul1);
delay(10);
s_d(ul0);
delay(10);
s_d(w)
}
}
我是这么考虑的,a1到a16分别对应两片595的16个输出端,s1和s1l是输出的最终结果。
数组ul1[]和ul0[]是控制a1,a2,a3开启和关闭的,这三台电机作为一个整体实现一个功能,用ul0和ul1来整体控制。
ul1{5,3,0x01,0x02,0x04}这五个元素分别代表,5:数组有5个元素,3:每个电机开启的间隔时间为3秒,0x01,0x02,0x04就代表ul组的三个电机。
我用ul1这个数组作为子程序s_d的参数。但是程序这样写不行,模拟运行后发现一个灯都不能亮。于是找问题,我先不用模块化,先把函数写到main里。
main
{
i=2;
s1=ul1;
s1t=s1;
ST=0;
for(h=0;h<16;h++)
{
SH=0;
s1t=s1t<<1;
DS = CY;
SH=1;
}
ST=1;
}
这样写完全正常,我不停的手动改i的值,i=2,i=3,i=4,模拟运行结果正常,
但是我如果加入一个for的循环之后,模拟运行的结果就完全错误,代码是这样的:
main
{
i=2;
for(i=2;i<ul1[0];i++)
{
s1=ul1;
s1t=s1;
ST=0;
for(h=0;h<16;h++)
{
SH=0;
s1t=s1t<<1;
DS = CY;
SH=1;
}
ST=1;
i++
}
}
把for改成for(;i<5;) 也是一样的。
我想问一下,我的代码到底错在哪里?麻烦大家帮忙看看。
还有一个问题就是如果按最初的想法模块化,子程序应该如何才能接收数组作为参数呢?应该怎么写才对?