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

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

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

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

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

Результаты опроса: Функции имеют право изменять содержимое глобальных переменных?
Да 39 86.67%
Нет 4 8.89%
Не знаю 2 4.44%
Голосовавшие: 45. Вы ещё не голосовали в этом опросе

Ответ
 
Опции темы Поиск в этой теме
Старый 14.04.2010, 15:43   #61
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
или в твоей функции "протечет память" ...
Где протечет?
Код:
  type q=array[1..10] of integer;
  procedure aga(t:q);
   begin
     t[3]:=88;
   end;

   var e:q;
begin
 aga(e);
  { TODO -oUser -cConsole Main : Insert code here }
end.
Ану угадай что передается в функцию...
А если не догадаешся - открой CPU отладчик и посмотри.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.04.2010, 12:07   #62
svbezm
Форумчанин
 
Регистрация: 02.04.2010
Сообщений: 104
По умолчанию

Милок t:q в параметрах процедуры и есть ничто иное как длинный указатель на массив q, так что здесь, естественно не протече ...
Если есть желание посмотреть как происходит , включи опцию компилятора генерить ASM листинг.

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

Последний раз редактировалось Stilet; 15.04.2010 в 12:45.
svbezm вне форума Ответить с цитированием
Старый 15.04.2010, 12:37   #63
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Сообщение от svbezm Посмотреть сообщение
Из пожеланий :
неплохо бы в компиляторе иметь 2 режима компиляции и интерпритации.
А это интерпретатор, поэтому ему можно только пожелать компиляцию . И второе, там такие операции, которые компилировать неудобно (увлекся функциональным программированием).

Цитата:
Любая функция всегда является ничем иным , как указателем на свое имя...
получается ссылка на адрес где содержится указатель массива или переменной.
Не любая, есть Inline. И не получается ссылки на указатель индекса массива или переменной, не надо выворачивать, если не видели кода. Функция возвращает именно значение переменной, а не указатель на переменную и не индекс массива. Разница огромна и как я уже говорил манипуляциями с указателями Вы доступ к переменной не получите не из программы для интерпретатора (там отсутствуют такие операции) не из самого интерпретатора. Максимум Вы можете получить указатель на результат функции по получению значения переменной по ее имени.
Переменные содержится в специальном хранилище, а это экземпляр класса и доступ к его полям исключительно через его методы и никак иначе.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 15.04.2010, 12:47   #64
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
svbezm
Во-первых: Я тебе не милок.
Во-вторых: ты сам же себя опровергнул словами "естественно не протече"

Вывод: Ты тролль.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.04.2010, 16:02   #65
svbezm
Форумчанин
 
Регистрация: 02.04.2010
Сообщений: 104
По умолчанию

Вот простейший пример того о чем я хотел сказать
исходный си-код заремлен ;
на нем четко видно что реальная программа работает с указателем
byte ptr DGROUP:,
а для пользователей си сделан внизу небольшой преобразователь
значение для public имен переменных.
Придумал это не я, это делает компилятор BC31, так что господа программисты все претензии ,если что не так к BORLAND.

Код:
_TEXT   segment byte public 'CODE'
_TEXT   ends
DGROUP  group   _DATA,_BSS
        assume  cs:_TEXT,ds:DGROUP
_DATA   segment word public 'DATA'
d@      label   byte
d@w     label   word
_DATA   ends
_BSS    segment word public 'BSS'
b@      label   byte
b@w     label   word
_BSS    ends
_DATA   segment word public 'DATA'
   ;    char a=6 ;
_a      label   byte
        db      6
   ;    char b=7 ;
_b      label   byte
        db      7
_DATA   ends
_TEXT   segment byte public 'CODE'
   ;
   ;    void main (void)
   ;
        assume  cs:_TEXT
_main   proc    near
   ;
   ;    {
   ;
   ;
   ;    b=b+a  ;
   ;
        mov     al,byte ptr DGROUP:_b
        add     al,byte ptr DGROUP:_a
        mov     byte ptr DGROUP:_b,al
   ;
   ;    }
   ;
        ret
_main   endp
_TEXT   ends
_DATA   segment word public 'DATA'
s@      label   byte
_DATA   ends
_TEXT   segment byte public 'CODE'
_TEXT   ends
        public  _main
        public  _b
        public  _a
