Не могу вернуть ничего, кроме 1 или 0, из функции int - PullRequest
0 голосов
/ 03 января 2012

Хотел бы я, чтобы мой первый пост не был таким уж новичком.Я до сих пор работал с openframeworks, но пока я новичок в программировании, у меня настоящая головная боль, возвращающая правильное значение из функции int.Я хотел бы, чтобы int увеличивался до тех пор, пока не будет выполнено логическое условие, а затем уменьшился до нуля.Int используется для перемещения по массиву от начала до конца, а затем обратно.Когда я вкладываю в себя функцию функции в методе, в котором я использую int, все работает отлично, но очень грязно, и мне интересно, насколько дорого в вычислительном отношении это поставить, просто кажется, что мои синтаксические способности отсутствуютиначе.Совет признателен, и спасибо заранее.

int testApp::updown(int j){

if(j==0){
    arp =true;

}
else if (j==7){
    arp = false; 

}

if(arp == true){
    j++;

}

else if(arp == false){
    j--;

}

    return (j);

}

и затем он вызывается так в блоке audioRequest библиотеки, с которой я работаю:

for (int i = 0; i < bufferSize; i++){


 if ((int)timer.phasor(sorSpeed)) {

            z = updown(_j);
            noteOut = notes [z];

            cout<<arp;
            cout<<z;

        }

РЕДАКТИРОВАТЬ: Для добавлениянекоторая информация.Убрано последнее условие второго оператора if, оно было там, потому что я переживал странные события, когда j начинал уходить от конца массива.

Выдержка из testApp.h

int z, _j=0;
Boolean arp;

РЕДАКТИРОВАТЬ 2: Я исправил это сейчас, это работает, извиняюсь за то, что спрашиваю что-то настолько элементарное и с таким ужасным кодом, чтобы идти с.Я ценю время, которое люди потратили на комментарии здесь.Вот мои пересмотренные .cpp и мои .h файлы для вашего ознакомления.Еще раз спасибо.

#include "testApp.h"
#include <iostream>
using namespace std;



testApp::~testApp() {

}

void testApp::setup(){


sampleRate          = 44100;
initialBufferSize   = 1024;

//MidiIn.openPort();
//ofAddListener(MidiIn.newMessageEvent, this, &testApp::newMessage);

j = 0;
z= 0;
state = 1;


tuning = 440;
inputNote = 127;
octave = 4;
sorSpeed = 2;
freqOut = (tuning/32) * pow(2,(inputNote-69)/12);
finalOut = freqOut * octave;



notes[7] = finalOut+640;
notes[6] = finalOut+320;
notes[5] = finalOut+160; 
notes[4] = finalOut+840;
notes[3] = finalOut+160;
notes[2] = finalOut+500;
notes[1] = finalOut+240;
notes[0] = finalOut;


ofSoundStreamSetup(2,0,this, sampleRate, initialBufferSize, 4);/* Call this last ! */


}

void testApp::update(){



}

void testApp::draw(){



}

int testApp::updown(int &_j){

int tmp;

if(_j==0){
    arp = true;
}

else if(_j==7) {
    arp = false; 
}


if(arp == true){
    _j++;
}

else if(arp == false){
    _j--;
}

tmp = _j;
return (tmp);

}

void testApp::audioRequested    (float * output, int bufferSize, int nChannels){


    for (int i = 0; i < bufferSize; i++){


        if ((int)timer.phasor(sorSpeed)) {


            noteOut = notes [updown(z)];


            }


    mymix.stereo(mySine.sinewave(noteOut),outputs,0.5);


    output[i*nChannels    ] = outputs[0]; 
    output[i*nChannels + 1] = outputs[1];

    }
}

testApp.h

class testApp : public ofBaseApp{

public:
    ~testApp();/* destructor is very useful */
    void setup();
    void update();
    void draw();

    void keyPressed  (int key);
    void keyReleased(int key);
    void mouseMoved(int x, int y );
    void mouseDragged(int x, int y, int button);
    void mousePressed(int x, int y, int button);
    void mouseReleased(int x, int y, int button);
    void windowResized(int w, int h);
    void dragEvent(ofDragInfo dragInfo);
    void gotMessage(ofMessage msg);

    void newMessage(ofxMidiEventArgs &args);

    ofxMidiIn MidiIn;

    void audioRequested     (float * input, int bufferSize, int nChannels); /* output method */
    void audioReceived  (float * input, int bufferSize, int nChannels); /* input method */

    Boolean arp;
    int     initialBufferSize; /* buffer size */
    int     sampleRate;
    int    updown(int &intVar);


    /* stick you maximilian stuff below */

    double filtered,sample,outputs[2];
    maxiFilter filter1;
    ofxMaxiMix mymix;
    ofxMaxiOsc sine1;
    ofxMaxiSample beats,beat;
    ofxMaxiOsc mySine,myOtherSine,timer;

    int currentCount,lastCount,i,j,z,octave,sorSpeed,state;
    double notes[8];
    double noteOut,freqOut,tuning,finalOut,inputNote;

};

1 Ответ

0 голосов
/ 03 января 2012

Довольно сложно собрать все это вместе. Я думаю, вам нужно немного вернуться к основам, но все же я думаю, что могу объяснить, что происходит.

  1. Вы инициализируете _j в 0, а затем никогда не изменяете значение _j.
  2. Поэтому вы вызываете updown, передавая 0 в качестве параметра каждый раз.
  3. updown возвращает значение 1 при вводе 0.

Возможно, вы хотели передать z на updown, когда звоните, но я не уверен.

Вы действительно объявляете глобальные переменные в своем заголовочном файле? Это не хорошо. Попробуйте использовать локальные переменные и / или параметры в максимально возможной степени. Глобальные переменные довольно злые, особенно такие, которые объявлены в заголовочном файле!

...