不允许输出 MIDI 文件值的类型名称
Type Name Not Allowed for Outputting MIDI File Values
我的程序不允许我输出这些值,因为 "type name is not allowed"(以星号突出显示)。那是什么意思?怎么了?我正在尝试解析这个 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;
}
typedef
声明类型名称的别名。它不声明变量。您不能在表达式中使用类型名称,就好像它是变量名称一样。
如果您打算声明 class 成员,则删除 typedef
。也不要在 C++ 中使用 typedef struct
。它在 C 中有用,但在 C++ 中是多余的。可以不用typedef
直接定义一个class:
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 风格的空终止字符串)。您需要遍历各个元素并单独输出每个元素。
(不看 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++对错误太不宽容了。
我的程序不允许我输出这些值,因为 "type name is not allowed"(以星号突出显示)。那是什么意思?怎么了?我正在尝试解析这个 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;
}
typedef
声明类型名称的别名。它不声明变量。您不能在表达式中使用类型名称,就好像它是变量名称一样。
如果您打算声明 class 成员,则删除 typedef
。也不要在 C++ 中使用 typedef struct
。它在 C 中有用,但在 C++ 中是多余的。可以不用typedef
直接定义一个class:
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 风格的空终止字符串)。您需要遍历各个元素并单独输出每个元素。
(不看 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++对错误太不宽容了。