数码之家

 找回密码
 立即注册
搜索
查看: 1450|回复: 12

C编程关于参数传递的问题请教,希望高手得闲指点一下

[复制链接]
发表于 2019-12-5 15:59:21 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
关注过我发帖的坛友应该知道,我爱玩单片机但编程很菜,今天有一个C编程的问题来请教大家,希望各位指点一下。
做过好多时钟,按键程序早就不是问题了,今天找出OLED0.96”的小屏幕准备做一个定时器,调试按键时突发奇想改变了一下参数的传递方法,结果没有成功,具体问题如下:
1.好用的函数:演示效果为N1每次按动数码显示+1变化
//===========================

//在程序开头定义的公用变量 uchar r;
void set()
{
if(N1==0)//选择键   
{
delay_1ms(25);      
if(N1==0)   
  {   
  r++;   
  if(r>7)   
   {
   r=0;
   }
  while(!N1);
  }
}
}
//====主函数===
main()
{

while(1)
{
set();
Display_convert(r);//数码管显示函数

}}
///---------此处是分割线------------------------------------------///
2.好用的函数,演示效果同上:
//====主函数==========
main()
{
uchar z;
while(1)
{
if(N1==0)//选择键   
{
delay_1ms(25);      
if(N1==0)   
  {   
  z++;   
  if(z>7)   
   {
   z=0;
   }
Display_convert(z);
  while(!N1);
  }
}

}}
///-----------以下是有问题的函数---------------------------------///
3.不好用的函数,演示效果为数码管显示不变、键值参数没有被传递
uchar set()
{
uchar r
if(N1==0)//选择键   
{
delay_1ms(25);      
if(N1==0)   
  { led =~led;//此处临时加一个灯演示按键是否有效
  r++;   
  if(r>7)   
   {
   r=0;
   }
  while(!N1);
  }
}
return(r);
}
//====主函数========
main()
{
uchar z;
while(1)
{
z=set();   
Display_convert(z); //数码管显示无变化但led指示灯变化是正常的
}}
发表于 2019-12-5 16:33:39 | 显示全部楼层
本帖最后由 szb314 于 2019-12-5 16:40 编辑

小白路过,,r=0了return 0 :lol: 没仔细看,自己KEIL调试一下就看出问题了
回复 支持 反对

使用道具 举报

发表于 2019-12-5 16:43:00 | 显示全部楼层
试一下把第三个程序的  uchar r    改为  static uchar r ;   
回复 支持 反对

使用道具 举报

发表于 2019-12-5 17:54:32 来自手机浏览器 | 显示全部楼层
uchar r放到函数外面,全局变量才行,你这是定义的局部变量。
回复 支持 反对

使用道具 举报

发表于 2019-12-6 01:13:36 | 显示全部楼层
r的作用域不对啊,r只是局部变量,出不了函数的,建议学下C语言,这是最基本的基础:handshake:
回复 支持 反对

使用道具 举报

发表于 2019-12-6 13:54:19 | 显示全部楼层
uchar set()
{
    static uchar r = 0;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-6 20:50:26 | 显示全部楼层
好的,谢谢各位的热心指点。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-6 20:54:11 | 显示全部楼层
40560335 发表于 2019-12-6 01:13
r的作用域不对啊,r只是局部变量,出不了函数的,建议学下C语言,这是最基本的基础 ...

年岁大了读书记不住太多了,多谢热心指点,确实是局部变量的问题,现在程序已经跑起来了正在调试其他功能,再谢各位热心层主。
回复 支持 反对

使用道具 举报

发表于 2019-12-6 21:23:57 | 显示全部楼层
40560335 发表于 2019-12-6 01:13
r的作用域不对啊,r只是局部变量,出不了函数的,建议学下C语言,这是最基本的基础 ...

建议你学习下C语言,return没有什么作用域的事。
#include "stdio.h"
#include  "stdlib.h"


int test(void)
{
        int i;
       
        i=6*7;
        return i;       
       
}

int main(void)
{
        printf("%d\r\n",test());       
}

正常输出42
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-7 20:08:11 | 显示全部楼层
netbeetle 发表于 2019-12-6 21:23
建议你学习下C语言,return没有什么作用域的事。
#include "stdio.h"
#include  "stdlib.h"

多谢耐心指点,我是业余玩单片机的,C语言学了好久也没入门主要是看书不觉得有问题而编程时一旦遇到问题就蒙圈,另外我一直是通过搭硬件实物调试程序的,不断的修改代码再下载到单片机里看实况,不行就需要改的。
回复 支持 反对

使用道具 举报

发表于 2019-12-7 21:08:35 | 显示全部楼层
这里return(r); 视乎不需要括号, 函数内的变量,执行完要保持的视乎用静态变量,如楼上网友说的static uchar r = 0;
回复 支持 反对

使用道具 举报

发表于 2019-12-7 23:54:49 | 显示全部楼层
zxq9781 发表于 2019-12-7 21:08
这里return(r); 视乎不需要括号, 函数内的变量,执行完要保持的视乎用静态变量,如楼上网友说的static uch ...

无需静态,楼主的应该是逻辑错误,和变量无关。
回复 支持 反对

使用道具 举报

发表于 2019-12-8 01:42:41 | 显示全部楼层
netbeetle 发表于 2019-12-6 21:23
建议你学习下C语言,return没有什么作用域的事。
#include "stdio.h"
#include  "stdlib.h"

没缩进看岔了,确实应该是逻辑问题。:lol:
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-6-5 20:54 , Processed in 0.218401 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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