最初调试的时候是因为有个错误在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 和定义变量的问题的更多相关文章

  1. fatal error LNK1169: 找到一个或多个多重定义的符号或多个.c/.cpp文件想同时调用定义在.h文件里面的全局变量,防止重定义变量问题。

    为什么.h文件中不能定义全局变量? 原因: 存在多次创建变量.如果头文件中可以定义全局变量,那么每个包含该头文件的文件里都会有该全局变量的定义.因为C语言的include是直接将文件嵌入到includ ...

  2. 不要在.h文件中定义变量

    今天在头文件.h中初始化了一个数组和函数,在编译的时候提示这个数组和函数重新定义了,检查后发现,犯了一个致命的错误,在头文件中定义变量... 以下引用别人的一篇说明,警示自己. C语言作为一种结构化的 ...

  3. [C/C++]在头文件中使用static定义变量意味着什么

    文章出处:http://www.cnblogs.com/zplutor/ 看到有一位同学在头文件中这么写: static const wchar_t* g_str1 = - static const ...

  4. 【2017-2-17】C#基础 - 定义变量,输入输出

    1.初学C#. C#是专门为.NET的应用而开发的语言,他吸收了C++.Visual Basic.Delphi.Java等语言的优点,提高了程序开发的效率. 2.Visual Studio.NET的集 ...

  5. 【2017-2-17】VS基本应用及C#基础第一节(定义变量、输入及输出)

    一VS基本应用 (一)新建项目 新建项目可有多种方法例如: 1.  在VS起始页面建立新项目 2.  在集成环境中,通过"文件"/"新建"/"项目&q ...

  6. C++ ---定义变量初始化

    定义变量时一定要进行初始化,尤其是数组和结构体这种占用内存大的数据结构.在使用数组的时候经常因为没有初始化而产生“烫烫烫烫烫烫”这样的野值,俗称“乱码”. 每种类型的变量都有各自的初始化方法,mems ...

  7. [Linux][C][gcc][tips] 在头文件中定义变量引发的讨论

    概述 本人的原创文章,最先发表在github-Dramalife-note中.转载请注明出处. Define variable(s) in header file referenced by mult ...

  8. SQL*Plus中替换变量与定义变量

    替换变量 SQL*Plus中的替换变量又叫替代变量,它一般用来临时存储相关数据:在SQL语句之间传递值.一般使用&或&&前缀来指定替换变量. 关于使用替换变量,一般是利用其创建 ...

  9. 【Python基础学习二】定义变量、判断、循环、函数基本语法

    先来一个愉快的Hello World吧,就是这么简单,不需要写标点符号,但是需要严格按照缩进关系,Python变量的作用域是靠tab来控制的. print("Hello World" ...

随机推荐

  1. 关于MySQL utf8mb4 字符集中字符串长度的问题

    MySQL之前推出的utf8字符集中,一个汉字占3个字节,新的utf8mb4字符集中一个汉字占4个字节. 那么我们平时建表的时候输入的varchar=16这种,到底指的是字符长度还是字节长度? 如果是 ...

  2. 【Codecraft-18 and Codeforces Round #458 (Div. 1 + Div. 2, combined) B】 Conan and Agasa play a Card Game

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 最大值出现次数是偶数. 那么就取次大值. 次大值也是偶数? =>再次 因为你绝对不能取偶数个的. 取了对方就总是能面对一个奇数 ...

  3. java初探秘之推断输入的一串字符是否全为小写字母

    import java.io.IOException; import java.util.*; public class Two { public static void main(String[] ...

  4. 程序猿果真有前端后端client吗

    前端 后端 client DBA OP 程序猿有分这么细的吗? 入行时候有区别. 殊途同归 吾道一以贯之, 假设作为程序猿不能领悟一贯, 则永远不清楚.

  5. LeetCode 136 Single Number(仅仅出现一次的数字)

    翻译 给定一个整型数组,除了某个元素外其余元素均出现两次. 找出这个仅仅出现一次的元素. 备注: 你的算法应该是一个线性时间复杂度. 你能够不用额外空间来实现它吗? 原文 Given an array ...

  6. elasticsearch transport 请求发送和处理

    前一篇分析对nettytransport的启动及连接,本篇主要分析transport请求的发送和处理过程.cluster中各个节点之间需要相互发送很多信息,如master检测其它节点是否存在,node ...

  7. Flume的Events

    Flume NG传输的数据的基本单位是event,如果是文本文件,通常是一行记录,这也是事务的基本单位.

  8. 新手前端笔记之--初识css

    css样式表是为了容纳与html文档分离出来的样式属性而产生的,所以她理所当然的包含两个部分:1.样式的表示,使用{属性1:属性值:属性2:属性值:...},2.样式与标签的对应(如何找的对应标签), ...

  9. 【Codeforces Round #452 (Div. 2) D】Shovel Sale

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 让N乘2->a 然后看一下位数是多少. 假设有x位(x>=2) 则(0..(a%10-1) ) + (99..9)[x- ...

  10. JavaScript学习总结(3)——JavaScript函数(function)

    一.函数基本概念 为完成某一功能的程序指令(语句)的集合,称为函数. 二.JavaScript函数的分类 1.自定义函数(我们自己编写的函数),如:function funName(){} 2.系统函 ...