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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 28.11.2011, 14:45
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию

Один вопрос тогда. Как сделать это в массиве разобрались. Можно ли так же сделать в не массива? Указать имя переменную в Edit1 с которой будем работать?
Да/Нет
Ответить с цитированием
  #17  
Старый 06.01.2012, 19:58
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию Создание переменных

Глобальный вопрос! Как создать переменную в процессе выполнения кода? Когда неизвестно число переменных. Я даже не знаю... Ну к примеру нужно будет создать такое количество переменных, сколько файлов в папке ну или что-то подобное, не важно.
Ответить с цитированием
  #18  
Старый 06.01.2012, 20:24
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от Kaktuz
Глобальный вопрос! Как создать переменную в процессе выполнения кода? Когда неизвестно число переменных. Я даже не знаю... Ну к примеру нужно будет создать такое количество переменных, сколько файлов в папке ну или что-то подобное, не важно.


TList, TStringList, TObjectList, TCollection, ну и указатели.
Просто создать переменную нельзя. Можно создать экземпляр объекта или указатель. Но тебе все-равно нужно где-то сохранять ссылку на этот кусок памяти.
Ответить с цитированием
  #19  
Старый 06.01.2012, 20:43
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Просто создать переменную нельзя. Можно создать экземпляр объекта или указатель. Но тебе все-равно нужно где-то сохранять ссылку на этот кусок памяти.
Эээ... Ммм... Это как так?
Я надеюсь в других языках программирования подобного косяка нету. Такого же не может быть в целом у всех.
Ответить с цитированием
  #20  
Старый 11.01.2012, 11:33
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Цитата:
Сообщение от Kaktuz
Нет. Я о том что если будет другой тип переменных?
Код:
var
  Form1: TForm1;
  var x,a1,a2,a3 : string;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
x:=Edit1.Text;
ShowMessage(a[x]);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
a1:='1';
a2:='2';
a3:='3';
end;
В данном случае, ответ - никак.
После компиляции информации об именах переменных в исполняемом коде не остаётся.
Имеется похожий сервис для поиска компонент на форме по имени, см. справку по FindComponent; или для хранения и поиска строковых пар типа имя=значение используй TStringList.
Ответить с цитированием
  #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.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter