关于.c和.h 和定义变量的问题

最初调试的时候是因为有个错误在wavplay.h文件中

 

 

于是我跳到了recorderl.h中:从图中看到引用了main.h

 

 

出现这个问题的具体原因还是不太清楚:

不过我任务是因为:

wavplay.h中定义了  __WaveHeader   变量

在main.h文件中引用了wavplay.h

而在wavplay.h中试图引用main.h里的 __WaveHeader  然而main.h里没有定义__WaveHeader;

 

最好在.h文件中不要 定义变量,,而是在.c中定义,在.h中extern该变量.

我想把全局变量都设置在,  main.c中

把所有头文件都集中在  main.h中

然后这样就可以在,所有.c和.h文件中引用main.h了...

现在就去试一下,,,看一下结果如何

 

其实在 #include各个头文件的时候是有次序的,,,只不过有的时候他们关联不大,就不需要排序了

比如: 要先include "sys.h"  然后才能定义一些东西,

否则会::我把 include "sys.h"  注释掉之后::

///

编译的过程是从头文件开始的,,如果过程中有一个地方出错,它可能就不在往下编译了,

所以找到第一个错误,,解决它,,,其它的头文件才能起作用,,,

 所以这种方法会带来很多次序的考虑

 

不知道这样程序占用的空间会不会变::应该不会变...

 ///

 

#ifndef _main_H
#define _main_H
#include "sys.h"

//RIFF块
typedef __packed struct
{
    u32 ChunkID;               //chunk id;这里固定为"RIFF",即0X46464952
    u32 ChunkSize ;               //集合大小;文件总大小-8
    u32 Format;                   //格式;WAVE,即0X45564157
}ChunkRIFF ;


//fmt块
typedef __packed struct
{
  u32 ChunkID;               //chunk id;这里固定为"fmt ",即0X20746D66
  u32 ChunkSize ;               //子集合大小(不包括ID和Size);这里为:20.
  u16 AudioFormat;          //音频格式;0X01,表示线性PCM;0X11表示IMA ADPCM
    u16 NumOfChannels;        //通道数量;1,表示单声道;2,表示双声道;
    u32 SampleRate;            //采样率;0X1F40,表示8Khz
    u32 ByteRate;            //字节速率;
    u16 BlockAlign;            //块对齐(字节);
    u16 BitsPerSample;        //单个采样数据大小;4位ADPCM,设置为4
//    u16 ByteExtraData;        //附加的数据字节;2个; 线性PCM,没有这个参数
}ChunkFMT;       


//fact块
typedef __packed struct
{
    u32 ChunkID;               //chunk id;这里固定为"fact",即0X74636166;
    u32 ChunkSize ;               //子集合大小(不包括ID和Size);这里为:4.
    u32 NumOfSamples;          //采样的数量;
}ChunkFACT;


//LIST块
typedef __packed struct
{
    u32 ChunkID;               //chunk id;这里固定为"LIST",即0X74636166;
    u32 ChunkSize ;               //子集合大小(不包括ID和Size);这里为:4.
}ChunkLIST;


//data块
typedef __packed struct
{
    u32 ChunkID;               //chunk id;这里固定为"data",即0X5453494C
    u32 ChunkSize ;               //子集合大小(不包括ID和Size)
}ChunkDATA;

//wav头
typedef __packed struct
{
    ChunkRIFF riff;    //riff块
    ChunkFMT fmt;      //fmt块
//    ChunkFACT fact;    //fact块 线性PCM,没有这个结构体    
    ChunkDATA data;    //data块        
}__WaveHeader;


//wav 播放控制结构体
typedef __packed struct
{
  u16 audioformat;            //音频格式;0X01,表示线性PCM;0X11表示IMA ADPCM
    u16 nchannels;                  //通道数量;1,表示单声道;2,表示双声道;
    u16 blockalign;                //块对齐(字节);  
    u32 datasize;                  //WAV数据大小

  u32 totsec ;                    //整首歌时长,单位:秒
  u32 cursec ;                    //当前播放时长
    
  u32 bitrate;                     //比特率(位速)
    u32 samplerate;                //采样率
    u16 bps;                          //位数,比如16bit,24bit,32bit
    
    u32 datastart;                  //数据帧开始的位置(在文件里面的偏移)
}__wavctrl;


#include "stdio.h"
#include "usart.h"          
#include "malloc.h"

#include "ff.h"  
#include "exfuns.h"   
#include "wavedac.h"
#include "wavplay.h"
#include "timer4.h"     //现在改成了timer4
#include "stm32f10x_dac.h"
#include "stdlib.h"     //字符串和浮点数的相互转换库

#include "key.h"
#include "txt.h"
#include "adc.h"
#include "led.h"

//下面是录音头文件
#include "recorderl.h"
#include "timerl.h"
#include "adcl.h"
#include "dmal.h"
#include "ledl.h"

//#include "memory.h"
#include "string.h"

#include "flash.h"    //关于flash的头文件

#include "sdio_sdcard.h" 

 

 

注意以上是我的一个头文件,,,,这个文件是main.h文件

因为我感觉头文件太多,所以就建立了一个总的头文件,

结果引入 main.h不但没有省下多少力气,反而更加费力了,

原因在于你需要弄好这个几个头文件的顺序<><><><>

不过经验告诉我,,,还是不要建什么main.h了,,{不过总要有排序的,,在主函数中#include也是有顺序的.}

 

一开始我想初始化SD卡,,起初程序好好的

但是不知道为什么,,后来就不行了,,而且也没有报错

后来找到修改的地方,我只是在main.h中又加入了几个.h文件

可能是这个原因导致SD卡不能初始化,具体是哪个还不太清楚????

转载于:https://www.cnblogs.com/chulin/p/8776710.html

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

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

相关文章

halcon中面到面的距离_halcon学习笔记——(8)由标定板得到测量平面位姿-阿里云开发者社区...

如图&#xff1a;由标定板位姿获取测量板位姿1.pose_to_hom_mat3d( : : Pose : HomMat3D)把三维位姿转化为齐次变换矩阵2.hom_mat3d_translate_local( : : HomMat3D, Tx, Ty, Tz : HomMat3DTranslate)相对于新坐标系的平移变换/ 1 0 0 \ / Tx \HomMat3DTranslate HomMat3D *…

进程同步与互斥的区别

并发进程的执行会产生相互制约的关系&#xff1a;一种是进程之间竞争使用临界资源&#xff0c;只能让他们逐个使用&#xff0c;这种现象称为互斥&#xff0c;是一种竞争关系。另一种是进程之间协同完成任务&#xff0c;在关键点上等待另一进程发来的消息&#xff0c;以便协同一…

《软件调试分析技术》学习笔记

《软件调试分析技术》学习笔记&#xff08;一&#xff09; 今天开始写写一些心得体验。 《软件调试分析技术》是好友Monster的处女作品。作为一直以的好伙伴&#xff0c;他是我看着长大的&#xff0c;(*^__^*) 嘻嘻……之所以有今天这样的成绩&#xff0c;是与他的努力和天赋…

new Date()时间

var myDate new Date(); myDate.toLocaleDateString()&#xff1b;可以获取当前日期myDate.toLocaleTimeString(); 可以获取当前时间扩展&#xff1a;myDate.getYear(); //获取当前年份(2位)myDate.getFullYear(); //获取完整的年份(4位,1970-????)myDate.getMonth(); //获…

什么是对等网络

对等网也称工作组。在对等网络中&#xff0c;计算机的数量通常不会超过10台。所以对等网络相对比较简单。在对等网络中&#xff0c;对等网上各台计算机的有相同的功能&#xff0c;无主从之分&#xff0c;网上任一节台计算机既可以作为网络服务器&#xff0c;其资源为其它计算机…

python初中必背语法_一些python语法的合集

贴几道自己做过的py题防止忘了&#xff0c;好像包含的语法还挺多的洛谷1018nn,mminput().split( )oint(input())nint(nn);mint(mm)a[[]];c[[]]for i in range (1,43):a.append([]);c.append([])for i in range (1,43):for j in range (1,43):a[i].append(0),c[i].append(0)b[]f…

微信 {errcode:48001,errmsg:api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]}

{"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"} 声明&#xff1a;是已认证的服务号 这个问题已解决&#xff01;&#xff01; 前置说明 网页授权获取用户基本信息&#xff1a;两种 scope 域 https://open.w…

解决ubuntu首次安装Mysql之后,首次登录出现ERROR 1698 (28000): Access denied for user 'root'@'localhost'的方法

解决步骤&#xff1a; 1.打开终端&#xff0c;输入sudo vi /etc/mysql/debian.cnf 打开/etc/mysql/debian.cnf文件&#xff0c;显示如下&#xff1a; 2.mysql -udebian-sys-maint -p 打开mysql 输入密码为上图中password字段 3.修改root密码 ALTER USER rootlocalhost IDEN…

六十万的成长_我的EA策略分析和实现

曾经看过一个故事&#xff1a;在流水线上需要检测面包盒子是不是空的&#xff0c;科技人员使用各种红外线等等高科技&#xff0c;达到了目的&#xff1b;有一个工人用一台风扇就解决了这个问题......其实解决问题可以很简单&#xff0c;只要能实现目标&#xff0c;过程越简单越…

流量控制和拥塞控制

流量控制是用于控制调制解调器与计算机之间的数据流&#xff0c;具有防止因为计算机和调制解调器之间通信处理速度的不匹配而引起的数据丢失。通常有硬件流量控制&#xff08;RTS/CTS&#xff09;和软件流量&#xff08;XON/XOFF&#xff09;控制。 拥塞现象是指到达通…

内聚的极限: 软件开发的不确定性原理

高内聚是有极限的. 当代码在一个维度上高度内聚的时候, 在其它维度上是发散的. -- 代码内聚设计的不确定性原理 大家都知道量子力学的不确定性原理: 在微观世界里, 有几对物理量不能同时精确的测定, 包括速度与位置, 以及能量与时间. 比如当我们精确的测定一个粒子的速度使其误…

python获取window共享目录列表_利用Python获取DICOM RTstructure勾画列表

在《利用Python打开DICOM CT文件》一文中&#xff0c;我们利用pydicom.dcmread()读取了CT图像。本文中我们将修改load_scan()函数来读取RTstructure文件并获取勾画列表1. 打开Jupyter notebook&#xff0c;导入需要的科学包import numpy as npimport mathimport pydicomimport …

sublime 自定义快捷键

[{ "keys": ["altspace"], "command": "auto_complete" }, // 自动提示、补全{ "keys": ["ctrlalti"], "command": "reindent" }, //整理代码快捷键{ "keys": ["f12"…

Ubuntu中安装、生成、导入、导出、Python3虚拟环境

1.安装Ubuntu虚拟环境、以及可以支持虚拟环境的模块 sudo apt install virtualenv sudo apt install virtualenvwrapper 安装完成之后&#xff0c;进入home目录&#xff0c;输入命令ls -al查看是否出现.virtualenvs目录&#xff0c;如果没有则手动创建.virtualenvs目录 重要…

Coursera课程 Programming Languages, Part C 总结

碎言碎语 和前面的 ML 和 Racket 感觉明显不一样了&#xff0c;一边学着一边觉得这真是一门奇怪的语言&#xff0c;有着各种奇怪的语法&#xff0c;不过真的算是一个奇妙的体验&#xff08;相比前面的两门语言&#xff0c;Ruby 的学习资源多了不少&#xff09;。week 1 的作业直…

如何判断网络是否进入拥塞状态

通过观察网络的吞吐量与网络负载间的关系 如果随着网络负载的增加&#xff0c;网络的吞吐量明显小于正常的吞吐量&#xff0c;那么网络就进入例如轻度拥塞的状况。 如果网络得吞吐量随着网络负载的增大反而下降&#xff0c;那么网络就可能进入拥塞状态。 如果网络的负载继续…

如何拷贝工程_如何将premiere的工程及素材文件打包?

我们在剪辑视频的时候经常会遇到素材丢失的情况&#xff0c;或者说需要换地方或换电脑继续剪辑。特别是以前做的视频现在需要修改一些地方&#xff0c;然后打开工程文件会发现素材丢失&#xff0c;如图&#xff1a;这种情况要不就是素材已经删除&#xff0c;要不就是素材改变了…

迈出从3K到1W的重要一步——掌握设计模式

IT职场的小菜经常有这样的疑问&#xff1a; 为什么一个相似的功能&#xff0c;大牛一会儿就搞定&#xff0c;然后悠闲地品着下午茶逛淘宝&#xff1b;而自己加班加点搞到天亮还做不完。 为什么用户提出需求变更后&#xff0c;大牛只需潇洒地敲敲键盘&#xff0c;改改配置&#…

使用pip安装virtualenv时出现问题

使用pip出现问题 fxd0ubuntu:~$ sudo pip install virtualenv [sudo] password for fxd0: env: ‘pip’: No such file or directory fxd0ubuntu:~$ pip insatall virtualenv Command pip not found, but can be installed with: sudo apt install python-pip 安装pip fxd0…

jquery 获取 outerHtml 包含当前节点本身的代码

在开发过程中&#xff0c;jQuery.html() 是获取当前节点下的html代码&#xff0c;并不包含当前节点本身的代码&#xff0c;然后我们有时候确需要&#xff0c;找遍jQuery api文档也没有任何方法可以拿到。 看到有的人通过parent().html()&#xff0c;如果当前元素没有兄弟元素还…