Форум: "Начинающим";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];
ВнизКак быстро скопировать record ? Найти похожие ветки
← →
Рекорд (2007-01-08 07:14) [0]
TMyRec = record
Name = string;
par1, par2 ... par100 : Integer;
end;
Хочется скопировать её через CopyMemory. Но мешает Name.
Нельзя ли как нибудь скопировать через CopyMemory без нэйма? А потом скопировать name через присваивание?
Потому, что просто лень писать
r2.par1 := r1.par1;
r2.par2 := r1.par2;
...
r2.par100 := r1.par100;
← →
Anatoly Podgoretsky © (2007-01-08 07:16) [1]> Рекорд (08.01.2007 07:14:00) [0]
А почему бы тебе не скопировать Name, а остальное с помощью CopyMemory
← →
ors_archangel © (2007-01-08 07:19) [2]А записи записям разве не присваиваются, их, помойму, только сравнивать нельзя.... Правда, если присваиваются, то код колучается типа как в [0] (помойму в Delphi7 так было, когда смотрел)
← →
Рекорд (2007-01-08 07:31) [3]
> Anatoly Podgoretsky © (08.01.07 07:16) [1]
>
> > Рекорд (08.01.2007 07:14:00) [0]
>
> А почему бы тебе не скопировать Name, а остальное с помощью
> CopyMemory
В этом и заключается вопрос.
Если знаешь как правильно это сделать - напиши.
← →
ors_archangel © (2007-01-08 07:37) [4]Рекорд, в твоём случае тебе рекомендуется и не кем-то там! а человеком уважаемым сначала скопировать себе поле Name, вот так:
r2.name := r1.name;
а потом, как с этим трудным делом справитесь, то можно и остальное наибыстрейшим образом-то и покопировать, прикинь? нет, ты код зацени:
Move(r1.par1, r2,par1, sizeof(r1)-4);
:))
p.s. С Рождеством, хоть и прошедшим!
p.p.s. В общем случае твой вопрос не имеет решения в рамках Паскаля.
← →
Рекорд (2007-01-08 07:46) [5]
> ors_archangel © (08.01.07 07:37) [4]
> Рекорд, в твоём случае тебе рекомендуется и не кем-то там!
> а человеком уважаемым
Вах !
В каком он звании?
> Move(r1.par1, r2,par1, sizeof(r1)-4);
И что это значит? Размер 0. Значит ошибку выдаст.
> p.s. С Рождеством, хоть и прошедшим!
Аналогично.
← →
Джо © (2007-01-08 08:01) [6]> > Move(r1.par1, r2,par1, sizeof(r1)-4);
>
> И что это значит? Размер 0. Значит ошибку выдаст.
Отчего же вдруг 0?
← →
Рекорд (2007-01-09 01:33) [7]
> Джо © (08.01.07 08:01) [6]
>
> > > Move(r1.par1, r2,par1, sizeof(r1)-4);
> >
> > И что это значит? Размер 0. Значит ошибку выдаст.
>
> Отчего же вдруг 0?
Что, с Луны свалился? Спроси у Дельфи.
← →
Palladin © (2007-01-09 01:38) [8]
> [7] Рекорд
врешь, причем нагло...
← →
Джо © (2007-01-09 01:38) [9]> [7] Рекорд (09.01.07 01:33)
>
> > Джо © (08.01.07 08:01) [6]
> >
> > > > Move(r1.par1, r2,par1, sizeof(r1)-4);
> > >
> > > И что это значит? Размер 0. Значит ошибку выдаст.
> >
> > Отчего же вдруг 0?
>
>
> Что, с Луны свалился? Спроси у Дельфи.
SizeOf(TMyRec)-4 ни в коем случае не может быть равен 0.
← →
ors_archangel © (2007-01-09 01:39) [10]
> Что, с Луны свалился? Спроси у Дельфи.
Ну, если запись не занимает места :) то нафига её копировать-то?
з.ы. Ну теперь наконец-то решена проблема ОЗУ: пишем всё в записях, и можно хоть 5 Гигов, хоть 6! :))))))))
← →
ors_archangel © (2007-01-09 01:43) [11]..И заговорила Делфи человеческим голосом :) - от таких высказываний :)
← →
Palladin © (2007-01-09 01:43) [12]хотя может и не врет...
если
procedure dummy002(var r1,r2);
begin
...
end;
dummy002(myr1,myr2);
ну тогда сам виновать... головой думать нужно что делаешь...
второй вариант, своя самописная функциф sizeof... в чем сомневаюсь, но диагноз и рекомендации см выше
← →
ors_archangel © (2007-01-09 01:51) [13]
> procedure dummy002(var r1,r2);
Да, много ещё проблем будет от нестрогой типизации
← →
Джо © (2007-01-09 01:54) [14]> [13] ors_archangel © (09.01.07 01:51)
>
> > procedure dummy002(var r1,r2);
>
> Да, много ещё проблем будет от нестрогой типизации
Каждый сам себе — злобный Буратино :)
← →
Palladin © (2007-01-09 01:56) [15]но про падеж с луны это просто возмутительно
в бойкот
← →
Рекорд (2007-01-09 04:29) [16]
> Palladin © (09.01.07 01:38) [8]
> > [7] Рекорд
> врешь, причем нагло...
А запустить Дельфи и проверить - слабо?
> Джо © (09.01.07 01:38) [9]
> SizeOf(TMyRec)-4 ни в коем случае не может быть равен 0.
SizeOf(TMyRec) = 4
← →
Palladin © (2007-01-09 04:33) [17]без запуска все уже понятно
TMyRec у тебя указатель
опять же думать нужно головой
изучай паскаль и не выпендривайся
← →
Рекорд (2007-01-09 05:13) [18]
> Palladin © (09.01.07 04:33) [17]
>
> без запуска все уже понятно
> TMyRec у тебя указатель
Поздравляю, что наконец то допёр.
> изучай паскаль и не выпендривайся
Вот ты и не выпендривайся, а запускай и проверяй, пока слишком слаб в Паскале.
← →
Джо © (2007-01-09 05:35) [19]> [16] Рекорд (09.01.07 04:29)
В этой ветке есть всего один TMyRec, его определение дал ты же сам в первом посте:TMyRec = record
Name = string;
par1, par2 ... par100 : Integer;
end;
Поэтому не нужно выдумывать тут «какие-то другие» TMyRec и на основании личных выдумок кому-то что-то здесь рассказывать и строить предположения.
← →
Palladin © (2007-01-09 06:14) [20]
> Рекорд (09.01.07 05:13) [18]
нет, ну ты наглец :) хоть где нибудь бы эта информация от тебя проскользнула...
TMyRec = record
Name = string;
par1, par2 ... par100 : Integer;
end;
такая конструция не скомпилируется, знаток, ты наш, паскаля... а то что ты вызываешь получение размера указателя... ну что ж... головой думать нужно, как я тебе уже не раз сказал... реального определения типа и реальных функций работы с ними ты привести не сблагволил...
вот, может быть, твое, то что подсказывает мне телепатор
TMyRec = record
Name : string;
par1, par2 ... par100 : Integer;
end;
Теперь запусти
Type
TMyRec = record
Name : string;
pars:array [1..100] of : Integer;
end;
ShowMessage(IntToStr(SizeOf(TMyRec)));
и нечего морочить голову отвечающим...
хочешь по указателю? без проблемм
type
PMyRec=^TMyRec;
TMyRec = record
Name : string;
par1,par2...parNNN:Integer;
end;
Procedure CopyRec(Rec1:PMyRec;Var Rec2:PMyRec);
Begin
New(Rec2);
Rec2.Name:=Rec1.Name;
Move(Rec1.par1,Rec2.par1,SizeOf(TMyRec)-4);
End;
знаток паскаля, блин... еще кому то что то советует...
сто пудово, сейчас новые подробности вылезут...
← →
oxffff © (2007-01-09 09:48) [21]
>ors_archangel © (08.01.07 07:37) [4]
> p.p.s. В общем случае твой вопрос не имеет решения в рамках
> Паскаля.
А вы не торопитесь c выводами?
Вопрос IMHO имеет решение, посмотрите на _FinalizeRecord, _FinalizeArray.
Что касаемо копирования объекта, то можно реализовать интерфейсы для
копирования например
ICLONABLE=interface
function CopyObj(DeepCopy:Boolean=TRUE):Tobject;
end;
Конечно это .NET, но сделать можно. IMHO.
← →
icWasya © (2007-01-09 09:51) [22]а просто
r2:=r1;
не прокатит?
← →
oxffff © (2007-01-09 09:59) [23]F r\\\
> icWasya © (09.01.07 09:51) [22]
> а просто
>
> r2:=r1;
>
> не прокатит?
А что _CopyRecord скопирует(клонирует) объект?
← →
Джо © (2007-01-09 10:02) [24]> [22] icWasya © (09.01.07 09:51)
> а просто
>
> r2:=r1;
>
> не прокатит?
Вася, не порть концептуальность спора! :0)
← →
oxffff © (2007-01-09 10:18) [25]Блин, влез в такую то замануху.
Читать [23],[21] как изменение семантики копирования объектов в _CopyRecord
← →
alex_*** © (2007-01-09 10:41) [26]Не проще string заменить на array[0..255] of char ?
← →
evvcom © (2007-01-09 10:47) [27]> [26] alex_*** © (09.01.07 10:41)
А как в него 257 и более символов запхнуть?
← →
alex_*** © (2007-01-09 11:57) [28]
> А как в него 257 и более символов запхнуть?
array[0..256 (и более)] of char :)
надо класс тогда писать с полем типа string и делать конструктор копии
← →
oxffff © (2007-01-09 12:33) [29]
> надо класс тогда писать с полем типа string и делать конструктор
> копии
Это уже С++.
← →
Джо © (2007-01-09 12:35) [30]В новых версиях Делфи можно для рекордов операторы перегрузить :) Хотя, к теме это мало относится.
← →
oxffff © (2007-01-09 12:57) [31]
> В новых версиях Делфи можно для рекордов операторы перегрузить
> :)
Хотя, к теме это мало относится.
Нет перегрузки :=
Пробывал "обойти" вот так
Implicit(a:Type1):Type1 или Explicit(a:Type1):Type1
не срабывает при
SomeVar1OfType1:=SomeVar2OfType1;
← →
evvcom © (2007-01-09 12:59) [32]> [28] alex_*** © (09.01.07 11:57)
> array[0..256 (и более)] of char :)
короче свой string написать, понятное дело :)
← →
oxffff © (2007-01-09 13:02) [33]:)
Пробывал читать как пробовал.
← →
alex_*** © (2007-01-09 13:14) [34]
> короче свой string написать, понятное дело :)
Это еще зачем?
> Это уже С++.
Почему это? в дельфях разве нельзя написать конструктор для копии?
TMyObj.Create(const src: TMyObj);
не майтесь дурью, в общем.
← →
oxffff © (2007-01-09 13:27) [35]
> Почему это? в дельфях разве нельзя написать конструктор
> для копии?
> TMyObj.Create(const src: TMyObj);
А кто его вызывать будет?
_CopyRecord?
← →
alex_*** © (2007-01-09 13:42) [36]кастомер.
obj := TMyObj.Create(old_obj);
← →
oxffff © (2007-01-09 14:06) [37]
> alex_*** © (09.01.07 13:42) [36]
> кастомер.
> obj := TMyObj.Create(old_obj);
А не замучаешься писать для каждой версии записи свой "клонирователь"?
Можно написать свою реализацию _CopyRecord,
в которой сделать допущение что либо базовый класс имеет
либо виртуальную функцию Clone:TBaseObject,
либо виртуальный твой конструктор копий CopyConstructor(const obj)
либо интерфейс клонирования объекта ICLONABLE
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.05 c