Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.09.22;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.014 c
1-71719
Relaxxx
2003-09-10 15:23
2003.09.22
Красивый ПрогрессБар или Gauge


3-71509
Eagle Owl
2003-08-30 00:28
2003.09.22
Добавление поля к таблице


7-71993
Overstep
2003-07-10 12:29
2003.09.22
Работа с системным динамиком под любой Windows


6-71798
Jao
2003-06-30 16:36
2003.09.22
Сокеты. Посылка файла посредстом TcpClient и TcpServer


1-71744
AlexanderSK
2003-09-10 12:25
2003.09.22
Ссылка на класс?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский