• 关于.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卡不能初始化,具体是哪个还不太清楚????

  • 相关阅读:
    (转) 应用系统性能监控(二) Pinpoint 使用
    随机滚动名字和试题 单击暂停----给媳妇儿写的爱心小应用
    最短路径问题 java
    数字全排列 java深度优先搜索
    “接竹竿”纸牌游戏 java实现运算结果
    插入排序 java代码
    选择排序 java代码
    快速排序java代码
    1. Django的安装及配置
    python3.x,pycharm的安装
  • 原文地址:https://www.cnblogs.com/chulin/p/8776710.html
Copyright © 2020-2023  润新知