Глобальные переменные

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Аватара пользователя
delimer
незнакомец
Сообщения: 2
Зарегистрирован: 11.02.2010 19:49:44

Глобальные переменные

Сообщение delimer »

Есть программа вида:

Код: Выделить всё

program test;

uses
   ...,
  unit1;

var
  ...;
  test:string;

begin
   test:='test';
end.


и модуль:

Код: Выделить всё

unit unit1;

interface

uses
  ...,
  ...;

procedure proc1(a:integer);
...;

implementation

procedure proc1(a:integer);
begin
   test:='123'; // тут выдает ошибку компиляции identifire not found
end;

end.


в делфи переменная тест была глобальной и можно было к ней обращаться в модулях, после переноса на лазарус выдает ошибку identifire not found. может что в настройках проекта или компиляции надо еще указать?
Reyko
новенький
Сообщения: 15
Зарегистрирован: 05.11.2009 22:48:12
Откуда: Магнитогорск

Сообщение Reyko »

delimer
У меня была такая проблема, решила тем, что создала отдельный модуль с описанием глобальных переменных и констант. Если не получиться настроить лазарус как надо, то это решение должно помочь.
P.S.:Кстати, если, все же настроишь лазарь, отпишись пожалуйста.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

delimer
Если вы добавляете модуль с объявлением глобальной переменной в любой другой в секцию uses, то данная переменная будет доступна и в этом модуле. Не знаю, что там в последних Дельфях придумали, но это спаведливо для стандарта языка Pascal!
alexrayne
постоялец
Сообщения: 125
Зарегистрирован: 03.12.2008 15:56:26

Сообщение alexrayne »

да нет, как раз как я понял, автор поста запользовл какуюто фичу дельфей которая поперек стандарта паскаля и вообще как телега как телега впереди лошади. я такое впринципе делаю на С, но и там надо както дать понять модулю, что есть такая глобальная переменная тест, в хеадере ето обычно делается.
тот пример который вы указали, я даже непонимаю как вообще компилятор может его компилить. что он должен использовать в качестве test при компиляции модуля? как я понимаю дельфа аутоматично подключает в uses модуль основной программы, но ето скрытая фича именно дельфи и она в стандарте реализована быть неможет.
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Если это так, то это полный бред! Весь базис паскаля основан на том, что перед тем что что-то использовать надо это объявить! А тут наоборот...
вобщето когдато был такой TMT паскаль, в нём подобная фишка была - но там надо было подключать основной модуль программы как обычный юнит (оно это хавало). В общем - маразм! Правильно проектируйте программы - и такого ... не надо будет делать.
Аватара пользователя
delimer
незнакомец
Сообщения: 2
Зарегистрирован: 11.02.2010 19:49:44

Сообщение delimer »

Спасибо за ответы. Решил все это вынесением переменных в модуль. До этого писал все время на делфи и привык применять такие переменные (про то, что это не предусмотрено стандартом паскаля даже и не знал).
Андрей Головин
незнакомец
Сообщения: 2
Зарегистрирован: 13.10.2005 18:24:15

Сообщение Андрей Головин »

Если имя модуля совпадает с именем переменной как в примере, обращаться к ней из других модулей надо как test.test
Это немного не о том, но сам недавно споткнулся, может пригодится при переносе переменных в модуль.
SAK
постоялец
Сообщения: 158
Зарегистрирован: 17.02.2006 23:45:14
Откуда: Тим
Контактная информация:

Сообщение SAK »

delimer писал(а):... До этого писал все время на делфи и привык применять такие переменные ...

Если не секрет какой версии Delphi? В Delphi 7 такое точно не проходит.
TimK
новенький
Сообщения: 16
Зарегистрирован: 13.01.2010 05:26:49

Сообщение TimK »

Вы обращаетесь из unit1 к переменной основного модуля программы. Это нельзя делать ни в дельфе не в FPC, ни в прочих паскалях. И с настройками лазаруса это никак не связано - нет таких. На самом деле ваша переменная не глобальная, а локальная переменная процедуры PascalMain - точки входа программы. Задекларируйте ее в unit1, в основном модуле она будет тоже видна ибо он (unit1) есть в uses. PS: пределах модуля нельзя декларировать имена совпадающие с его именем.
Ответить