c语言 函数调用 传值调用 引用调用 传地址调用,C语言中的传值调用和引用调用...

在使用一个音频芯片时,需要用到这样一个功能,即对音量进行调节。在厂家提供的驱动里面没有这样的功能函数,因此需要自行添加。注意到厂家提供的驱动里面包含了一个写入命令的函数,void Vol_Cmd(uint 8 vol), 其中vol是音量的数值,范围为0~255,这个函数的作用就是通过写入vol的值来改变音量。

因此实现音量调节的思路就有了:

把当前vol的值相应的增加或者减少,然后再调用Vol_Cmd()函数把它写入到芯片中,就实现了音量的增减。很简单吧。但是有一个问题,那就是要注意到Vol_Cmd()函数是没有返回值的,那么vol的值怎么样才能更新呢?也就是说,怎样才能获得vol的当前值呢?

我最开始的想法是构造这样两个函数(以音量增加为例,音量减少类似):

uint8 Vol_Inc(uint8 vol)

{ if(vol<=0xf0)

vol+=0x0f;          //以15作为增量,从音量最小到最大一共有16档

Vol_Cmd(vol);

return vol;

}

很明显,我的想法是在 Vol_Inc()函数中做两件事,一件事是把vol的值增加之后写入到芯片中,实现音量的增加,另一件事是把增加后的值返回,以便下次调用Vol_Inc()函数的时候vol的值已经更新。那么调用这个函数就必须遵循这样的格式:

uint8 vol="120";          // 初始化为一个中间值

vol=Vol_Inc(vol);

当然这样是没有错误的,不过在板子上调试的时候却发现一个问题,那就是调用Vol_Inc()函数的次数不能连续超过六次,否则音量就变为0。Debug的时候单步跑到Vol_Inc()函数的时候就warning,然后error。研究了很长时间都没有解决这个问题。

同project leader沟通之后,他表示音量调节只需要5档就够了,但是最好还是要保持程序的flexibility。只需要5档?我把增量的值改为0x32之后放到板子上跑,这下就一切正常了,音量加减都没有问题。

问题看似解决了,但是我还是觉得不舒服。vol=Vol_Inc(vol);这个调用看来起很不舒服。抛开这个具体的问题,我想了一下函数调用的问题。想到指针的时候,我发现自己犯傻了。

C语言的函数调用采用的是传值调用,也就是说调用函数之后并不改变传递的原始参数的值,传递给子函数的只是一个副本,下面举例说明:

#include "stdio.h"

#include "stdlib.h"

void Vol_Inc(int p);

main()

{ int vol="100";

Vol_Inc(vol);

printf("vol=%d\n",vol);

system("pause");

}

void Vol_Inc(int p)

{ p+=15;

}

很明显,输出为vol=100;因为main在调用Vol_Inc()的时候只是把vol=100的一个副本传递给Vol_Inc(),调用之后vol的原本没有变,因此vol值并不会改变。但是这个音量加减程序要改变原本的值,怎么办? 很简单,用指针。与传值调用相对应的是引用调用(call by reference),C语言并不支持,只能通过使用指针参数来模仿。

#include "stdio.h"

#include "stdlib.h"

void Vol_Inc(int *p);

main()

{ int vol="100";

Vol_Inc(&vol);

printf("vol=%d\n",vol);

system("pause");

}

void Vol_Inc(int *p)

{ *p+=15;

}

这下输出就是vol=115了,也就是说我的目的达到了。按照这个思路修改了一下音量增减的函数,放在板子上运行,完全正常。难道以前的vol=Vol_Inc(vol)调用有问题?我怀疑是。不管了,我也没有精力去深究了,反正这个问题已经解决了。

经验教训:

这个问题是一个初级得不能再初级的C语言问题,自己怎么就在开始走了弯路呢。埋头做项目的时候,思路太窄,不能把以往学习的知识很好的应用起来。前天一个师兄在QQ群里也说道,大家都在做项目,几乎都没有怎么静下心看书,其实书上很多的地方都写得很清楚了……

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/503240.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java虚拟机JVM的内部体系结构

