4.6.5 Векторные Параметры

4.6.5 Векторные Параметры

Если в качестве параметра функции используется вектор, то передается указатель на его первый элемент. Например:

int strlen(const char*);

void f() (* char v[] = «a vector» strlen(v); strlen(«Nicholas»); *);

Иначе говоря, при передаче как параметр параметр типа T[] преобразуется к T*. Следовательно, присваивание элементу векторного параметра изменяет значение элемента вектора, кторый является параметром. Другими словами, вектор отличается от всех остальных типов тем, что вектор не передается (и не может передаваться) по значению.

Размер вектора недоступен вызываемой функции. Это может быть неудобно, но эту сложность можно обойти несколькими спсобами. Строки оканчиваются нулем, поэтому их размер можно легко вычислить. Для других векторов можно передавать второй

параметр, который задает размер, или определить тип, содержщий указатель и индикатор длины, и передавать его вместо просто вектора (см. также #1.11). Например:

void compute1(int* vec_ptr, int vec_size); // один способ

struct vec (* // другой способ int* ptr; int size; *);

void compute2(vec v);

С многомерными массивами все хитрее, но часто можно вместо них использовать векторы указателей, которые не требют специального рассмотрения. Например:

char* day[] = (* «mon», «tue», «wed», «thu», «fri», «sat», «sun» *);

С другой стороны, рассмотрим определение функции, котрая работает с двумерными матрицами. Если размерность извесна на стадии компиляции, то никаких проблем нет:

void print_m34(int m[3][4]) (* for (int i = 0; i«3; i++) (* for (int j = 0; j„4; j++) cout «« " " «« m[i][j]; cout «« « “; *) *)

Матрица, конечно, все равно передается как указатель, а размерности используются просто для удобства записи.

Первая размерность массива не имеет отношения к задаче поиска положения элемента (#2.3.6). Поэтому ее можно передвать как параметр:

void print_mi4(int m[][4], int dim1) (* for (int i = 0; i«dim1; i++) (* for (int j = 0; j„4; j++) cout «« " " «« m[i][j]; cout «« « “; *) *)

Сложный случай возникает, когда нужно передавать обе размерности. «Очевидное решение» просто не работает:

void print_mij(int m[][], int dim1, int dim2) // ошибка (* for (int i = 0; i«dim1; i++) (* for (int j = 0; j„dim2; j++) cout «« " " «« m[i][j]; // сюрприз! cout «« « “; *) *)

Во-первых, описание параметра m[][] недопустимо, покольку для нахождения положения элемента должна быть известна вторая размерность многомерного массива. Во-вторых, выражение m[i][j] интерпретируется (правильно) как *(*(m+i)+j), но нпохоже, чтобы это имел в виду программист. Вот правильное решение:

void print_mij(int** m, int dim1, int dim2) (* for (int i = 0; i«dim1; i++) (* for (int j = 0; j„dim2; j++) cout «« " " «« (int*)m[i*dim2+j]; // туманно cout «« « “; *) *)

Выражение, которое применяется для доступа к элементам, эквивалентно тому, которое генерирует компилятор, когда он знает последнюю размерность. Чтобы немного прояснить програму, можно ввести дополнительную переменную:

int* v = (int*)m; // ... v[i*dim2+j]

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг:

Параметры TCP

Из книги автора

Параметры TCP Каждый сегмент SYN может содержать параметры TCP. Ниже перечислены наиболее общеупотребительные параметры TCP.? Параметр MSS. Этот параметр TCP позволяет узлу, отправляющему сегмент SYN, объявить свой максимальный размер сегмента (maximum segment size, MSS) — максимальное


27.5. Параметры транзитных узлов и параметры получателя IPv6

Из книги автора

27.5. Параметры транзитных узлов и параметры получателя IPv6 Параметры для транзитных узлов и параметры получателя IPv6 имеют одинаковый формат, показанный на рис. 27.3. Восьмиразрядное поле следующий заголовок (next header) идентифицирует следующий заголовок, который следует за


1.1.3.5. Параметры сети

Из книги автора

1.1.3.5. Параметры сети Следующий этап программы установки - это установка параметров сетевого интерфейса (сетевой карты) (рис. 1.16). Можно пропустить данный этап, поскольку мы всегда сможем настроить сеть с помощью конфигуратора system-config-network, - нечего забивать себе голову этим


7.8.3. Параметры ядра

Из книги автора

7.8.3. Параметры ядра В каталоге /proc/sys/kernel находятся файлы, позволяющие изменять некоторые важные параметры ядра. Перечислим некоторые (самые важные) файлы из этого каталога.• ctrl-alt-del - задает реакцию системы на нажатие комбинации клавиш ‹Ctrl+Alt+Del›. Может содержать значение 0


Параметры

Из книги автора

Параметры Сеть (Проигрыватель Windows Media 8.0 и выше)Чтобы скрыть вкладку Сеть (Сервис-Параметры), нужно установить значение типа DWORD параметра ·HideNetworkTab· равным 1 в разделе HKCUSoftwarePoliciesMicrosoftWindowsMediaPlayer.Автоматическое обновление (Проигрыватель Windows Media 7.0 и выше)Проигрыватель Windows


Параметры

Из книги автора

Параметры После установки Проигрыватель Windows Media 10 готов к работе, и изменять значения основных параметров нет необходимости. Однако некоторые параметры все же, возможно, придется настроить.Откройте Проигрыватель Windows Media и выполните команду Сервис ? Параметры. Откроется


Свитки настроек Shader Basic Parameters (Основные параметры затенения) и Basic Parameters (Основные параметры)

Из книги автора

Свитки настроек Shader Basic Parameters (Основные параметры затенения) и Basic Parameters (Основные параметры) Свитки Shader Basic Parameters (Основные параметры затенения) и Basic Parameters (Основные параметры) (рис. 3.5) позволяют настраивать параметры тонированной раскраски, трех главных компонентов цвета


Параметры

Из книги автора

Параметры Список параметров, передаваемых в процедуру или в функцию, имеет следующий синтаксис:параметр1: тип; …; параметрN: типЕсли процедура или функция не принимает никаких параметров, то ее заголовок выглядит следующим образом: procedure имя_процедуры;function имя_процедуры:


7.3.2. Параметры-ссылки и параметры-указатели

Из книги автора

7.3.2. Параметры-ссылки и параметры-указатели Когда же лучше использовать параметры-ссылки, а когда – параметры-указатели? В конце концов, и те и другие позволяют функции модифицировать объекты, эффективно передавать в функцию большие объекты типа класса. Что выбрать:


Параметры

Из книги автора

Параметры Записи имеют форму.имя-параметра = значениеимя-параметра является строкой, которая не содержит пробелов и именует конфигурируемое свойство сервера.Значение является числом, логическим значением (1 = True, 0 = False) или строкой, что задает значение параметра.Для


Параметры

Из книги автора

Параметры Параметры в XSLT практически полностью идентичны переменным. Они точно так же связывают с объектом имя, посредством которого в дальнейшем можно к этому объекту обращаться. Главным различием является то, что значение, данное параметру при инициализации, является


Параметры

Из книги автора

Параметры Однократные процедуры и функции могут иметь параметры, необходимые, по определению, лишь при первом


6.1.10. Создаем векторные изображения

Из книги автора

6.1.10. Создаем векторные изображения Для выполнения задания нам понадобится материал разд. 5.1.10 и 5.1.11.Задание № 1Нарисовать дом, используя инструменты векторной графики, взяв за образец рис. 6.10. Задание находится на первой странице документа в файле: /pages/tasks/6.