簡體   English   中英

將RtMidi對象傳遞給函數(C ++)

[英]Passing RtMidi objects to functions (C++)

在“處理”中提出了一些想法之后,我決定將MIDI項目移至C ++,以實現向嵌入式平台的可移植性。 我已經決定將RtMidi庫用於MIDI I / O,但是我在按我想要的方式布局代碼時遇到了一些麻煩。 我還不太了解C ++。

基本上,我想將RtMidiIn對象和RtMidiOut對象傳遞給我的printMidiPorts函數(該代碼與RtMidi捆綁的某些示例代碼相同)。 我知道這與將midiin和midiout初始化為指針有關,但是我不確定。

這是我的代碼:

#include <stdio.h>
#include <iostream>
#include <string>
#include "rtmidi/RtMidi.h"

using namespace std;

void printMidiPorts(RtMidiIn midiin, RtMidiOut midiout)
{
    // Check inputs.
    unsigned int nPorts = midiin->getPortCount();
    std::cout << "\nThere are " << nPorts << " MIDI input sources available.\n";
    std::string portName;
    for ( unsigned int i=0; i<nPorts; i++ ) {
        try {
            portName = midiin->getPortName(i);
        }
        catch ( RtError &error ) {
            error.printMessage();
            goto cleanup;
        }
        std::cout << "  Input Port #" << i+1 << ": " << portName << '\n';
    }

    // Check outputs.
    nPorts = midiout->getPortCount();
    std::cout << "\nThere are " << nPorts << " MIDI output ports available.\n";
    for ( unsigned int i=0; i<nPorts; i++ ) {
        try {
            portName = midiout->getPortName(i);
        }
        catch (RtError &error) {
            error.printMessage();
            goto cleanup;
        }
        std::cout << "  Output Port #" << i+1 << ": " << portName << '\n';
    }
    std::cout << '\n';

    // Clean up
    cleanup:
    delete midiin;
    delete midiout;

}

int main ()
{

    RtMidiIn  *midiin = 0;
    RtMidiOut *midiout = 0;

    // RtMidiIn constructor
    try {
        midiin = new RtMidiIn();
    }
    catch ( RtError &error ) {
        error.printMessage();
        exit( EXIT_FAILURE );
    }

    // RtMidiOut constructor
    try {
        midiout = new RtMidiOut();
    }
    catch ( RtError &error ) {
        error.printMessage();
        exit( EXIT_FAILURE );
    }

    printMidiPorts(midiin, midiout);

    return 0;
}

這是我的編譯器輸出:

    lightArray.cpp: In function ‘void printMidiPorts(RtMidiIn, RtMidiOut)’:
    lightArray.cpp:19: error: base operand of ‘->’ has non-pointer type ‘RtMidiIn’
    lightArray.cpp:24: error: base operand of ‘->’ has non-pointer type ‘RtMidiIn’
    lightArray.cpp:34: error: base operand of ‘->’ has non-pointer type ‘RtMidiOut’
    lightArray.cpp:38: error: base operand of ‘->’ has non-pointer type ‘RtMidiOut’
    lightArray.cpp:50: error: type ‘class RtMidiIn’ argument given to ‘delete’, expected pointer
    lightArray.cpp:51: error: type ‘class RtMidiOut’ argument given to ‘delete’, expected pointer
    lightArray.cpp: In function ‘int main()’:
    lightArray.cpp:79: error: conversion from ‘RtMidiIn*’ to non-scalar type ‘RtMidiIn’ req

任何幫助深表感謝。 謝謝!

看起來在主函數中, midiinmidioutRtMidiIn*RtMidiOut* (指向對象的指針)類型,而printMidiPorts的參數是RtMidiInRtMidiOut (對象)類型。 看來您需要做的就是更改printMidiPorts的簽名。

您的功能簽名錯誤。

this: void printMidiPorts(RtMidiIn midiin, RtMidiOut midiout) midiin和midiout聲明為常規值,而不是指針。

void printMidiPorts(RtMidiIn *midiin, RtMidiOut *midiout)將是您函數的正確簽名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM