Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.22;
Скачать: CL | DM;

Вниз

Увеличение размера масива неизвестного типа?   Найти похожие ветки 

 
Erik   (2003-09-09 14:34) [0]

Как это сделать если соблюдается одно условие. Этот масив всегда типа Array of Myrecord; Myrecord - разумеется разный.
Передать можно как Pointer
IncArray(@MyArray);
А как в IncArray его увеличить?


 
Nikolay M. ©   (2003-09-09 14:35) [1]

Через sizeof (Myrecord)?


 
Skier ©   (2003-09-09 14:36) [2]

SetLength(...)
И не парься.


 
Erik   (2003-09-09 15:37) [3]

И как мне обявить параметр процедуры?
IncArray(Arr: Pointer)?
И тогда SetLength(Что Arr?!) это небудет работать!


 
Palladin ©   (2003-09-09 15:39) [4]

type
TMyArr=Array of чтото;

procedure IncArray(var Arr:TMyArr);


 
Erik   (2003-09-09 15:46) [5]

Блин, а же говорю что тип зарание неизвестен!!!!!!!!!!!!!!!!
Знаю только что это одномерный масив типа record, могу еще длинну передать в IncArray(Arr, SizeOf(MyType));
Есть у кого работающее решение?


 
Palladin ©   (2003-09-09 16:26) [6]

слушай, поизучай-ка основы языка с которым работаешь... Pascal называется и работу с указателями


 
Erik   (2003-09-09 16:58) [7]

Palladin
Это ты мне говориш? Ты хоть знаеш сколько я с ним работаю?
Если незнаеш или непонимаеш сути вопроса, то лучше просто промолчать.


 
Sandman25 ©   (2003-09-09 17:10) [8]

Посмотрите DynArraySetLength в System.pas, может вдохновит на что-нибудь.


 
Sandman25 ©   (2003-09-09 17:10) [9]

Даже, наверное, лучше посмотреть _DynArraySetLength


 
Erik   (2003-09-09 17:29) [10]

Я и хотел так сделать в начале, но потом подумал может кто уже знает. Лень делать уже известные вещи заного.


 
Sandman25 ©   (2003-09-09 17:36) [11]

Судя по названию процедуры, ее вызов можно заменить на
SetLength(Arr, Length(Arr) + 1) :)


 
Erik   (2003-09-09 17:59) [12]

Так приведения типов потребуется, а я его незнаю. Иначе Incompatible types.
Есди бы было так просто я бы неспрашивал.


 
HolACost! ©   (2003-09-09 19:47) [13]

Строй парсер на типа - и передавай строку, отображающую контент записи и запись в виде простого адреса! - и массив делай не от записи, а от Pointer например!


 
HolACost! ©   (2003-09-09 19:49) [14]

Да и кстати - сколькоВЫ с ним работаете?
Вопрос к посту в адрес Palladin`a


 
Chris   (2003-09-09 20:20) [15]

SetLength(Arr, High(Arr)+2); инкремент массива
if High(Arr)>-1 then SetLength(Arr,High(Arr)); декремент массива
и никакие привидения (и те и другие) тебе не страшны.


 
KSergey ©   (2003-09-10 08:36) [16]

> Erik

Лучше бы вопрос научился задавать понятно.
Не совсем понятна мне ситуация: увеличение размера массива - самоцель? Или зачем?
Вот почему вопрос.
Хорошо, положим есть некая функция, которая зачем-то увеличивает размер переденного ей массива. Но тп массива - не известен. А что тогда она с ним делает? Читает побайтно?


 
Erik   (2003-09-10 10:26) [17]

HolACost
Уже десять лет програмирую или чуток больше, на Delphi меньше. И не один десяток языков знаю.

KSergey
Могу обяснить зачем это надо, есть процедура сканируещая DataSet. Ей передаются DataSet и итератор(адрес процедуры вызываемой на каждую запись). Итератор разумеется разный, в основном заполняет масив с условиями. Масивы тоже разные, чтобы недергать менаджер памяти выделяю память кусками с шагом(по 20 элементов). Моэтому есть стандартная процедура увеличения размера массива. Мне нехочиться делать Copy/Paste, нелюблю такой стиль програмирования. Поэтому и возник вопрос. Но зачам все это описывать, когда вопрос сформулирован продельно ясно в заголовке. Может ты сможеш лучше сформулировать? :)


 
KSergey ©   (2003-09-10 11:08) [18]

делать Copy/Paste, нелюблю

Так это же основной подход! Особенно, если бы еещ платили за кол-во "порожденного" кода ;)

Я тут поразмышлял на тему что же вы не хотите Copy/Past"ить...
- итератор - так он всгда разный (раз разные типы записей в массивах)
- код изменения длины массива? Ну он не получается единым, раз массивы разного типа.

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

Тогда вызов

IncArray(@MyArray);

изменится на

SetLength (MyArray, MyCalcNewSize (Length(MyArray))));

Длиннее, конечно, но помятуя о copy/past... ;)


 
Erik   (2003-09-10 13:54) [19]

Действительно весьма неплохая конструкция, со стороны всегда лучше видно. А я как всегда модуль к проекту дописываю, подумать времеи нет. :(



Страницы: 1 вся ветка

Текущий архив: 2003.09.22;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.028 c
3-71529
SergeySh
2003-08-30 17:55
2003.09.22
Кто может возразить против Zeos и MSSQL?


1-71732
Unknown
2003-09-10 11:29
2003.09.22
Возможно ли в теле метода узнать его имя ?


14-71846
Kost
2003-09-01 14:38
2003.09.22
StringGird


1-71650
AVK2
2003-09-06 04:04
2003.09.22
2 варианта прерывания вложенного цикла. Какой правильнее?


14-71939
den_zab
2003-09-02 16:09
2003.09.22
список доступных SQL server-ов.