![]() |
|
#21
|
||||
|
||||
![]() Цитата:
Переменная - это область оперативной памяти. Физически - просто набор триггеров. Если это integer - то это 4 байта, то есть 32 триггера. При указании переменной в VAR компилятор "придумает" (посчитает) для этой переменной адрес в памяти и при всех расчетах будет использовать его. То есть Код:
a := b + c; Код:
Взять число, лежащее по посчитанному компилером адресу b, прибавить число, лежащее по адресу c и запихнуть в адрес a. Вариант один: динамический массив. То есть программа получает адрес начала куска памяти, где хватит места на N переменных (где N например число файлов в папке), и считает, что это куча переменных, идущих подряд. Для доступа к любой можно взять начало, прибавить номер переменной, умноженный на ее размер в байтах, и получить адрес нужной тебе. Вариант два: динамический список. Программа выделяет место под одну переменную, где будут храниться сами данные и адрес следующей переменной, под которую тоже выделится память, где тоже будут храниться данные и адрес,... Вариант три: динамический массив указателей. Для переменных небольшого размера смысла не имеет. Других вариантов в голову не приходит. Не зная таких элементарных вещей, как работа с памятью, не зная, что такое переменная и тому подобное, вам никогда не написать хорошую программу. Так что повторю в N+1 раз - Ч И Т А Й Т Е _ К Н И Г И . Там все есть. По поводу косяков в других языках: язык - лишь абстракция. Набор правил. Любой язык, даже скриптовый, в конечном итоге сводится к выполнению машинных команд процессором. Процессор не знает ни про переменные, ни про массивы. И ему наплевать, что там городить будешь - ему скажи адрес, откуда брать, и адрес, куда класть. Переменные и массивы - это абстракции. Даже если язык будет поддерживать абстракцию "создания переменных по ходу работы", она будет реализована либо через те же списки, либо через те же массивы, либо чем-то подобным. А теперь немного offtop'а: По поводу Цитата:
Как показывает практика, делфа, не мудрствуя лукаво, подряд идущие глобальные переменные в памяти тоже использует как подряд идущие. Для локальных не проверял. Следовательно, доступ к любой из них можно получить так: Код:
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. |