2014-12-05 3 views
1

В Колледже нам пришлось написать программу со структурами, перечислениями и объединениями, чтобы показать дату, как 1.September 2014. У меня возникли проблемы с печатью перечисления. Я нашел некоторые решения на этом форуме, и, наконец, у меня больше нет консольных ошибок. Но каждый раз, когда я пытаюсь запустить свою программу, он падает. Может быть кто-то из вас knwos, что причиной аварии:Ошибка печати C enum?

#include <stdio.h> 

    enum Monate{JANUAR = 1, 
       FEBRUAR = 2, 
       MAERZ = 3, 
       APRIL = 4, 
       MAI = 5, 
       JUNI = 6, 
       JULI = 7, 
       AUGUST = 8, 
       SEPTEMBER = 9, 
       OKTOBER = 10, 
       NOVEMBER = 11, 
       DEZEMBER = 12 }; 

    union Monat{ 
     enum Monate alsMonat; 
     char alsZahl; 
     char alsString[10]; 
    }; 

    struct Datum { 
     char tag; 
     union Monat monat; 
     short jahr; 
    }; 


const char* welcherMonat(enum Monate meinMonat){ 
    switch(meinMonat){ 
      case JANUAR: return"Januar"; 
      break; 

      case FEBRUAR: return"Februar"; 
      break; 

      case MAERZ: return"Maerz"; 
      break; 

      case APRIL: return"April"; 
      break; 

      case MAI: return"Mai"; 
      break; 

      case JUNI: return"Juni"; 
      break; 

      case JULI: return"Juli"; 
      break; 

      case AUGUST: return"August"; 
      break; 

      case SEPTEMBER: return"September"; 
      break; 

      case OKTOBER: return"Oktober"; 
      break; 

      case NOVEMBER: return"November"; 
      break; 

      case DEZEMBER: return"Dezember"; 
      break; 
     } 
} 

void ausgabe(struct Datum *datum){ 
    char month[10]=" "; 
    printf("Tag: %c\n",(*datum).tag); 

    enum Monate monat2=(*datum).monat.alsMonat; 
    printf("Monat: %s\n",welcherMonat(monat2)); 
    printf("Jahr: %d\n\n",(*datum).jahr); 

} 


int main(int argc, char** argv){ 

    struct Datum Geburtstag = {'3',AUGUST,1995}; 
    struct Datum Heute = {'3','12',2014}; 
    struct Datum Millenium = {'1',1,2000}; 

     ausgabe(&Geburtstag); 
     ausgabe(&Heute); 
     ausgabe(&Millenium); 

    return 0; 
} 
+0

Примечания стороны: 1. вам не нужно «ломать» после 'return', 2.' (* foo) .bar' лучше писать как 'foo-> bar' –

+0

Кроме того, запустите свою программу в отладчик, чтобы узнать, на какой строке он падает. –

+0

Не могли бы вы опубликовать stacktrace? – user1766169

ответ

0

Как вы можете иметь несколько символов символ, как это:

struct Datum Heute = {'3','12',2014}; 

Не ваш компилятор бросить предупреждение для этого? В идеале это должно быть

+1

'' 12'' является законным, но его значение определяется реализацией. Это почти бесполезная языковая функция. –

+0

@KeithThompson Мой компилятор выдает ошибку для этого, а также мы видим, что объединение инициализируется только константой char, которая не является правильной? – Gopi

+0

И вот где он терпит неудачу, но 'struct Datum Heute = {'3', 12,2014};' работает. Но функция не поймает все (без 'default'), и это было предупреждение, выпущенное моим компилятором. –

1

Используйте GDB. Это Gnu DeBugger. Скомпилируйте свой код с включенной опцией -g, и он будет содержать все правильные символы отладки. Затем вы можете использовать GDB, чтобы поместить ручную паузу в программу и пропустить ее по одной строке за раз, посмотреть на переменные и посмотреть, где именно она сбой.

+0

Желаю, чтобы я мог повышать * 10 – pm100

+0

Почему бы вам не поблагодарить вас , Приятно знать, что кто-то другой ценит мощь GDB. Я думаю, что мой раздел «обо мне» говорит об этом. – Gophyr

+0

Это только то, что половина людей, которые задают вопросы, похоже, не имеют представления о том, как отлаживать вещи. Кроме того, школа, похоже, не учит этому – pm100

0

Похоже, я забыл предупреждение MultiCharacter ... Когда я выбираю месяц с одним символом, он все еще зависает во второй печати, когда я хочу распечатать дату, используя символ в качестве месяца. Два других типа печати месяца (по перечислению) работают совершенно нормально. Наша задача состояла в том, чтобы напечатать три разные даты, используя все три типа месячной печати.

Я думаю, что я знаю, в чем проблема:

enum Monate monat2=(*datum).monat.alsMonat; 
printf("Monat: %s\n",welcherMonat(monat2)); 

, когда я даю функцию полукокса вместо перечисления, «monat2» пуст. Но как я могу проверить, могу ли я дать ему символ или перечисление?

Смежные вопросы