_s@     equ     s@
        end

Последний раз редактировалось Stilet; 15.04.2010 в 16:20.
svbezm вне форума Ответить с цитированием
Старый 15.04.2010, 16:08   #66
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

В том то и дело, что это простейший пример. А в данном случае? Как программа работает с полями экземпляров классов? Тем более в Дельфи?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 15.04.2010, 16:29   #67
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
Код:
 type q=array[1..10] of integer;
  procedure aga(t:q);
   begin
     t[3]:=88;
   end;

   var e:q;
begin
 aga(e);
  { TODO -oUser -cConsole Main : Insert code here }
end.
Что-то мне кажется или правда тут слоны через стек бегают?
Код:
 type q=array[1..10] of integer;
  procedure aga(var t:q);
   begin
     t[3]:=88;
   end;

   var e:q;
begin
 aga(e);
  { TODO -oUser -cConsole Main : Insert code here }
end.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 15.04.2010, 16:49   #68
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
В том то и дело, что это простейший пример. А в данном случае? Как программа работает с полями экземпляров классов? Тем более в Дельфи?
Не знаю как там в делфи, а в С++ вроде бы работа с полями идёт через указатели.
Допустим есть такой класс:
Код:
class A
{
public:
  int i;
  int j;
}
...
A a;
a.i = 10; // работа с a.i и с a.j идёт как с обычными переменными
a.j = 20;
Компилятор знает, что i смещено на 0 байт, относительно начала объекта, а j - на 4 байта. Соответственно вместо a.i будет работа с переменной по адресу адрес объекта а + смещение до соответствующего поля.
Не понимаю правда как наличие указателей на низком уровне влечет за собой необходимость в них на высоком. Так же не вижу причин в утечках памяти и обязательности копирования огромных массивов на каждый чих при отсутствии указателей в языке программирования. Взять те же делфи, в ООП нет необходимости в использовании указателей. В C# указателей нет (если конечно их спецом не подключить), но объекты не копируются, т.к. передаются по умолчанию по ссылке.
Да и скорость копирования зависит от реализации. Если грамотную "выделялку" памяти написать + сборщик мусора + какие-то оптимизации, то программа может работать не медленнее С++, а может и быстрее. ООП (создание экземпляров классов, доступ к методам,...) в C#, судя по всяким тестам, работает быстрее, чем в С++.
pu4koff вне форума Ответить с цитированием
Старый 15.04.2010, 17:44   #69
akasex
Форумчанин Подтвердите свой е-майл
 
Аватар для akasex
 
Регистрация: 31.03.2008
Сообщений: 179
По умолчанию

Код:
class Foo
{
      static int MyParam = 10;

      //Function - not allowed to change static field... 
      int CalcSomething(int value)
      {
            return (value + Foo.MyParam);
      }

      //Procedure - may be allowed to change static field...
      void DoSomething(int value)
      {
            Foo.MyParam = (value > 0) ? 5 : 10;
      }
}
akasex вне форума Ответить с цитированием
Старый 16.04.2010, 07:27   #70
svbezm
Форумчанин
 
Регистрация: 02.04.2010
Сообщений: 104
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
В том то и дело, что это простейший пример. А в данном случае? Как программа работает с полями экземпляров классов? Тем более в Дельфи?
Я лишь хотел сказать 2 вещи :
1.
переменные , массивы , функции , структуры, классы языков высокого уровня являются указателями на низком уровне.

2. если перменная невидима в данной функции или классе доступ к ней можно организовать через длинный asm указатель на ассемлерной вставке, необходимо только помнить, что на ассемблере
она будет иметь имя с _ впереди например name , будет _name, а
name[3] будет _name + 3.
Перед именем должны следовать размерность byte (или word , dword)
и далее символ указателя ptr ...
svbezm вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
присвоить из бд переменным akimov_aleks БД в Delphi 6 07.04.2010 08:24
Построение графиков функций С++ (методы аппроксимации функций) amdbodia Общие вопросы C/C++ 0 24.05.2009 15:28
использование функций в качестве параметров других функций mono Помощь студентам 0 20.04.2009 18:25
проблема с глобальным объектом Selebro Общие вопросы C/C++ 3 26.11.2008 20:22
Доступ к переменным RealSHELS Общие вопросы Delphi 4 15.06.2008 13:14