1

このライブラリでmidifilesを保存するC++で小さなアプリを作成しようとしています。 http://musicnote.sourceforge.net/docs/html/index.html

ホームページに掲載されているサンプルコードはこんな感じです。

 #include "MusicNoteLib.h"
    void main()
    {
        MusicNoteLib::Player player; // Create the Player Object
        player.Play("C D E F G A B"); // Play the Music Notes on the default MIDI output port
    }

このコードはVisualStudio2008ではコンパイルされません。次のような多くのエラーが発生します。

MusicNoteLib.h(22):エラーC4430:型指定子がありません-intと見なされます。注:C++はdefault-intをサポートしていません

エラーやどこから探し始めるのかわかりません...このhファイルの代わりに使用できるdllファイルもいくつかありました。

    #ifndef __MUSICNOTE_LIB_H__EBEE094C_FF6E_43a1_A6CE_D619564F9C6A__
#define __MUSICNOTE_LIB_H__EBEE094C_FF6E_43a1_A6CE_D619564F9C6A__

/** @file MusicNoteLib.h
 * \brief Main header file for accessing the MusicNote Library
 */ 

/// <Summary>
/// This header file can be included directly in your project or through
/// MusicNoteLib.h of the MusicNoteDll project. If included directly, this
/// will be built directly as a satic library. If included through MusicNoteDll
/// this will use dllImports through MUSICNOTELIB_API
/// </Summary>
#ifndef MUSICNOTELIB_API
#define MUSICNOTELIB_API
#endif // MUSICNOTELIB_API

//#include "Player.h"

namespace MusicNoteLib /// Music Programming Library
{
typedef  void (__stdcall *LPFNTRACEPROC)(void* pUserData, const TCHAR* szTraceMsg);
typedef  void (__stdcall *LPFNERRORPROC)(void* pUserData, long lErrCode, const TCHAR* szErrorMsg, const TCHAR* szToken);

extern "C"
{
    MUSICNOTELIB_API typedef void MStringPlayer;

    MUSICNOTELIB_API void* GetCarnaticMusicNoteReader();

    /// <Summary>
    /// Creates a MusicString Player object.
    /// </Summary>
    MUSICNOTELIB_API MStringPlayer* CreateMusicStringPlayer();

    /// <Summary>
    /// Plays Music string notes on the default MIDI Output device with the default Timer Resolution.
    /// Use PlayMusicStringWithOpts() to use custom values.
    /// @param szMusicNotes the Music string to be played on the MIDI output device
    /// @return True if the notes were played successfully, False otherwise
    /// </Summary>
    MUSICNOTELIB_API bool PlayMusicString(const TCHAR* szMusicNotes);

    /// <Summary>
    /// Same as PlayMusicString() except that this method accepts Callbacks.
    /// The Trace and Error callbacks will be used during the Parse of the Music Notes.
    /// @param szMusicNotes the Music string to be played on the MIDI output device
    /// @param traceCallbackProc the Callback to used to report Trace messages
    /// @param errorCallbackProc the Callback to used to report Error messages
    /// @param pUserData any user supplied data that should be sent to the Callback
    /// @return True if the notes were played successfully, False otherwise
    /// </Summary>
    MUSICNOTELIB_API bool PlayMusicStringCB(const TCHAR* szMusicNotes,
                                            LPFNTRACEPROC traceCallbackProc, 
                                            LPFNERRORPROC errorCallbackProc, 
                                            void* pUserData);

    /// <Summary>
    /// Plays Music string notes on the given MIDI Output device using the given Timer Resolution.
    /// Use PlayMusicString() to use default values.
    /// @param szMusicNotes the Music notes to be played
    /// @param nMidiOutPortID the device ID of the MIDI output port to be used for the play
    /// @param nTimerResMS preferred MIDI timer resolution, in MilliSeconds
    /// @return True if Play was successful, False otherwise
    /// </Summary>
    MUSICNOTELIB_API bool PlayMusicStringWithOpts(const TCHAR* szMusicNotes, int nMidiOutPortID, unsigned int nTimerResMS);

    /// <Summary>
    /// Same as PlayMusicStringWithOpts() except that this method accepts Callbacks.
    /// The Trace and Error callbacks will be used during the Parse of the Music Notes.
    /// @param szMusicNotes the Music notes to be played
    /// @param nMidiOutPortID the device ID of the MIDI output port to be used for the play
    /// @param nTimerResMS preferred MIDI timer resolution, in MilliSeconds
    /// @param traceCallbackProc the Callback to used to report Trace messages
    /// @param errorCallbackProc the Callback to used to report Error messages
    /// @param pUserData any user supplied data that should be sent to the Callback
    /// @return True if Play was successful, False otherwise
    /// </Summary>
    MUSICNOTELIB_API bool PlayMusicStringWithOptsCB(const TCHAR* szMusicNotes, 
                                                    int nMidiOutPortID, 
                                                    unsigned int nTimerResMS,
                                                    LPFNTRACEPROC traceCallbackProc, 
                                                    LPFNERRORPROC errorCallbackProc, 
                                                    void* pUserData);
    /// <Summary>
    /// Save the given MusicString content into a MIDI output file
    /// @param szMusicNotes Music Notes to be converted to MIDI output
    /// @param szOutputFilePath path of the MIDI output file
    /// @return True if the the content was saved successfully, False otherwise
    /// </Summary>
    MUSICNOTELIB_API bool SaveAsMidiFile(const TCHAR* szMusicNotes, const char* szOutputFilePath);

    //MUSICNOTELIB_API typedef void (*ParseErrorProc)(const MusicNoteLib::CParser*, MusicNoteLib::CParser::ErrorEventHandlerArgs* pEvArgs);
    //MUSICNOTELIB_API typedef void (*ParseTraceProc)(const MusicNoteLib::CParser*, MusicNoteLib::CParser::TraceEventHandlerArgs* pEvArgs);

    MUSICNOTELIB_API void Parse(const TCHAR* szNotes, LPFNTRACEPROC traceCallbackProc, void* pUserData);

} // extern "C"



} // namespace MusicNoteLib

#endif // __MUSICNOTE_LIB_H__EBEE094C_FF6E_43a1_A6CE_D619564F9C6A__
4

2 に答える 2

0

エラーは次の行にあります:

typedef  void (__stdcall *LPFNTRACEPROC)(void* pUserData, const TCHAR* szTraceMsg);

C / C ++を「怒り」でやったのは久しぶりなので、ここは少し錆びています。_Tどこかに型の不一致があります-実際、マクロで文字列をラップすることによって見つけたように。

于 2010-06-18T11:28:39.107 に答える
0

MusicNoteLib.hをCPPファイルに含める前に、LPFNTRACEPROCとTCHARを宣言するヘッダーを含める必要があります。ChrisFが提案したようにコメントアウトすべきではないPlayer.hである可能性があり、Windowsヘッダーである可能性もあります。

基本的な考え方は、コンパイラが文句を言っている行を調べ、それらの行のシンボルがどこで宣言されているかを把握し、それらの宣言を持つ適切なヘッダーファイルをインクルードする必要があるということです。

于 2010-06-18T11:37:47.930 に答える