JVM(Java虚拟机)是一个抽象机器。 它是一个提供可以执行Java字节码的运行时环境的规范。JVM可用于许多硬件和软件平台(即JVM是平台相关的)。 什么是JVM&#xff1f; JVM(Java虚拟机)是&#xff1a; 指定Java虚拟机的工作的规范。 但实现提供程序是独立的选择算法。 其实现是由…

Java并发编程——volatile

1. 并发编程的两个关键问题 并发是让多个线程同时履行&#xff0c;若线程之间是独立的&#xff0c;那并发实现起来很简单&#xff0c;各自履行各自的就行&#xff1b;但常常多条线程之间需要同享数据&#xff0c;此时在并发编程进程中就不可避免要斟酌两个问题&#xff1a;通讯…

求ax bx c 0的根c语言,关于求方程ax2+bx+c=0根的问题

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include #include#include #include #include"resource.h" BOOL CALLBACK DlgMain(HWND,UINT,WPARAM,LPARAM);int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd){DialogB…

c语言递归建链表,递归创建二叉树c语言实现+详细解释

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼void CreatBiTree(BiTree T){char a;scanf("%c",&a);if(a)TNULL;else{T(BiTree)malloc(sizeof(BiNode));T->dataa;CreatBiTree(T->lchild);CreatBiTree(T->rchild);}}虽能编译&#xff0c;但不能正确运行&a…

Java历经20年沧桑,将持续革新

对于企业界来说&#xff0c;很多服务器都部署着Java应用程序&#xff0c;许多物联网设备也都是基于Java技术开发。 20年前&#xff0c;Java为人们带来前所未有的科技理念&#xff1a;一次编写&#xff0c;到处运行。 在此之前&#xff0c;编程语言的种类寥寥无几&#xff0c;…

android动态设置src,Android 代码里设置ImageView的src和background

设置ImageView的src:image.setImageDrawable(getResources().getDrawable(R.drawable.blackk));String pathEnvironment.getExternalStorageDirectory()File.separator”test.jpg”;Bitmap bm BitmapFactory.decodeFile(path);image.setImageBitmap(bm);image.setImageResourc…

Java开发中定时器的使用

在JAVA中实现定时器功能要用的2个类是Timer,TimerTask Timer类是用来履行任务的类&#xff0c;它接受1个TimerTask做参数 Timer有两种履行任务的模式,最经常使用的是schedule,它可以以两种方式履行任务:1:在某个时间(Data)&#xff0c;2:在某个固定的时间以后(int delay).这两种…

android camera2 采集,视频采集:Android平台基于Camera 2的实现

前言这篇文章简单介绍下移动端Android系统下利用Camera2相关API进行视频采集的方法。Camera2是谷歌在Android 5.0新增的用来替代Camera1操作摄像头的一个全新的API。按照惯例先上一份源码AndroidVideo。Camera2调用摄像头采集视频的核心实现在Camera2Capture.java。权限配置使用…

Java虚拟机组成详解

一、jvm的主要组成部分 类加载器&#xff08;ClassLoader&#xff09;运行时数据区&#xff08;Runtime Data Area&#xff09;执行引擎&#xff08;Execution Engine&#xff09;本地库接口&#xff08;Native Interface&#xff09; 接下来我们来看以上4个主要组成部分的用途…

取消android所有动画,android studio 取消BottomNavigationView的动画等

app:labelVisibilityMode"labeled"布局文件上添加上此句就可以让标签文字也显示出来了&#xff0c;但是缩放动画&#xff0c;还是会存在。那么回到初始化view的activity中BottomNavigationView navView findViewById(R.id.nav_view);//设置选中时的效果navView.setI…

android addtextchangedlistener参数,【Android】关于addTextChangedListener()方法的上机记录...

