2012-01-03 5 views
0

私の最初の投稿はそれほど初心者ではなかったと思います。私はopenframeworksを使って作業していましたが、これまでのところとても良いですが、プログラミングに慣れていないので、int関数から正しい値を返すような頭痛があります。ブール条件が満たされてからゼロになるまで、intを増分したいと思います。 intは配列の先頭から最後まで移動した後に戻るために使用されます。私がintを使っているメソッドに関数の中身を置くと、すべてが完璧に動作しますが、非常に面倒です。そして、計算上高価なのはそこに置くのがどういうことなのか、私の構文上の能力は欠けているようですさもないと。アドバイスをいただき、ありがとうございます。int関数から1または0以外を返すことはできません

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; 

     } 

EDIT:いくつかの情報を追加するため。 2番目のif文の最後の条件を削除しました。なぜなら、jが配列の最後から外れ始めるという不思議な出来事を経験していたからです。私はそれが動作しますが、今、これを改訂しましたので、初歩的なと一緒に行くためにそのような恐ろしいコードで何かを尋ねるための謝罪:testApp.h

int z, _j=0; 
Boolean arp; 

EDIT 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; 

}。

+6

C++の良い本を使い、演習を終えて1週間後にもう一度やり直してください。 –

+1

updown()のあなたのjはかなり初期化されておらず、そのようにコンパイルされていないようです。だからあなたの質問内の情報を省略しているか、またはあなたは観察された振る舞いに値するでしょう:) –

+2

jの宣言はどこですか? –

答えて

0

これをまとめてまとめるのはかなり難しいです。私はあなたが基礎に少し戻る必要があると思うが、すべて同じことが何が起こっているのかを説明できると思う。

  1. あなたは0_jを初期化し、その後_jの値を変更することはありません。
  2. したがって、0を渡すたびにupdownを呼び出します。
  3. updownは、入力が0のときに1の値を返します。

おそらくあなたは、あなたがそれを呼び出すときupdownzを渡すためのものが、私は確認することはできません。

本当にヘッダファイルにグローバル変数を宣言していますか?それは良いことではありません。ローカル変数やパラメータを可能な限り使用してください。グローバル変数はかなり悪いです、特にそのようなヘッダファイルで宣言されています!

+0

こんにちはデイビッド、あなたのコメントは考えのための大量の食糧だった。私は今それを解決しました。振り返ってみると、朝の2時にはコードブリーディネスを提供することは、おそらく最良のアイデアではありませんでした。追加するのと同じように、私のプログラムにはグローバル変数がありません。クラスやスコープ内のすべてのローカル変数です。 –

+0

私はまだC++に関する良い本を読んで、後であなたの問題に戻ってくることをお勧めします。 – hochl

+0

ありがとう、hochl。しかし、私が言うように、問題は分類されます。 –

関連する問題