6 Stimmen

Fehler, der offenbar durch noch nicht ausgeführten Code ausgelöst wurde

Ich lerne C++, indem ich ein Programm schreibe, das MIDI-Dateien in Seerosenteich Quelldateien. Mein Programm besteht aus zwei Hauptbestandteilen:

  • ein MIDI-Dateiparser, der ein Objekt namens MidiFile erzeugt.
  • ein Konverter, der ein MidiFile-Objekt in eine Lilypond-Quelle umwandelt.

Heute habe ich angefangen, den Konverter zu programmieren, und während ich ihn getestet habe, ist ein seltsamer Fehler aufgetreten: Das Programm stirbt, nachdem eine Exception ausgelöst wurde, genauer gesagt ein HeaderError, was bedeutet, dass der Header-Chunk in der MIDI-Datei nicht wie erwartet ist. Es scheint nicht so seltsam zu sein, aber dieser Fehler taucht nur auf, wenn ich eine Codezeile nach dem fehlerhaften Code hinzufüge! Ich füge die main()-Funktion hinzu, um mich besser zu erklären

#include <iostream>
#include "midiToLyConverter.hpp"

int main(){

            // a queue to store notes that have not yet been shut down
    using MidiToLyConverter::Converter::NoteQueue;
            // representation of a note
    using MidiToLyConverter::Converter::Note;
            // the converter class
    using MidiToLyConverter::Converter::Converter;
            // the midifile class
    using Midi::MidiFile;
            // representation of a midi track
    using Midi::MidiTrack;
            // representation of a midi event
    using Midi::MidiEvents::Event;

    Parser::Parser parser = Parser::Parser(); // parser class
    parser.buildMidiFile(); // builds the midi file from a .mid
    Midi::MidiFile* midiFile = parser.getMidiFile(); // gets the MidiFile object

    // iterates over all the tracks in the MidiFile
    while(midiFile->hasNext()){
        std::cout<< "==========\n";
        MidiTrack* track = midiFile->nextTrack();
        // iterates over all events in a track
        while(track->hasNext()){
            Event* event = track->nextEvent();
            if (event->getEventType() == Midi::MidiEvents::NOTE_ON ||
                event->getEventType() == Midi::MidiEvents::NOTE_OFF
            )
                // print the event if it's a note on or off
                event->print();
        }
    }

    return 0;
}

Mit meinem main() wie dies, alles funktioniert richtig, aber, wenn ich etwas zwischen buildMidiFile und die while-Schleife hinzufügen, die Funktion buildMidiFile wirft die Ausnahme!!! Auch wenn es eine völlig unabhängige Anweisung ist!

#include <iostream>
#include "midiToLyConverter.hpp"

int main(){

    using MidiToLyConverter::Converter::NoteQueue;
    using MidiToLyConverter::Converter::Note;
    using MidiToLyConverter::Converter::Converter;
    using Midi::MidiFile;
    using Midi::MidiTrack;
    using Midi::MidiEvents::Event;

    Parser::Parser parser = Parser::Parser(); // parser class
    parser.buildMidiFile(); // THE EXCEPTION IS THROWN HERE
    Midi::MidiFile* midiFile = parser.getMidiFile(); // gets the MidiFile object

            // adding this causes the exception to be thrown by the function
            // buildMidiFile() called 5 lines above!
    std::vector<bool>* vec = new std::vector<bool>();

    // iterates over all the tracks in the MidiFile
    while(midiFile->hasNext()){
        std::cout<< "==========\n";
        MidiTrack* track = midiFile->nextTrack();
        // iterates over all events in a track
        while(track->hasNext()){
            Event* event = track->nextEvent();
            if (event->getEventType() == Midi::MidiEvents::NOTE_ON ||
                event->getEventType() == Midi::MidiEvents::NOTE_OFF
            )
                // print the event if it's a note on or off
                event->print();
        }
    }

    return 0;
}

Ich kann mir nicht erklären, wie das möglich ist. Also, wenn jemand Ideen oder Ratschläge hat, würde alle Hilfe sehr geschätzt werden :) Wenn es hilfreich ist, kann ich den Quellcode für andere Klassen und/oder Funktionen posten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X