自己在学习控件的时候&#xff0c;学到关于EditText的addTextChangedListener()方法&#xff0c;想做一个类似发微博限制字数为140那样的功能&#xff0c;以此文记录上机过程中发现的一些问题。在做这个的时候&#xff0c;是第五节课视频刚提到addTextChangedListener()这个方法…

android 开源 数据库,Android开源数据库框架-LitePal的使用

简介LitePal是一款开源的Android数据库框架&#xff0c;采用了关系映射的模式。LitePal在github上的项目地址&#xff1a;github.com/LitePalFram…配置LitePaldependencies {....compile org.litepal.android:core:1.5.1}复制代码在app/src/main 目录下新建目录assets&#xf…

signature=095ed28e83b68620637b3a67436b0f8f,SMB 3.1.1 Encryption in Windows 10

SMB 3.1.1 Encryption in Windows 1009/09/201513 分钟可看完本文内容SMB 3 encryption offers data packet confidentiality and prevents an attacker from both tampering with and eavesdropping on any data packet. Encryption has been enhanced in SMB 3.1.1. The ciph…

鸿蒙系统打通iOS,库克真的做到了!正式官宣确认截胡鸿蒙OS系统:软硬件生态全打通...

【4月25日讯】相信大家都知道&#xff0c;自从苹果正式举办完春季新品发布会以后&#xff0c;很多网友们都纷纷吐槽到“苹果的黑科技就是以换色为本&#xff0c;iPhone12推出紫色版本&#xff0c;而iMac也变成了彩虹色&#xff0c;很好的继承了诺基亚“科技以换壳为本”理念”&…

html标签中的文本框的值,HTML文本框的值分配给div标签的标题

线2&#xff1a;#msdhoni我want-什么&#xff0c;当用户输入一些东西在文本框(以行1)应该成为div的标题(在第2行)点击botton(在第1行)。其实想要用代码中的文本输入替换#msdhoni。jQuery代码我米使用&#xff1a;(请建议在这段代码的变化&#xff0c;使这成为可能)String.proto…

快速了解Java集合框架

1. 简介 JDK1.2 引入了 Java 集合框架&#xff0c;包含一组数据结构。与数组不同&#xff0c;这些数据结构的存储空间会随着元素添加动态增加。其中&#xff0c;一些支持添加重复元素另一些不支持&#xff0c;一些支持 null&#xff0c;一些能自动升序打印元素。 所有这些数据…

html分类页面,CSS网页设计 把HTML标记分类

p、h1、或div等元素常常称为块级元素&#xff0c;这些元素显示为一块内容&#xff1b;Strong,span等元素称为行内元素&#xff0c;它们的内容显示在行中&#xff0c;即“行内框”。(可以使用displayblock将行内元素转换成块元素&#xff0c;displaynone表示生成的元素根本没有框…

html点击图片产生事件,jquery – 图像单击HTML5 Canvas中的事件

我有一个HTML5画布,我在其中添加了一个图像,我想调用图像的点击事件,但事件不会触发.我正在写一个HTML代码和jqmobile的一些代码This text is displayed if your browser does not shown.$(function () {var ctx document.getElementById("canvas1").getContext(&qu…

html代码里面换图片不显示不出来了,微擎 Ueditor 百度编辑器 替换图片不显示问题...

问题&#xff1a;最近在使用微擎添加公众号平台文章时&#xff0c;上传图片可以显示&#xff0c;但是点击 html(编辑器的按钮,可以显示html代码) 时出现图片不显示问题。我是用的135编辑器挑选的图文模板&#xff0c;我替换完模板中的图片后&#xff0c;图片的链接失效&#xf…

找通项公式在线计算机,在线硬盘分区计算器工具

一、什么是分区&#xff1f;分区从实质上说就是对硬盘的一种格式化。当我们创建分区时&#xff0c;就已经设置好了硬盘的各项物理参数&#xff0c;指定了硬盘主引导记录(即Master Boot Record&#xff0c;一般简称为MBR)和引导记录备份的存放位置。而对于文件系统以及其他操作系…