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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 29.11.2012, 12:11
Аватар для morebeauty
morebeauty morebeauty вне форума
Начинающий
 
Регистрация: 21.06.2012
Сообщения: 106
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию record'ы и массивы

Есть композиция:
Код:
type
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;

var
FCount:integer;

***

constructor TClass.Create(Count:integer);
begin
FCount := Count;
end;
само собой оно не пашет, жалуясь на строку 2. Но, думаю, смысл написанного ясен. Как решить сию проблему БЕЗ ИСПОЛЬЗОВАНИЯ динамического массива TStringArray + SetLength(FRecs[i].Vars,a).
Ответить с цитированием
  #2  
Старый 29.11.2012, 12:13
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

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

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

О как! С трудом в это верится. Может есть и другие мнения?
Ответить с цитированием
  #4  
Старый 29.11.2012, 12:20
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от morebeauty
Есть композиция:
Код:
.....
var
FCount:integer;

***

constructor TClass.Create(Count:integer);
begin
FCount := Count;
end;
А почему FCount сделана глобальной переменной?
Цитата:
Сообщение от morebeauty
Как решить сию проблему БЕЗ ИСПОЛЬЗОВАНИЯ динамического массива TStringArray + SetLength(FRecs[i].Vars,a).
А на чём основано ограничение на использование динамических массивов?
А по вопросу - record не может быть переменной длины.
Ответить с цитированием
  #5  
Старый 29.11.2012, 12:43
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
Радость

Код:
type
  TRec = record
    Var1: string;
    Memo1: TMemo;
  end;
__________________
>woweook<
Ответить с цитированием
  #6  
Старый 29.11.2012, 12:43
Аватар для morebeauty
morebeauty morebeauty вне форума
Начинающий
 
Регистрация: 21.06.2012
Сообщения: 106
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
А почему FCount сделана глобальной переменной?
Ну это очепятка. Пусть она будет в private класса.

Цитата:
А на чём основано ограничение на использование динамических массивов?
На нежелании каждый раз вызывать SetLength. Это мелочь, но из таких мелочей и формируется скорость работы приложения. Не так ли?

Цитата:
А по вопросу - record не может быть переменной длины.
Если посмотреть внимательнее, там array of record.


Pyro, использовать TMemo, TStrings или TStringList в данном случае неактуально. Мне не нужен набор методов и переменных данных классов. Зачем зря утяжелять? )

Последний раз редактировалось morebeauty, 29.11.2012 в 12:46.
Ответить с цитированием
  #7  
Старый 29.11.2012, 12:54
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

Цитата:
Сообщение от morebeauty
Зачем зря утяжелять? )
тогда придётся зря усложнять...
__________________
>woweook<
Ответить с цитированием
  #8  
Старый 29.11.2012, 12:57
Аватар для morebeauty
morebeauty morebeauty вне форума
Начинающий
 
Регистрация: 21.06.2012
Сообщения: 106
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

А что если record переделать в класс?
Ответить с цитированием
  #9  
Старый 29.11.2012, 13:11
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

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

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

Цитата:
Сообщение от morebeauty
Цитата:
А по вопросу - record не может быть переменной длины.
Если посмотреть внимательнее, там array of record.
Это массив record-ов у тебя переменной длины (так как динамический массив), я же говорил о самом содержимом record-а. Ты пытаешься впихнуть в record массив переменной длины, а соответственно record тоже должен автоматически менять свой размер в зависимости от этого массива - в таком виде это невозможно.
В общем то и массивов переменной длины в Delphi нет - либо статические, либо динамические.
Ответить с цитированием
  #11  
Старый 30.11.2012, 04:41
Аватар для morebeauty
morebeauty morebeauty вне форума
Начинающий
 
Регистрация: 21.06.2012
Сообщения: 106
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Код:
В общем то и массивов переменной длины в Delphi нет - либо статические, либо динамические.
Я знаю. Мне не нужен массив переменной длинны, мне нужен статический массив от константы. Вот только саму константу неплохо было бы определить как нибудь... эээ... раньше...
Ответить с цитированием
  #12  
Старый 30.11.2012, 04:45
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от morebeauty
Код:
В общем то и массивов переменной длины в Delphi нет - либо статические, либо динамические.
Я знаю. Мне не нужен массив переменной длинны, мне нужен статический массив от константы. Вот только саму константу неплохо было бы определить как нибудь... эээ... раньше...
Ну если "статический массив от константы", то это легко делается :
Код:
const
  FCount = 10;
type
TStringArray = array[0..FCount-1] of string;
Ответить с цитированием
  #13  
Старый 30.11.2012, 07:17
Аватар для morebeauty
morebeauty morebeauty вне форума
Начинающий
 
Регистрация: 21.06.2012
Сообщения: 106
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Код:
Ну если "статический массив от константы", то это легко делается
Ага. Вот только константу бы мне как то определить при создании класса... )))
Ответить с цитированием
  #14  
Старый 30.11.2012, 07:19
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от poli-smen
Ну если "статический массив от константы", то это легко делается :
Код:
const
  FCount = 10;
type
TStringArray = array[0..FCount-1] of string;

Вопрос, а чем тебя не устраивает что-то типа:
Код:
type
  TMyClass = class
  privatre
    FCount : Integer;
    A : Array Of String;
  public
    constructor Create(ACount : Integer); virtual;

    property Count : Integer read FCount;
  end;

constructor TMyClass.Create(ACount : Integer);
begin
  FCount := ACount;
  SetLength(A,FCount);
end;

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

Цитата:
Если FCount потом не меняется, задается через конструктор, то один вызов SetLength погоды не делает и на производительности сильно не скажется.
В том и фишка, что НЕ ОДИН вызов.

Код:
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 раз
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter