Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Процедуры с ключевым словом Var 
:(
    Опции темы
AndreyANM
Дата 27.1.2006, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 4.1.2006

Репутация: нет
Всего: нет



Вот у меня есть процедура (см. ниже) SrtStrok в общем она
сортирует строки в матрице, сейчас это не важно.
В нее прередаются два массива.

Я так понимаю, что после ключевого слова Var передаются не переменные
а их указатели. Так вот в чем вопрос:

Слово Var нужно писать перед каждой переменной,
передаваемой по указателю, или можно написать Var всего один раз?


Этот вопрос возник потому, что при таком определении процедуры:
Код

Type
  Ax: array [1..100,1..100] of Extended;
  Bx: array [1..100] of Extended

Procedure SrtStrok(N:Integer;Var A:Ax; B:Bx)

изменяется только массив A, массив В остается без изменений

A в этом случае:
Код

Type
  Ax: array [1..100,1..100] of Extended;
  Bx: array [1..100] of Extended

Procedure SrtStrok(N:Integer;Var A:Ax; Var B:Bx)

все работает отлично.

Может у кого есть литература по этому вопросу?

Это сообщение отредактировал(а) AndreyANM - 27.1.2006, 20:18
PM MAIL   Вверх
bems
Дата 27.1.2006, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



один раз Var можно если один тип и переменніе через запятую:
Var A,B:Bx
Но наверное тебе это не катит smile


--------------------
Обижено школьников: 8
PM MAIL   Вверх
nworm
Дата 27.1.2006, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 502
Регистрация: 22.10.2005

Репутация: нет
Всего: 8



В help-е написано, что

Цитата

Most procedure and function headers include a parameter list. For example, in the header

function Power(X: Real; Y: Integer): Real;

the parameter list is (X: Real; Y: Integer).

A parameter list is a sequence of parameter declarations separated by semicolons and enclosed in parentheses. Each declaration is a comma-delimited series of parameter names, followed in most cases by a colon and a type identifier, and in some cases by the = symbol and a default value. Parameter names must be valid identifiers. Any declaration can be preceded by var, const, or out (see Parameter semantics).


То есть надо писать перед каждой деларацией (в декларации могут быть разные переменные одного типа). В декларации процедуры SrtStrok надо писать var и перед A и перед B.
PM MAIL WWW   Вверх
SoWa
Дата 27.1.2006, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 2
Всего: 74



Var ведь пишется для того, чтобы процедура могла работать с этими переменными "глобально".
Достаточно один раз поставить Var, а потом перечислять переменные одного типа. Если сменился тип, то похоже снова надо писать Var. Но для нескольких переменных одного типа достаточно одного Var`a.


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
Guedda
Дата 27.1.2006, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 14
Всего: 78



Цитата(SoWa @ 27.1.2006, 21:18)
Var ведь пишется для того, чтобы процедура могла работать с этими переменными "глобально".
Достаточно один раз поставить Var, а потом перечислять переменные одного типа. Если сменился тип, то похоже снова надо писать Var. Но для нескольких переменных одного типа достаточно одного Var`a.

Если написать так:
Код

function MyFunction(var x : Integer; y : Integer) : Integer;

тогда x будет передаваться ссылочно, а y - фактически.
В общем, вот все, что можно:
Код

function MyFunction(var x, y, z : Integer; var s : string; var u : string) : Integer;



--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
AndreyANM
Дата 27.1.2006, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 4.1.2006

Репутация: нет
Всего: нет



Спасибо всем, я с самого начала так и понял, просто хотелось немного уточнить.
Добавлено @ 21:26
Да, кстати, я правильно думаю, что переменные после слова Var предаются с помощью указателей?
PM MAIL   Вверх
Guedda
Дата 27.1.2006, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 14
Всего: 78



Ну, не совсем так...
Эти переменные ссылаются на область памяти, в которой она находится.


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
bems
Дата 27.1.2006, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Цитата(AndreyANM @ 27.1.2006, 21:24 Найти цитируемый пост)

я правильно думаю, что переменные после слова Var предаются с помощью указателей?

В общем-да. Но когда ты к ним обращаешся компилятор подразумевает ^ после имени переменной, поэтому ты и получаешь не указатель, а то куда он ссылается.

Благодаря этому можно удобнее вызывать API. Если на СИ функция так:
Код

DWORD RasEnumConnections(
    LPRASCONN lprasconn,    // buffer to receive connections data
    LPDWORD lpcb,    // size in bytes of buffer
    LPDWORD lpcConnections    // number of connections written to buffer
   );

то ты можешь так:
Код

function RasEnumConnections( 
  var lprasconn: RasConn;
  var lpcb,pcConnections: DWORD
): DWORD; stdcall;external 'rasapi32.dll' name 'RasEnumConnectionsA';


Это сообщение отредактировал(а) bems - 27.1.2006, 22:36


--------------------
Обижено школьников: 8
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0530 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.