Страница 62 из 69
mystar.subclass = 2;
mystar.decl = 3.5167;
mystar.RA = -9.633;
mystar.dist = 0.303;
/* конец функции main() */
}
Вы обращаетесь к каждому элементу структуры, используя его
составное имя, состоящее из имени структуры (на первом месте) и,
в порядке иерархической подчиненности, имен ее образующих элемен-
тов, разделенных точками (.). Конструкция вида: varname.memname
(имя переменной.имя элемента) считается эквивалентной имени пере-
менной того же типа, что и memname, и вы можете выполнять с ней
те же операции.
- 511,512 -
Структуры и указатели
-----------------------------------------------------------------
Вы можете описывать указатели на структуры точно так же, как
и указатели на другие типы данных. Это необходимо для создания
связных списков и других динамических структур данных элементами
которых, в свою очередь, являются структуры данных.
Фактически указатели на структуры так часто используются в
Си, что существует специальный символ для ссылки на элемент
структуры, аресованной указателем. Рассмотрим следующий вариант
предыдущей программы:
#include
do_main_menu(short *done)
{
char cmd;
*done = 0;
do {
cmd = toupper(getch());
switch(cmd) {
case 'F' : do_file_menu(done); break;
- 515,516 -
case 'R' : run_program(); break;
case 'C' : do_compile(); break;
case 'M' : do_make(); break;
case '?' : do_project_menu(); break;
case 'O' : do_option_menu(); break;
case 'E' : do_error_menu(); break;
default : handle_others(cmd,done);
} while (!*done);
}
Эта функция организует цикл, в котором символ считывается,
преобразуется к значению на верхнем регистре, а затем запоминает-
ся в переменной cmd. Потом введенный символ обрабатывается
оператором switch на основе значения cmd.
Цикл повторяется до тех пор, пока переменная done не станет
равной нулю (предположительно в функции do_file_menu или
handle_others).
Оператор switch получает значение cmd и сравнивает его с
каждым значением метки case. Если они совпадают, начинается вы-
полнение операторов данной метки, которое продолжается либо до
ближайшего оператора break, либо до конца оператора switch. Если
ни одна из меток не совпадает, и вы включили метку default в опе-
ратор switch, то будут выполняться операторы этой метки; если
метки default нет, оператор switch целиком игнорируется.
Значение value, используемое в switch(value) должно быть
приведено к целому значению. Другими словами, это значение должно
легко преобразовываться в целое для таких типов данных как char,
разновидности enum и, конечно, int, а также всех его вариантов.
Нельзя использовать в операторе switch вещественные типы данных
(такие как float и double), указатели, строки и другие структуры
данных, но разрешается использовать элементы структур данных сов-
местимых с целыми значениями.
Хотя (value) может быть выражением (константа, переменная,
вызов функции, и другие комбинации их), метки case должны содер-
жать константы. Кроме того, в качестве ключевого значения case
может быть только одно значение. Если бы do_main_menu не исполь-
зовало фукцию toupper для преобразования cmd, оператор switch мог
бы выглядеть следующим образом:
switch (cmd) {
- 517,518 -
case 'f' :
case 'F' : do_file_menu(done);
break;
case 'r' :
case 'R' : run_program();
break;
...
Этот оператор выполняет функцию do_file_menu независимо от
того, в каком регистре поступает значение cmd, аналогично выпол-
няются действия для других альтернатив значения cmd.
Запомните, что для завершения данного case вы должны исполь-
зовать оператор break . В противном случае будут выполняться пос-
ледовательно все операторы, относящиеся к другим меткам (до тех
пор пока не встретится оператор break).