Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
  #21  
Старый 11.01.2012, 18:55
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
Я надеюсь в других языках программирования подобного косяка нету. Такого же не может быть в целом у всех.
Мда... Ну повторяешь людям хоть 200 раз: "Читайте книги!" - и ведь все равно даже не откроют. А если бы прочитали хоть одну толковую книгу (хоть ту же "библию делфи") таких вопросов бы не возникало.
Переменная - это область оперативной памяти. Физически - просто набор триггеров. Если это integer - то это 4 байта, то есть 32 триггера. При указании переменной в VAR компилятор "придумает" (посчитает) для этой переменной адрес в памяти и при всех расчетах будет использовать его. То есть
Код:
a := b + c;
У тебя превратится в
Код:
Взять число, лежащее по посчитанному компилером адресу b, прибавить число, лежащее по адресу c и запихнуть в адрес a.
А теперь подумай: как можно сделать переменные по ходу? Да еще и работать с ней? Код-то один раз скомпилировался и все.
Вариант один: динамический массив. То есть программа получает адрес начала куска памяти, где хватит места на N переменных (где N например число файлов в папке), и считает, что это куча переменных, идущих подряд. Для доступа к любой можно взять начало, прибавить номер переменной, умноженный на ее размер в байтах, и получить адрес нужной тебе.
Вариант два: динамический список. Программа выделяет место под одну переменную, где будут храниться сами данные и адрес следующей переменной, под которую тоже выделится память, где тоже будут храниться данные и адрес,...
Вариант три: динамический массив указателей. Для переменных небольшого размера смысла не имеет.
Других вариантов в голову не приходит.

Не зная таких элементарных вещей, как работа с памятью, не зная, что такое переменная и тому подобное, вам никогда не написать хорошую программу. Так что повторю в N+1 раз - Ч И Т А Й Т Е _ К Н И Г И . Там все есть.

По поводу косяков в других языках: язык - лишь абстракция. Набор правил. Любой язык, даже скриптовый, в конечном итоге сводится к выполнению машинных команд процессором. Процессор не знает ни про переменные, ни про массивы. И ему наплевать, что там городить будешь - ему скажи адрес, откуда брать, и адрес, куда класть. Переменные и массивы - это абстракции. Даже если язык будет поддерживать абстракцию "создания переменных по ходу работы", она будет реализована либо через те же списки, либо через те же массивы, либо чем-то подобным.

А теперь немного offtop'а:
По поводу
Цитата:
Можно ли так же сделать в не массива?
Очень ненадежный вариант, например в VS он частенько не работает, который нельзя юзать в готовой программе, но все же...
Как показывает практика, делфа, не мудрствуя лукаво, подряд идущие глобальные переменные в памяти тоже использует как подряд идущие. Для локальных не проверял.
Следовательно, доступ к любой из них можно получить так:
Код:
type PInt = ^Integer;
var a0, a1, a2, a3, a4: integer;
...
PInt((DWORD)(@a0)+sizeof(integer)*i)^:=123;

Так что ответ: можно. Но не нужно.
Самое интересное, что на деле это почти не отличается от записи
var a:array[0..4] of integer;
...
a[i]:=123;
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 11.01.2012 в 23:12.
Ответить с цитированием
 


Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:43.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025