![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
При анализе размеров структурных переменных иногда число байт, выделенных компилятором под структурную переменную, оказывается больше, чем сумма байт ее полей. Это связано с тем, что компилятор выделяет участок памяти для структурных переменных с учетом выравнивания, добавляя между полями пустые байты по следующим правилам:
структурные переменные, являющиеся элементами массива, начинаются на границе слова, т.е. с четного адреса;
любое поле структурной переменной начинается на границе слова, т.е. с четного адреса и имеет четное смещение по отношению к началу переменной;
при необходимости в конец переменной добавляется пустой байт, чтобы общее число байт было четное.
Некоторые особенности:
поля структуры, как правило, имеют разный тип, кроме функций, файлов и самой этой структуры;
поля не могут иметь атрибут класс памяти, данный атрибут можно определить только для всей структуры;
идентификаторы как самой структуры, так и ее полей могут совпадать с идентификатарами других объектов программы, т.к. шаблон структуры обладает собственным пространством имен;
при наличии в программе функций пользователя шаблон структуры рекомендуется поместить глобально перед определениями всех функций, в этом случае он будет доступен всем функциям.
Элементы структур в общем случае размещаются в памяти последовательно с учетом выравнивания начальных адресов. Выравнивание - установка значения адреса, кратного некоторой величине, определяемой собенностями адресации данных на аппаратном уровне.
Пример на использование структур
Вести сведения о студентах учебной группы (не более 50):
а) фамилию и имя;
в) итоги сдачи экзаменов – три оценки.
В программе расчитать средний балл для каждого студента, выполнить поиск по первой букве фамилии, поиск нужной записи.
Текст программы может иметь вид:
#include <iostream.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
struct Spisok {
char Fio[20];
int Ot[3];
float S_Bal;
} *sved;
void Vvod(int nom,struct Spisok *sved)
{ cout << "\n Vvedi svedenia " << (nom+1);
cout << "\n FIO - "; gets(sved->Fio);
float s=0;
for(int i=0;i<3;i++) {
cout << "\n Otcenki - "; cin >> sved->Ot[i];
s+=sved->Ot[i];
}
sved->S_Bal=s/3.;
return; }
void main(void)
{ struct Spisok Stud[50]; int i,N; char Bukva;
clrscr();
cout << "\n Vvedi kol-vo < 50 "; cin >> N;
for(i=0;i<N;i++) Vvod(i,&Stud[i]);
cout << "\n Spisok Students";
for(i=0;i<N;i++)
printf("\n %20s %4.2f",Stud[i].Fio,Stud[i].S_Bal);
cout << "\n Poisk FIO (bukva) "; cin >> Bukva;
cout << "\n Sveden Students";
int kod_p=0;
for(i=0;i<N;i++)
if(Stud[i].Fio[0]==Bukva){ kod_p=1;
printf("\n %20s %4.2f",Stud[i].Fio,Stud[i].S_Bal); }
if(kod_p==0) cout << " Takix HET!";
cout << "\n Poisk zapisi";
Vvod(-1,sved);
kod_p=0;
for(i=0;i<N;i++)
if(memcmp(sved,&Stud[i],sizeof(sved))==0)
{ kod_p=1;
printf("\n %20s %4.2f",Stud[i].Fio,Stud[i].S_Bal);
}
if(kod_p==0) cout << " Takix HET!";
getch();
}
Дата публикования: 2014-11-28; Прочитано: 350 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!