|
#16
|
|||
|
|||
Один вопрос тогда. Как сделать это в массиве разобрались. Можно ли так же сделать в не массива? Указать имя переменную в Edit1 с которой будем работать?
Да/Нет |
#17
|
|||
|
|||
Создание переменных
Глобальный вопрос! Как создать переменную в процессе выполнения кода? Когда неизвестно число переменных. Я даже не знаю... Ну к примеру нужно будет создать такое количество переменных, сколько файлов в папке ну или что-то подобное, не важно.
|
#18
|
|||
|
|||
Цитата:
TList, TStringList, TObjectList, TCollection, ну и указатели. Просто создать переменную нельзя. Можно создать экземпляр объекта или указатель. Но тебе все-равно нужно где-то сохранять ссылку на этот кусок памяти. |
#19
|
|||
|
|||
Цитата:
Я надеюсь в других языках программирования подобного косяка нету. Такого же не может быть в целом у всех. |
#20
|
|||
|
|||
Цитата:
После компиляции информации об именах переменных в исполняемом коде не остаётся. Имеется похожий сервис для поиска компонент на форме по имени, см. справку по FindComponent; или для хранения и поиска строковых пар типа имя=значение используй TStringList. |
#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. |