类型名称不允许输出 MIDI 文件值

Posted

技术标签:

【中文标题】类型名称不允许输出 MIDI 文件值【英文标题】:Type Name Not Allowed for Outputting MIDI File Values 【发布时间】:2020-01-07 04:16:00 【问题描述】:

我的程序不允许我输出这些值,因为“不允许类型名称”(以星号突出显示)。这意味着什么?怎么了?我正在尝试解析这个 MIDI 文件,似乎我需要使用这些数据类型,因为程序输出了不正确的值(只有 MThd 输出正确,其余的是随机的十六进制值)。我能做些什么来解决这个问题?我是编码新手,如果这是一个愚蠢的问题,我很抱歉。

#include <iostream>
#include <fstream>
#include <stdint.h>

typedef struct MIDI_CHUNK_HEADER 
    char               MThd[4];
    typedef uint32_t   ChunckSize[4];
    typedef uint16_t   Format[2];
    typedef uint16_t   Track[2];
    typedef uint16_t   TimeDivision[2];
 MIDI_CHUNK_HEADER;

int main()

    std::ifstream In_File("C:\\Users\\micah\\Documents\\Twinkle.mid", std::ios::binary | std::ios::in);
    if (!In_File)
    
        std::cerr << "Problem opening file!";
        return 1;
    

    MIDI_CHUNK_HEADER midi_chunk_header;
    In_File.read((char*)&midi_chunk_header, sizeof(MIDI_CHUNK_HEADER));
    std::cout << "File type is: "<< midi_chunk_header.**MThd** << std::endl;
    std::cout << "Bytes to follow: " << midi_chunk_header.**ChunckSize** << std::endl;
    std::cout << "MIDI Format: " << midi_chunk_header.**Format** << std::endl;
    std::cout << "MIDI Track: " << midi_chunk_header.**Track** << std::endl;
    std::cout << "MIDI Time Division: " << midi_chunk_header.**TimeDivision** << std::endl;

【问题讨论】:

【参考方案1】:

typedef 声明类型名称的别名。它没有声明变量。您不能在表达式中使用类型名称,就像它是变量名称一样。

如果您打算声明类成员,请删除typedef。也不要在 C++ 中使用typedef struct。它在 C 中有用,但在 C++ 中是多余的。一个类可以不用typedef直接定义:

struct MIDI_CHUNK_HEADER 
    char       MThd[4];
    uint32_t   ChunckSize[4];
    uint16_t   Format[2];
    uint16_t   Track[2];
    uint16_t   TimeDivision[2];
;

此外,您不能使用&lt;&lt; 直接输出数组。它将打印第一个数组元素的地址,char 数组的情况除外(将被解释为 C 风格的以空字符结尾的字符串)。您需要遍历各个元素并单独输出。


(没有查看 MIDI 块标头格式规范:)您似乎根本不需要数组。如果你想要例如ChunckSize 代表 4 个字节,那么您只需要 一个 uint32_t(32 位本身已经等于 4 个字节),而不是其中四个:

struct MIDI_CHUNK_HEADER 
    char       MThd[4];
    uint32_t   ChunckSize;
    uint16_t   Format;
    uint16_t   Track;
    uint16_t   TimeDivision;
;

请向a good book学习语言。它将解释一切如何以结构化的方式工作,并且您不会犯错误,例如在此处使用typedef。以非结构化方式学习 C++ 不会让你走得太远。 C++ 对错误太宽容了。

【讨论】:

非常感谢!我现在正在通过 Udemy 课程学习,但还没有考虑买一本书(会做!)。至于为什么我需要数组,那是因为我需要读取 MIDI 音符开和关事件(加上时间划分)的特定位(增量持续时间)。你很有帮助:)

以上是关于类型名称不允许输出 MIDI 文件值的主要内容,如果未能解决你的问题,请参考以下文章

Midi 控制器设备名称

使用 PIC 微处理器上的 C 进行 MIDI 输出的二进制输出

如何为我的 ADC 输出添加迟滞?

在 Java 中播放时将 midi 文件输出到控制台

JFugue - MIDI 文件说明的模式输出

Java 中用于播放的硬件 MIDI 输出?