Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекция - Си

.pdf
Скачиваний:
67
Добавлен:
18.05.2014
Размер:
431.24 Кб
Скачать

Цикл с постусловием

Тело цикла выполняется 1 или более раз

do

{

тело_цикла

}

while (условие);

bool stop = false; do

{

//

что-то делаем

 

 

//

Проверяем, не пора ли

остановиться

 

stop = checkStopButtonPressed();

 

}

 

 

 

while

(!stop); // повторять

пока stop равно false

31

Цикл со счётчиком

(разновидность цикла с предусловием)

for (блок_иниц_сч; условие; измен_счётч)

{

тело цикла

}

for (int i = 0; i < 8; ++i )

{

// Провести измерение по каналу i float result = getAdcByChannel(i); saveAdcResults (i, result);

}

double value = 25.5;

for (; value < 100.0; value = value + 0.5 )

{

checkValue(value);

}

нет

да

32

Массивы

Массив — последовательный набор элементов (переменных) одинакового типа с поддержкой обращения по номеру

Особенности:

-неразрывный блок памяти;

-размер невозможно изменить;

-индексация от 0 до N-1, где N — размер массива

Массив:

тип имя[размер];

33

Массивы

unsigned int arr[5];

arr[0] arr[1] arr[2] arr[3] arr[4]

0x2000

//Создание массива из 5 элементов типа unsigned int unsigned int arr[5];

arr[0] = 2; // Запись 2 в элемент массива с индексом 0

//Сумма двух элементов массива (чтение)

unsigned int summ = arr[1] + arr[2];

arr[5] = 10; //

НЕЛЬЗЯ! Обращение за пределы массива.

//

Создание массива

с одновременной инициализацией

 

//

элементов (размер определяется автоматически)

34

short m[] = {2,

3};

 

 

 

Заполнение массивов. Пример.

double getNewMeasurementResult(void);

...

double valuesArray[20]; unsigned int currentIndex = 0;

...

while (true) // вечный цикл

{

 

double value = getNewMeasurementResult();

 

valuesArray[currentIndex] = value;

 

currentIndex = currentIndex + 1; // ++currentIndex;

 

if (currentIndex == 20) // если currentIndex равно 20

 

{

 

currentIndex = 0;

 

// Обработать массив;

 

processValues(valuesArray, 20);

}

}

35

Массивы и указатели

-Массив не является указателем;

-Из массива легко получить указатель на элемент массива;

-С массивом можно работать через указатель;

-С указателем можно работать как с массивом;

unsigned int arr[5];

arr[0] arr[1] arr[2] arr[3] arr[4]

*(ptr+0) *(ptr+1) *(ptr+2) *(ptr+3) *(ptr+4) unsigned int arr[5];

//Инициализация указателя адресом первого элемента

//массива (с индексом 0)

unsigned int

*ptr =

arr;

// unsigned int *ptr = &arr[0];

*(ptr + 2)

=

20;

//

arr[2] = 20;

 

*(arr + 3)

=

30;

//

arr[3] = 20;

 

unsigned int

*ptr2 = arr

+ 2;

36

ptr2[2] = 40; //

arr[4];

 

 

 

Передача указателей в функции (1)

void fillArray (double * array, unsigned int size); double getArraySumm(const double array[], unsigned size);

int main(void)

{

double values[100];

fillArray(values, 100); // Создаётся ук-ль на 1й эл-т массива.

double summ = getArraySumm(values, 100);

}

double getArraySumm(const double array[], unsigned size)

{

//array — указатель, а не массив

//array[5] — обращение к элементу с индексом 5;

...

}

-Передать массив в функцию можно только через указатель;

-Изменение массива в функции отразится на исходном массиве;

- Для запрета изменения массива внутри функции

37

используется const;

 

Передача указателей в функции (2)

// Макроопределение (делает текстовую подстановку) #define BUFF_SIZE 200

unsigned char* initBuffer (int * bufferSize)

{

static unsigned char buffer[BUFF_SIZE]; *bufferSize = BUFF_SIZE;

return buffer;

}

int main (void)

{

int size;

unsigned char * buff = initBuffer(&size);

}

-Для возврата из функции более, чем одного значения;

-Использование параметров не только в качестве входных данных, но и выходных;

-При работе с комплексными типами данных (структуры):

повышение производительности за счёт отсутствия

38

копирования возвращаемого значения;

 

Оператор sizeof

-Тип переменной → размер в памяти;

-Оператор sizeof — определение объёма памяти, занимаемого типом/переменной

-Размер вычисляется во время компиляции

const unsigned char integerSize = sizeof (int);

short a = 9;

const unsigned int sizeOfShort = sizeof (a);

unsigned int array[10];

const unsigned int arraySize = sizeof(array);

unsigned int *ptrToArray = array;

const int pointerSize = sizeof (ptrToArray);

...

void func (unsigned int array[])

 

{

 

unsigned char size = sizeof(array);

39

}

typedef - создание нового имени для типа

typedef тип новое_имя_типа;

typedef unsigned int uint32; typedef unsigned char byte; typedef byte * BuffPtr;

uint32 a = 5;

BuffPtr buff = NULL; byte buffer[100]; buff = buffer; buff[0] = 25;

unsigned char * elem10 = &buffer[10]; // = buffer+10

-не создаёт новый тип, а создаёт новое имя для него (псевдоним);

-допускается использование для указателей;

-используется для объявления комплексных типов — структур;

40