将RtMidi对象传递给函数(C++)

Passing RtMidi objects to functions (C++)

本文关键字:函数 C++ RtMidi 对象      更新时间:2023-10-16

在Processing中阐述了一些想法后,我决定将我的MIDI项目转移到C++,以便于移植到嵌入式平台。我决定使用RtMidi库进行MIDI I/O,但我在按照自己的意愿编写代码时遇到了一些问题。我对C++还不太好。

基本上,我想将RtMidIn对象和RtMidOut对象传递给我的printMidiPorts函数(该代码与RtMidi捆绑的一些示例代码相同)。我知道这与初始化midin和midout作为指针有关,但我不完全确定。

这是我的代码:

#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

非常感谢您的帮助。谢谢

在主函数中,midiinmidiout的类型分别为RtMidiIn*RtMidiOut*(指向对象的指针),而printMidiPorts的参数的类型分别是RtMidiInRtMidiOut(对象)。看起来您所需要做的就是更改printMidiPorts的签名。

您的函数签名错误。

这个:void printMidiPorts(RtMidiIn midiin, RtMidiOut midiout)将midin和midiout声明为常规值,而不是指针。

void printMidiPorts(RtMidiIn *midiin, RtMidiOut *midiout)将是您函数的正确签名。