2016-09-21 4 views
0

私は、ユーザーが削除、追加、編集できるWarehouseプログラムと対話するプログラムを構築するはずだった私の割り当てでほぼ完了しています...しかし、event_loopの機能では、メニューから選択すると、スイッチのステートメントでデフォルトになります。私は私のask_question_menuでuniontypeのanswer_tを使用しているので、多分それは私が単一のcharになりたいその関数からの戻り値と関係があるでしょう。誰かがここで何が起こっているのか教えてもらえますか?Cで共用体を使用してステートメントを切り替え、問題が発生しました。コードに何が問題なのですか?

非常にお手伝いいただきありがとうございます。

typedef union { 
    int i; 
    float f; 
    char *s; 
    char d; 
} answer_t; 

char ask_question_menu(char *question){ 
    answer_t answer = ask_question(question, correct_input, (convert_func) toupper); 
    return answer.d; 
} 
//my general function for user input follows here... 
answer_t ask_question(char *question, check_func check, convert_func convert) 
{ 
    int buffersize = 50; 
    char buffer[buffersize]; 

    do 
     { 
      printf("%s\n", question); 
      read_string(buffer, buffersize); 
     } 

    while(check(buffer)==false); 

    answer_t result = convert(buffer); 

    return result; 
} 

int event_loop(item_t *db, int *db_size) 
{ 
    while(true){ 
     char choise = ask_question_menu(" [L]ägga till en vara\n [T]a bort en vara\n [R]edigera en vara\n Ån[g]ra senaste ändringen\n Lista [h]ela varukatalogen\n [A]vsluta\n"); 

     switch(choise) 
      { 
      case 'L': 
       add_item_to_db(db, db_size); 
       break; 
      case 'T': 
       remove_item_from_db(db, db_size); 
       break; 
      case 'R': 
       edit_db(db, *db_size); 
       break; 
      case 'G': 
       printf("Not yet implemented\n"); 
       break; 
      case 'H': 
       list_db(db, *db_size); 
      case 'A': 
       return 0; 
       break; 
      default: 
       printf("Wrong input\n"); 
       break; 
      } 
    } 
} 
+1

問題を引き起こす最初のことは、コードの書式設定です。 –

+0

'case 'H':' 'break'文がありませんか? –

+0

'(convert_func)toupper'はおそらく未定義の動作につながります。これを確認するには、 'convert_func'の定義を表示してください。 –

答えて

1

convertポイントtoupper()に、この行...

answer_t result = convert(buffer); 

...間違いなくtoupper()intをタイプintのパラメータを受け取り、返すので、未定義の動作を生成しますが、あなたが渡していますchar *であり、戻り値がanswer_tであると仮定します。あなたが望むなら、それは最終的にこのUBの責任を負うのはtoupperからconvert_funcのキャストであると言うことができます。

answer_tを返す関数が必要な場合は、toupper()をラップする必要があります。

answer_t toupper_wrap(char *buffer) { 
    return (answer_t) { .d = toupper(*buffer) }; 
} 

toupper()に直接それへのポインタの代わりのポインタを渡します。それはconvert_funcを持っていることになっているが、これは、あなたがそれを使用しようとしている方法と互換性があるでしょう形成まさに不明です。

+0

私は、toupperがint型のルーキーミスであるとは決して考えなかった。しかし、今私はあなたの魔法の機能を使用し、それは私のプログラムを完了したので、多くの人に感謝、本当に感謝します! –

関連する問題