Имя типа не разрешено для вывода значений файлов MIDI - PullRequest
1 голос
/ 07 января 2020

Моя программа не позволяет мне выводить эти значения, потому что «имя типа не разрешено» (выделено звездочками). Что это обозначает? Что не так? Я пытаюсь проанализировать этот 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 Ответ

2 голосов
/ 07 января 2020

typedef объявляет псевдоним для имени типа. Он не объявляет переменную. Вы не можете использовать имя типа в выражении, как если бы оно было именем переменной.

Если вы намеревались объявить членов класса, отбросьте typedef. Также не используйте typedef struct в C ++. Он используется в 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). Вам нужно l oop поверх отдельных элементов и выводить каждый из них по отдельности.


(Не смотря на спецификацию формата заголовка блока 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;
};

Пожалуйста, изучите язык из хорошей книги . Это объяснило бы, как все работает структурированным образом, и вы не допустили бы ошибок, таких как typedef здесь. Изучение C ++ неструктурированным способом не продвинет вас далеко. С ++ слишком не прощает ошибок.

...