Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.03.2008, 17:47   #1
Adzumi
Новичок
Джуниор
 
Регистрация: 29.03.2008
Сообщений: 1
По умолчанию переменные Turbo Pascal

подскажите пожалуйста
описывая переменную в основной программе, а затем "переописывая" её в подпрограмме (функции например), можно ли в этой функции сослаться на ту глобальную переменную, которую описывали в основной программе? как это сделать?
Adzumi вне форума Ответить с цитированием
Старый 29.03.2008, 18:20   #2
SunKnight
Участник клуба Подтвердите свой е-майл
 
Аватар для SunKnight
 
Регистрация: 14.12.2007
Сообщений: 1,434
По умолчанию

Цитата:
подскажите пожалуйста
описывая переменную в основной программе, а затем "переописывая" её в подпрограмме (функции например), можно ли в этой функции сослаться на ту глобальную переменную, которую описывали в основной программе? как это сделать?
Чтото я непонял. Зачем такое делать, переописывать? Это пахнет конфликтом переменных. Легче новую переменную создать в функции.
Проповедую design patterns, верую в MVC, доверяю eXtrime programming.
SunKnight вне форума Ответить с цитированием
Старый 29.03.2008, 19:13   #3
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

Вы имеете в виду:
Код:
Var S:string;
      I:integer;
begin
S:='qwe';
I:=123;
...
function asd:string;
Var S:integer;
      I:Real;
begin
S:=456;
I:=5.2;
end;

Writeln(S); // S строка или число?
end;
Если что-то подобное, то переменные в функции никак не относятся к глобальным переменным. А Write выведет строку "qwe".
Сослаться в самой функции не получится, т.к. эта же переменная определена "ближе" чем та первая.
Если Вам нужно сослаться на глобальную переменную, то её нигде (в функциях) не используйте, если ссылаться не придётся, то можно.
Всё гениальное - просто!

Последний раз редактировалось Air; 29.03.2008 в 19:19.
Air вне форума Ответить с цитированием
Старый 29.03.2008, 19:18   #4
SunKnight
Участник клуба Подтвердите свой е-майл
 
Аватар для SunKnight
 
Регистрация: 14.12.2007
Сообщений: 1,434
По умолчанию

тут скорее так:
Код:
Var S:string;   
      I:integer;   
begin   
S:='qwe';   
I:=123;   
...   
function asd:string;   
Var S:integer;   
      I:string;   
begin   
S:=456;   
I:=S;// S глобальная   
end;   
end;
Проповедую design patterns, верую в MVC, доверяю eXtrime programming.
SunKnight вне форума Ответить с цитированием
Старый 29.03.2008, 19:20   #5
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

Нет так не прокатит.
Код:
function asd:string;     
Var S:integer;     
      I:string;     
begin     
S:=456;     
I:=S; //S глобальная    Сдесь будет ошибка типов, это очевидно
end;     
end;
Описанные внутри функции переменные, не имеют ни какого отношения к глобальным, даже если имена совпадают.
Всё гениальное - просто!

Последний раз редактировалось Air; 29.03.2008 в 19:25.
Air вне форума Ответить с цитированием
Старый 29.03.2008, 19:27   #6
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Можно явно указать модуль, в котором объявлена глобальная переменная

Код:
program Project1;
{$APPTYPE CONSOLE}

uses Windows;

var S:String;

procedure test;
var S:String;
var S2:String absolute Project1.S;
begin
   S := 'local string';
   writeLn(Project1.S);  // global string
   writeLn(S2);          // global string
   writeLn(S);           // local string;
end;

begin
   S := 'global String';
   test;
   readln;
end.
Особенно интересно использование absolute вот здесь.
Хотя проще изменить имена.

Код:
procedure TForm1.StringGrid1SelectCell(Sender: TObject; Col, Row: Integer;
  var CanSelect: Boolean);
var lCol : integer absolute Col;
    A, B:integer;
begin
   with StringGrid1 do begin
      A := Col;   // StringGrid1.Col
      B := lCol;  // col из параметров
   end;
end;
alexBlack вне форума Ответить с цитированием
Старый 29.03.2008, 19:42   #7
SunKnight
Участник клуба Подтвердите свой е-майл
 
Аватар для SunKnight
 
Регистрация: 14.12.2007
Сообщений: 1,434
По умолчанию

alexBlack, ТУРБО ПАСКАЛЬ. в делфи вообще можно так:
Код:
pablic
a:integer;
end;
.....
function aaa:integer;
var z;integer;
begin
z:=Form1.a;
end;
Проповедую design patterns, верую в MVC, доверяю eXtrime programming.
SunKnight вне форума Ответить с цитированием
Старый 29.03.2008, 20:11   #8
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Мне казалось, что уточнение unit1.<переменная> работает и в BP.
Цитата из BP manual:

Цитата:
Каждый модуль в операторе uses определяет свою область действия, которая охватывает остальные модули и программу в целом.
Первый модуль в операторе uses представляет самую внешнюю область
действия, а последний модуль представляет самую внутреннюю область
действия. Это означает, что если два или более модулей содержат описание одного и того же идентификатора, то при неуточненном обращении к этому идентификатору будет выбран тот вариант, который был описан в последнем модуле в операторе uses. Однако, вы можете выбрать любой вариант этого идентификатора, указав уточненный идентификатор.
Хотя может я ошибаюсь. Давно не писал в BP.
alexBlack вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Массив (Turbo Pascal) Wizzard Помощь студентам 2 20.01.2008 09:59
как написать DLL на Turbo Pascal? mofr Паскаль, Turbo Pascal, PascalABC.NET 4 26.02.2007 18:35