Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Многомерный динамический массив


Автор: Radist121079 7.6.2006, 09:10
Здравствуйте...
         Помогите пожалуйста, как удалить из многомерного массива указанный столбец или строку?

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

Спасибо! 

Автор: Yanis 7.6.2006, 09:14
Цитата(Radist121079 @  7.6.2006,  10:10 Найти цитируемый пост)
может там ощибки есть

Может быть. Ты напиши, что тебя не устраивает в своей реализации. 

Автор: Radist121079 7.6.2006, 09:39
В моей версии, при удалении из массива с двумя столбцами возникает ощибка...
и я понятия не имею как удалять строку из массива 

Автор: Yanis 7.6.2006, 09:48
Цитата(Radist121079 @  7.6.2006,  10:39 Найти цитируемый пост)
В моей версии, при удалении из массива с двумя столбцами возникает ощибка...
и я понятия не имею как удалять строку из массива  

Во первых тебе нужно сначала его создавать, что бы было к чему обращаться. Поотому что 
Код
fArray: array of array of Byte;

по сути пустое место, пока ему не задашь длину. Длину наверное можно к конструктору прикрутить. Тогда конструктор будетиметь приблизительно такой вид:
Код
constructor Create(Width, Height: Byte);
{ ... }
constructor TArray.Create(Width, Height: Byte);
begin
  SetLength(fArray, Width, Height);
end;
  

Автор: skyboy 7.6.2006, 09:49
А зачем тебе такие проблемы? Реализовал бы хранение в списке списков... А RowCount/ColCount хорошо бы сделать не только читаемыми, но и "писаемыми", с забивкой создаваемых ячеек каким-нить "значением по умолчанию"... 

Автор: Yanis 7.6.2006, 09:50
А деструктор это вообще шедевр smile нужно же за собой убирать то, что намусорили... Значит переделываем деструктор:
Код
destructor TArray.Destroy;
begin
  SetLength(fArray, 0, 0);
end;
 

Автор: Radist121079 7.6.2006, 10:07
Конечно, я не пытаюсь не удалять что то не создавая!
Код

procedure TArray.SetRowCol(Col, Row: Integer);
begin
  SetLength(fArray,Col,Row);
end;

процедуру я так назвал потому что мне придется много раз менять размер массива, не буду же я каждый раз вызывать метод Create, они у меня остались как мусор smile, а медот SetRowCol он более понятен на мой взгляд..., а то что в методе Destroy написано - это я эксперименторовал, а потом про это забыл...

А собственно на мой вопрос то вы ребята не ответили.....   

Автор: Yanis 7.6.2006, 10:16
Цитата(Radist121079 @  7.6.2006,  11:07 Найти цитируемый пост)
не буду же я каждый раз вызывать метод Create

И не надо. Но было бы логичнее созавать массив не пустой. А потом по мере надобности менять его размеры.

Цитата(Radist121079 @  7.6.2006,  11:07 Найти цитируемый пост)
а медот SetRowCol он более понятен на мой взгляд...

Я бы переименовал в SetArraySize. 

Автор: Radist121079 7.6.2006, 10:39
да, я переименую именно так...
а можно ли класс без методов Create и Destroy создавать? 

Автор: Yanis 7.6.2006, 10:42
Цитата(Radist121079 @  7.6.2006,  11:39 Найти цитируемый пост)
а можно ли класс без методов Create и Destroy создавать?  

Можно. Они уже там есть. Только вызывать их всё равно придётся.... 

Автор: skyboy 7.6.2006, 11:00
Radist121079, шутник smile Задействовал динамическую структуру, а чистить память, занимаемой её, отказываешься smile А чем тебя конструкторы/деструкторы напрягают? 

Автор: Radist121079 7.6.2006, 13:02
Вообщето они меня не напрягяют, но я думаю не правильно будет каждый раз когда надо изменить размер массива вызывать конструктор..., но я думаю один раз создать, а потом вызывать 
Код

procedure TArray.SetArraySize(Col, Row: Integer);    
begin    
  SetLength(fArray,Col,Row);    
end;

 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)