 |
- 143,144 -
Structures (Структуры).
-----------------------------------------------------------------
Оба языка и Паскаль, и Си позволяют определить унифицирован-
ные и неоднородные структуры данных.
В Паскале они называются records, а в Си - структуры.
Формат для обоих:
Турбо Паскаль Турбо Си
----------------------------------------------------------------
type typedef struct {
=record ;
:; ;
:; ...
... ;
: } ;
end;
var
:; ;
Существует также более строгий формат в Си для прямого опре-
деления структур переменных, более аналогичный формату Паскаля.
Турбо Паскаль Турбо Си
----------------------------------------------------------------
var
:record struct
{
: ;
... ...
: ;
end; } ;
В этом варианте, необязательная структура; вы должны
записать ее, если планируете объявить другие переменные типа
. Кроме того, записи в Паскале и структуры в Си довольно
близки.
Турбо Паскаль Турбо Си
- 145,146 -
----------------------------------------------------------------
Type
Student=record struct student {
Last,First:string[20]; char last[20],first[20];
SSN : string[11]; char ssn[11];
Fgt : Integer; int age;
Tests: array[1..5] if integer; int tests [5];
GPA : Real float gra;
end; } current;
var main ()
Current: Student; {
begin
Current.Last='Smith'; strcpy(current.last,"Smith");
Current.Age =21; current.age=21;
Current.Test[1]=97; current.test[0]=97;
Current.GPA=3.94; current.gpa=3.94;
end }
Главное различие между Паскалем и Си в том, что в Паскале
имеются операторы, а в Си - нет. Мы могли бы переписать код на
Паскале, использовав выше оператор with Current do , и затем ссы-
латься на поля без указания в начале Current. В Си вы всегда
должны указывать Current в начале. Однако, Си также имеет опера-
тор доступа member (->), используемый, когда идентификатор слева
от оператора является указателем на собственную структуру. Для
примера, если pstudent является указателем на struct, тогда
strcpy(pstudent -> last,"Jones");
присвоит переменной last строку "Jones".
- 147,148 -
Union (Объединение).
-----------------------------------------------------------------
И Паскаль, и Си содержат сходное понятие, называемое: в Пас-
кале - переменная (вариантная) структура записи, a в Си - union
(объединение). Конкретные способы его описания показаны в приме-
ре:
Турбо Паскаль Турбо Си
----------------------------------------------------------------
type
=record union {
;
case of ;
:() ...
:() ;
... };
:()
end;
B Паскале является обычной записью последователь-
ностей :;, повторяемой нужное количество раз.
Два основных различия между Паскалем и Си в следующем:
1) Паскаль заставляет положить объединение в основу регуляр-
ной записи, а Си - нет. Однако, вы можете сначала объявить объ-
единение, а затем указать поле в структуре, принадлежащее типу,
описанному в объединении.
2) Паскаль позволяет вам иметь множество типов для каждого
варианта в объединении. Си позволяет иметь множество полей
(), но все должны быть одного типа.
Вот образец, написанный в Паскаль и Си версиях, как можно
ближе к друг другу (однако, можно допустить, что они не вполне
идентичны).
Турбо Паскаль Турбо C
----------------------------------------------------------------
type typedef union {
trick_word=record int w;
- 149,150 -
case integer of struct {
0:(w:integer); char lob;
1:(lob,hib:byte); char hib;
end; } b;
var xp:trick_word; } trick_word;
trick_word xc;
Примечание: определение trick_word ни в Си, ни в Паскале не
переносимо. Они оба зависят от порядка байт 8086.
В Си объединении, как и в структуре, вы можете вставить поле
между закрытой скобкой и точкой с запятой, чтобы прямо
указать переменные того типа. В этом операторе выбора вы можете
оставить свободным , если вы не собираетесь указывать
больше таких переменных. Полями ссылок в Паскале являются: xp.w,
xp.hib и xp.lob, а в Си - xc.w, xc.b.hib и xc.b.lob.
Выводы по программированию.
-----------------------------------------------------------------
Как программист на Паскале, вы не должны ощущать трудности
при изучении Турбо Си. Но есть небольшая область в программирова-
нии, которая вызывает некоторые трудности при переходе с языка на
язык. Мы обсудим каждый из таких разделов в этой части.
Чувствительность к регистрам.
-----------------------------------------------------------------
Паскаль, в отличие от Си, не чувствителен к типу букв
(строчные - заглавные). Если идентификаторы indx, Indx и INDX в
Паскале ссылаются на одинаковые переменные, то в Си - на три раз-
личные переменные.
Примечание: т.к. вызовы функций не проявляют себя до тех пор
пока программа на Си не скомпанована, то различие в регистрах
может не чувствоваться. Для вашей собственной пользы будьте точны
при выборе регистра на Си.
- 151,152 -
 |
|