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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 30.11.2012, 08:42
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Цитата:
Сообщение от morebeauty
В том и фишка, что НЕ ОДИН вызов.

Код:
TStringArray = array[0..FCount-1] of string;
 
TRec = record
Var1:string;
Vars:TStringArray;
end;
 
TRecs = array of TRec;
 
TClass = class
private
FRecs:TRecs;
public
constructor Create(Count:integer);
end;

Для того, чтобы задать размер TStringArray, к нему придется обращаться через TRecs = array of TRec;... То есть SetLength (FRecs.[i(от 0 до B)].Vars,A); то есть SetLength будет вызвано B раз
И что с того?
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #17  
Старый 30.11.2012, 11:57
Аватар для morebeauty
morebeauty morebeauty вне форума
Начинающий
 
Регистрация: 21.06.2012
Сообщения: 106
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
И что с того?
Я не пишу ПО для калькуляторов, но у одного из будущих пользователей программы реально динозавр с кнопками!

Функционал проги должен быть примерно как у 1С. Использовать 1С при этом начальство отказалось.
Так как программер я не ахти, чую прога получится тяжелая для понимания компьютером )
Вот и пытаюсь сделать все для облегчения сразу... Чтобы потом не переделывать много в этом направлении )
Ответить с цитированием
  #18  
Старый 30.11.2012, 12:55
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Не в тех местах ты экономишь.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #19  
Старый 01.12.2012, 06:11
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от morebeauty
В том и фишка, что НЕ ОДИН вызов.

Код:
TStringArray = array[0..FCount-1] of string;
 
TRec = record
Var1:string;
Vars:TStringArray;
end;
 
TRecs = array of TRec;
 
TClass = class
private
FRecs:TRecs;
public
constructor Create(Count:integer);
end;

Для того, чтобы задать размер TStringArray, к нему придется обращаться через TRecs = array of TRec;... То есть SetLength (FRecs.[i(от 0 до B)].Vars,A); то есть SetLength будет вызвано B раз
И всё же я не пойму: FCount у тебя константа или не константа?
Константа это то, что жёстко задано ещё при компиляции программы. Если так, то TStringArray у тебя становится статическим массивом и не нужно никаких SetLength(FRecs.[i].Vars,A)
Если же FRecs изменяется в процессе работы программы, то это никакая не константа, из чего вытекает использование динамических массивов, SetLength и т.п.
Другими словами, если компилятор знает размер массива, то работу по распределению памяти под этот массив он берёт на себя, если же не знает, тогда придётся "вручную" SetLength, GetMem и т.п. Одно из двух - а как же иначе?
Ответить с цитированием
  #20  
Старый 03.12.2012, 04:52
Аватар для morebeauty
morebeauty morebeauty вне форума
Начинающий
 
Регистрация: 21.06.2012
Сообщения: 106
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Не в тех местах ты экономишь.
Экономлю везде где могу.

Цитата:
И всё же я не пойму: FCount у тебя константа или не константа?
Константа это то, что жёстко задано ещё при компиляции программы. Если так, то TStringArray у тебя становится статическим массивом и не нужно никаких SetLength(FRecs.[i].Vars,A)
Если же FRecs изменяется в процессе работы программы, то это никакая не константа, из чего вытекает использование динамических массивов, SetLength и т.п.
Другими словами, если компилятор знает размер массива, то работу по распределению памяти под этот массив он берёт на себя, если же не знает, тогда придётся "вручную" SetLength, GetMem и т.п. Одно из двух - а как же иначе?
FCount у меня - некая переменная, передаваемая конструктору при создании класса. В этот момент и должен определяться размер TStringArray. Один раз при создании объекта класса.
Я уже сделал через SetLength, но вопрос не решен.

Я помню в бейсике объявить переменную/массив можно было в любой части программы. Понимаю, паскаль не бейсик, но, возможно, есть какие-либо ухищрения.
Ответить с цитированием
  #21  
Старый 03.12.2012, 07:02
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от morebeauty
Я помню в бейсике объявить переменную/массив можно было в любой части программы. Понимаю, паскаль не бейсик, но, возможно, есть какие-либо ухищрения.

Есть, но ты там ничего по скорости не выиграешь. Я тебе дал код, который сразу один раз выделяет нужное кол-во памяти при вызове конструктора по переданному ему значению.

В принципе, можно использовать связанный список, храня указатели и на голову списка, и на хвост (для быстрого добавления новых ячеек). Однако все-равно распределение памяти под конкретную ячейку останется. Зато получишь долгий проход по списку для поиска конкретной ячейки.

А вообще, если пишешь нечто бугалтерское, то сам бог велел разобраться с базами данных (кстати, саму БД можно "выкинуть" на другую машину-сервер). Помнится, когда компы в массе были такие, что с трудом тянули NT, программа на Delphi на клиентской Win95/98 летала, хотя саму Delphi на такой комп ставить было бессмысленно - просто не хватило бы ресурсов для нормальной работы.

А так, по мне ты фигней занимаешься. Сначала напиши весь код, потом просто профайлером пройдешься и посмотришь где реально узкие места, вот там и будешь оптимизировать.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter