关于.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卡不能初始化,具体是哪个还不太清楚????
关于.c和.h 和定义变量的问题的更多相关文章
- fatal error LNK1169: 找到一个或多个多重定义的符号或多个.c/.cpp文件想同时调用定义在.h文件里面的全局变量,防止重定义变量问题。
为什么.h文件中不能定义全局变量? 原因: 存在多次创建变量.如果头文件中可以定义全局变量,那么每个包含该头文件的文件里都会有该全局变量的定义.因为C语言的include是直接将文件嵌入到includ ...
- 不要在.h文件中定义变量
今天在头文件.h中初始化了一个数组和函数,在编译的时候提示这个数组和函数重新定义了,检查后发现,犯了一个致命的错误,在头文件中定义变量... 以下引用别人的一篇说明,警示自己. C语言作为一种结构化的 ...
- [C/C++]在头文件中使用static定义变量意味着什么
文章出处:http://www.cnblogs.com/zplutor/ 看到有一位同学在头文件中这么写: static const wchar_t* g_str1 = - static const ...
- 【2017-2-17】C#基础 - 定义变量,输入输出
1.初学C#. C#是专门为.NET的应用而开发的语言,他吸收了C++.Visual Basic.Delphi.Java等语言的优点,提高了程序开发的效率. 2.Visual Studio.NET的集 ...
- 【2017-2-17】VS基本应用及C#基础第一节(定义变量、输入及输出)
一VS基本应用 (一)新建项目 新建项目可有多种方法例如: 1. 在VS起始页面建立新项目 2. 在集成环境中,通过"文件"/"新建"/"项目&q ...
- C++ ---定义变量初始化
定义变量时一定要进行初始化,尤其是数组和结构体这种占用内存大的数据结构.在使用数组的时候经常因为没有初始化而产生“烫烫烫烫烫烫”这样的野值,俗称“乱码”. 每种类型的变量都有各自的初始化方法,mems ...
- [Linux][C][gcc][tips] 在头文件中定义变量引发的讨论
概述 本人的原创文章,最先发表在github-Dramalife-note中.转载请注明出处. Define variable(s) in header file referenced by mult ...
- SQL*Plus中替换变量与定义变量
替换变量 SQL*Plus中的替换变量又叫替代变量,它一般用来临时存储相关数据:在SQL语句之间传递值.一般使用&或&&前缀来指定替换变量. 关于使用替换变量,一般是利用其创建 ...
- 【Python基础学习二】定义变量、判断、循环、函数基本语法
先来一个愉快的Hello World吧,就是这么简单,不需要写标点符号,但是需要严格按照缩进关系,Python变量的作用域是靠tab来控制的. print("Hello World" ...
随机推荐
- nyist oj 1058 部分和问题 (DFS搜索)
部分和问题 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描写叙述 给定整数a1.a2........an.推断能否够从中选出若干数,使它们的和恰好为K. 输入 首先,n和k ...
- 结构体类型重声明导致的bug一个
bug前提条件 当模块比較多.头文件较多,某个结构体类型会在当前模块中又一次声明进而引用其成员,而不直接包括其它模块的头文件. 这种优点是不引入不须要的类型声明到此模块.头文件包括的交叉:坏处是,添加 ...
- Android 给图片加边框
图片处理时,有时需要为图片加一些边框,下面介绍一种为图片添加简单边框的方法. 基本思路是:将边框图片裁剪成八张小图片(图片大小最好一致,不然后面处理会很麻烦),分别对应左上角,左边,左下角,下边,右下 ...
- Linux下搭建JSP环境
Linux下搭建JSP环境 作为一名Java EE系统架构工程师,经常需要搭配和建立JSP(Java Server Pages)的开发环境和运行环境,所以本人在平时的工作中积累了一些在Linu ...
- FZU 2205 据说题目很水
2205 据说题目很水 Accept: 199 Submit: 458Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Descr ...
- eclipse- log 打印跟输出到文件
1.在eclipse中打印log,经常使用的就是log.e(string,string) 代码中如下 @Override public boolean onTouchEvent(MotionEvent ...
- 2. ZooKeeper的ZAB协议。
转自:https://blog.csdn.net/en_joker/article/details/78662880 ZooKeeper并没有完全采用Paxos算法,而是使用了一种称为ZooKeepe ...
- PDF.Js的使用—javascript中前端显示pdf文件
PDF.Js的使用—javascript中前端显示pdf文件 写于2018/12/6 起因是一个图片展示页面需要展示pdf格式的文件,所以查了半天决定使用pdf.js,我也不求有多了解它,能实现我想要 ...
- spring与cxf整合配置webservice接口(以jaxws:server的方式配置)
ps:最近项目需要跟其他系统做同步,需要使用webservice来提供接口给其他系统调用:临时抱佛脚赶紧去网上找了下资料,发现用Endpoint的方式发布接口好容易哦:赶紧写了个例子做验证,发布成功. ...
- 【Codeforces Round #450 (Div. 2) A】Find Extra One
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 模拟. 看看Y左边或右边的点个数是否<=1 [代码] #include <bits/stdc++.h> using ...