質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

8257閲覧

has no member named のエラー文がよくわかりません。

Black_

総合スコア13

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2019/01/04 16:38

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) */ }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

構造体の宣言がリストに含まれていないようなので、間違えている可能性がありますが、
私の推測を書きます。
ご参考になれば幸いです。


結論

原因

構造体 Gene に 'tenor','tenor_c' ,'tenor_candidate' という3つのメンバーが
定義されていない

解決方法

構造体 Gene の定義に 'tenor','tenor_c' ,'tenor_candidate' という3つのメンバーを追加する。

※ご質問の内容から推測すると、
おそらく 'alto','alto_c' ,'alto_candidate' というメンバーがすでに存在しているはずなので、
それを参考にすればよいでしょう。


説明

ご質問の

'Gene' has no member named 'tenor' / 'tenor_c' / 'tenor_candidate'

をGoogle 翻訳にかけると

'Gene'には 'tenor' / 'tenor_c' / 'tenor_candidate'という名前のメンバーがありません

となります、

宣言している記述を見つけることができませんでしたが、
配列 gene がおそらく、構造体 Gene の配列として宣言されているはずです。
ご質問のリストの中には、gene の構造体メンバとして
'tenor','tenor_c' ,'tenor_candidate' にアクセスしている記述があります。
これらの箇所でアクセスしているにもかかわらず、構造体 Gene の宣言には
これらのメンバがないため、このようなエラーが出ていると推測します。

C

1 //初期化 2 for (i = 0; i < PopSize; i++) { 3 for (j = 0; j < music.SNum; j++) { 4 gene[i].tenor[j] = 0; 5 } 6 }

C

1 /******************音の高さの候補を最終決定する*****************/ 2 3 for (k = 0; k < 12; k++) { 4 if (gene[i].tenor_candidate[j][k] > 0) { 5 //printf("gene[%d].tenor_c[%d][%d]:",i,j,m); 6 7 //ここで音の最終候補を入れる 8 gene[i].tenor_c[j][m] = gene[i].tenor_candidate[j][k]; 9 10 //printf("%d ", gene[i].tenor_c[j][m]); 11 //tone_to_abc(gene[i].tenor_c[j][m]); 12 13 m++; //入れた音の高さをカウント 14 }//if(gene[i].tenor_candidate[j][k]>0) 15 }//for(k)

C

1 //各個体の始めの遺伝子の時 2 if (j == 0) { 3 //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]); 4 5 for (k = 1; k < 5; k++) { 6 for (l = 0; l < 3; l++) { 7 8 //12 * 1~5 + diatonic[d_chord[0]][l]と一致させる 9 gene[i].tenor_candidate[j][n] = OctaveNum * k + diatonic[d_chord[j]][l]; 10 //確認用表示 11 //printf("%d ",gene[i].tenor_candidate[j][n]); 12 13 //音域外の候補を0にする 14 //ソプラノパートより大きい音、バスパートより小さい音を0にする 15 if (gene[i].tenor_candidate[j][n] < 12 16 || gene[i].tenor_candidate[j][n]>33 17 || music.tone2[j] <= gene[i].tenor_candidate[j][n] 18 || Bass_tone[j] >= gene[i].tenor_candidate[j][n]) { 19 gene[i].tenor_candidate[j][n] = 0; 20 //printf("change"); 21 }// if(音域外) 22 23 if (gene[i].tenor_candidate[j][n] > 0) { 24 //tone_to_abc(gene[i].tenor_candidate[i][n]); 25 26 }//if(gene[i].tenor_candidate[j][n]>0) 27 28 else { 29 //printf("\n"); 30 }//else 31 32 n++; //nをカウントする 33 }//for(l) 34 }//for(k)

補足

今回のご質問の内容に加えて以下の事項も記載されると、
より多くの人から回答を得られる可能性が上がると思います。

  • コンパイルを行った環境(OS,コンパイラ)
  • コンパイラが出力したエラーメッセージの全て(無編集の全テキスト)

投稿2019/01/04 20:37

kozuchi

総合スコア1193

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Black_

2019/01/07 03:48

ありがとうございます。 構造体や変数を宣言している別のファイルがありまして、そちらを見たらアルトの部分の宣言があったので追加したところ、コンパイルが通りました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問