Лекция - Си
.pdfЦикл с постусловием
Тело цикла выполняется 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