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

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

ただいまの
回答率

87.61%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 9,911

score 13

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

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


結論

原因

構造体 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 の宣言には
これらのメンバがないため、このようなエラーが出ていると推測します。

    //初期化
    for (i = 0; i < PopSize; i++) {
        for (j = 0; j < music.SNum; j++) {
            gene[i].tenor[j] = 0;
        }
    }
                /******************音の高さの候補を最終決定する*****************/

                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)
            //各個体の始めの遺伝子の時
            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)

補足

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/07 12:48

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

    キャンセル

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

  • ただいまの回答率 87.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る