Цитата:
Я надеюсь в других языках программирования подобного косяка нету. Такого же не может быть в целом у всех.
|
Мда... Ну повторяешь людям хоть 200 раз: "Читайте книги!" - и ведь все равно даже не откроют. А если бы прочитали хоть одну толковую книгу (хоть ту же "библию делфи") таких вопросов бы не возникало.
Переменная - это область оперативной памяти. Физически - просто набор триггеров. Если это integer - то это 4 байта, то есть 32 триггера. При указании переменной в VAR компилятор "придумает" (посчитает) для этой переменной адрес в памяти и при всех расчетах будет использовать его. То есть
У тебя превратится в
Код:
Взять число, лежащее по посчитанному компилером адресу 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;