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

问题描述 投票:0回答:1

我的程序不允许我输出这些值,因为“不允许输入类型名称”(以星号突出显示)。这意味着什么?怎么了?我正在尝试解析此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;
}
c++ typedef midi
1个回答
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];
};

此外,您无法使用<<直接输出数组。它会打印第一个数组元素的地址,但char数组的情况除外(它将解释为C样式的以null终止的字符串)。您需要遍历各个元素并分别输出。


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

© www.soinside.com 2019 - 2024. All rights reserved.