C言語のプログラムについての質問です。
初めての質問、またプログラムというものに理解が及んでいないためお見苦しい所があると思いますが、よろしくお願いします。
['Gene' has no member named 'tenor' / 'tenor_c' / 'tenor_candidate']というエラー文の直し方がわかりません。
アルトのみなら実行できるのでそれを参考にしてテノールを作成しているのですが、名前を変えるだけでは駄目なのでしょうか?
文字数が超過してしまうため、アルトの部分はスクショを載せます。
ご教授のほどよろしくお願いします。
該当のソースコード
/************************************************************************ 【音の高さの決定】 テノールパートの音域: 12-33(C2-A3) diatonic[7][3]: 和音構成音(最小の音の高さを表す数値) d_chord[SNum]: 使用する和音 tenor_candidate[][]: 音の高さの候補を入れておく ************************************************************************/ void gene_to_tenor(){ int i,j,k,l; //ループ用 int n,m,q; //カウント用 int g,v; //モチーフのループ用 int poi; //音域外を0にしたときカウント int pai; //音の最終候補を決定した時にカウント int same=0; //連続した00の数をカウント /* //確認用表示 printf("使用する三和音↓\n"); for(i=0;i<7;i++){ printf("diatonic[%d]:",i); for(j=0;j<3;j++){ printf("%s",abcd[diatonic[i][j]]); } printf("\n"); } */ //初期化 for(i=0;i<PopSize;i++){ for(j=0;j<music.SNum;j++){ gene[i].tenor[j]=0; } } //個体数で回す for(i=0;i<PopSize;i++){ // printf("[PopSize(i):%d]\n",i); //音の数で回す(Lengthは基本と一致している派生を含まないため) for(j=0;j<music.SNum;j++){ //カウント用の値を初期化 n=0; m=0; q=0; /**********************【1音目の遺伝子】***************************/ //各個体の始めの遺伝子の時 if(j==0){ //printf(" [SNum(j):%d][d_chord[%d]:%d]_[tone2[%d]:%d]_[Bass_tone[%d]:%d]\n",j,j,d_chord[j],j,music.tone2[j],j,Bass_tone[j]); for(k=1;k<5;k++){ for(l=0;l<3;l++){ //12 * 1~5 + diatonic[d_chord[0]][l]と一致させる gene[i].tenor_candidate[j][n] = OctaveNum*k+diatonic[d_chord[j]][l]; //確認用表示 //printf("%d ",gene[i].tenor_candidate[j][n]); //音域外の候補を0にする //ソプラノパートより大きい音、バスパートより小さい音を0にする if(gene[i].tenor_candidate[j][n]<12 || gene[i].tenor_candidate[j][n]>33 || music.tone2[j] <= gene[i].tenor_candidate[j][n] || Bass_tone[j] >= gene[i].tenor_candidate[j][n]){ gene[i].tenor_candidate[j][n] = 0; //printf("change"); }// if(音域外) if(gene[i].tenor_candidate[j][n]>0){ //tone_to_abc(gene[i].tenor_candidate[i][n]); }//if(gene[i].tenor_candidate[j][n]>0) else{ //printf("\n"); }//else n++; //nをカウントする }//for(l) }//for(k) /******************音の高さの候補を最終決定する*****************/ for(k=0;k<12;k++){ if(gene[i].tenor_candidate[j][k]>0){ //printf("gene[%d].tenor_c[%d][%d]:",i,j,m); //ここで音の最終候補を入れる gene[i].tenor_c[j][m] = gene[i].tenor_candidate[j][k]; //printf("%d ", gene[i].tenor_c[j][m]); //tone_to_abc(gene[i].tenor_c[j][m]); m++; //入れた音の高さをカウント }//if(gene[i].tenor_candidate[j][k]>0) }//for(k) //printf("\n"); //printf("(gene[%d].gene[%d]:%d) ",i,j,gene[i].gene[j]); //printf("% "); //printf("(候補数:%d) ",m); //printf("= "); /*********************音の高さの決定*********************/ //遺伝子の値を音の高さで割った余りから、音の高さを決定する gene[i].tenor[j] = gene[i].tenor_c[j][(gene[i].gene[j])%m]; //実行された場合、 if((gene[i].tenor[j]) == 0){ printf("%d番目の高さを決定できませんでした\n",i); exit(0); }//if(留年) for(k=0;k<3;k++){ //printf("%s",abcd[diatonic[d_chord[j]][k]]); } /* //確認用表示 printf("%d\n",(gene[i].gene[j])%m); printf("gene[%d].tone[%d]:",i,j); tone_to_abc(gene[i].tenor[j]); */ }//if(j==0) /************************2音目以降の場合************************/ /**************(他パートとの音の高さを考慮する場合)*************/ else{ //音の高さの候補を決定 for(k=1;k<5;k++){ for(l=0;l<3;l++){ gene[i].tenor_candidate[j][n] = OctaveNum*k+diatonic[d_chord[j]][l]; //音域外の候補を0にする if(gene[i].tenor_candidate[j][n]<12 || gene[i].tenor_candidate[j][n]>33 || music.tone2[j]<gene[i].tenor_candidate[j][n] || Bass_tone[j]>gene[i].tenor_candidate[j][n]){ gene[i].tenor_candidate[j][n]=0; //printf("change (0)"); }//if(音域外) //前に決定したテノールパートとの音の高さの差分が1オクターブより大きくなる候補を除外する //1オクターブ:半音で12の差 if(abs(gene[i].tenor[j-1] - gene[i].tenor_candidate[j][n])>12 && gene[i].tenor_candidate[j][n]>0){ gene[i].tenor_candidate[j][n] = 0; //printf("change (1)"); }//if(高さの差分が1オクターブより大きくなる候補を除外) /*********************並達1.5.8度の除外********************/ //ソプラノパート if( (abs(music.tone2[j-1]-gene[i].tenor[j-1])%12 == 0 && abs(music.tone2[j]-gene[i].tenor_candidate[j][n])%12==0) || (abs(music.tone2[j-1]-gene[i].tenor[j-1])%12 == 7 && abs(music.tone2[j]-gene[i].tenor_candidate[j][n])%12==7)|| (abs(music.tone2[j-1]-gene[i].tenor[j-1])%12 ==12 && abs(music.tone2[j]-gene[i].tenor_candidate[j][n])%12==12) ){ gene[i].tenor_candidate[j][n] = 0; //printf("change (3)"); }//if(ソプラノの並達) //アルトパート if( (abs(gene[i].tone[j-1]-gene[i].tenor[j-1])%12 == 0 && abs(gene[i].tone[j]-gene[i].tenor_candidate[j][n]%12==0) || (abs(gene[i].tone[j-1]-gene[i].tenor[j-1])%12 == 7 && abs(gene[i].tone[j]-gene[i].tenor_candidate[j][n])%12==7)|| (abs(gene[i].tone[j-1]-gene[i].tenor[j-1])%12 ==12 && abs(gene[i].tone[j]-gene[i].tenor_candidate[j][n])%12==12) ){ gene[i].tenor_candidate[j][n] = 0; //printf("change (4)"); }//if(アルトの並達) //バスパート if( (abs(Bass_tone[j-1]-gene[i].tenor[j-1])%12 == 0 && abs(Bass_tone[j]-gene[i].tenor_candidate[j][n])%12==0) || (abs(Bass_tone[j-1]-gene[i].tenor[j-1])%12 == 7 && abs(Bass_tone[j]-gene[i].tenor_candidate[j][n])%12==7) || (abs(Bass_tone[j-1]-gene[i].tenor[j-1])%12 == 12 && abs(Bass_tone[j]-gene[i].tenor_candidate[j][n])%12==12) ){ gene[i].tenor_candidate[j][n] = 0; //printf("change(5)"); }//if(バスの並達) //printf("\n"); //もしテノールパートの候補があるなら if(gene[i].tenor_candidate[j][n]>0){ //tone_to_abc(gene[i].tenor_candidate[i][n]); q++; }//if(gene[i].tenor_candidate[j][n]>0) else{ //printf("\n"); }//else //nをカウント n++; }//for(l) }//for(k) /***************【音の高さの候補を最終決定】***************/ for(k=0;k<12;k++){ if(gene[i].tenor_candidate[j][k]>0){ gene[i].tenor_c[j][m] = gene[i].tenor_candidate[j][k]; //入れた音の高さの数をカウント m++; } //if(gene[i].tenor_candidate[j][k]>0) }//for(k) //printf("\n"); //printf("(gene[%d].gene[%d]:%d) ",i,j,gene[i].gene[j]); //printf("% "); //printf("(候補数:%d) ",m); //printf("= "); /********************【音の高さを決定】********************/ //音が入っている場合 if(m!=0){ //遺伝子の値を音の高さで割った余りから、音の高さを決定 gene[i].tenor[j] = gene[i].tenor_c[j][(gene[i].gene[j])%m]; gene[i].flag[j] = 0; //フラグを初期化(0なら音が入る) /*******************************************************/ /******【対応している派生モチーフの音の高さの決定】*****/ /*******************************************************/ //モチーフのグループで回す for(g=0;g<MotifGNum;g++){ //派生の数で回す for(v=0;v<var_num[g];v++){ //派生モチーフが基本モチーフと対応しているとき if(v==1 && g>0 &&(sameMotif[j]-((1000*g)+(100*v)+(j-motif_start[g][1]+1-same)) )==0){ gene[i].tenor[j] = gene[i].tenor[j -(motif_start[g][1]-motif_start[g][0])-same]; }//if(対応しているモチーフの部分) //派生モチーフが基本モチーフと対応していないとき else if(g>0&&v==1&&sameMotif[j] - ((1000*g)+(100*v)) == 0){ if(sameMotif[j]-sameMotif[j-1] == 0){ same++; }//if(sameMotif[j]-sameMotif[j-1]==0) }//else if if(j == motif_start[g][1]){ same = 0; } }//for(v) }//for(g) /****************************************************/ //確認用のfor文 for(k=0;k<3;k++){ //printf("%s", abcd[ diatonic[d_chord[j]][k] ]); } /* //確認用表示 printf("gene[%d].tone[%d]:",i,j); tone_to_abc(gene[i].tenor[j]); */ }//if(m!=0) else{ poi = 0; //音域を0にしたとき、カウント pai = 0; //最終候補を決定した時にカウントする gene[i].flag[j] = 1; //フラグを立てる(音が入っていないので) for(k=1;k<5;k++){ for(l=0;l<3;l++){ gene[i].tenor_candidate[j][poi] = OctaveNum * k +diatonic[d_chord[j]][l]; //音域外の候補を0にする if(gene[i].tenor_candidate[j][poi]<12 || gene[i].tenor_candidate[j][poi]>33 || music.tone2[j]<gene[i].tenor_candidate[j][poi] || Bass_tone[j]>gene[i].tenor_candidate[j][poi]){ gene[i].tenor_candidate[j][poi] = 0; }//if(音域外) poi ++; }//for(l) }//for(k) //最終候補の決定 for(k=0;k<12;k++){ if(gene[i].tenor_candidate[j][k] > 0){ gene[i].tenor_c[j][pai] = gene[i].tenor_candidate[j][k]; pai++; }//if(gene[i].tenor_candidate[j][k]>0) }//for(k) gene[i].tenor[j] = gene[i].tenor_c[j][gene[i].gene[j]%pai]; }//else }//else(2音目以降の決定のとこ) }//for(j=0;j<GeneLength;j++) }//for(i=0;i<PopSize;i++) /* //確認用表示 //遺伝子0に割り当てられた音の高さ for(j=0;j<music.SNum;j++){ printf("gene[0].tone[%3d]:【%4d】{%2d}(%d)",j,sameMotif[j],gene[0].tone[j],d_chord[j]+1); tone_to_abc(gene[0].tone[j]); }//for(j) */ }

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/07 03:48