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

Вниз

Как быстро скопировать 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;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.061 c
2-1168480082
brother
2007-01-11 04:48
2007.01.28
никогда не задумывался о...


1-1164794189
*Ray*
2006-11-29 12:56
2007.01.28
Программное изменение разрешения экрана


5-1147508616
_duk
2006-05-13 12:23
2007.01.28
DBGrid


2-1168416384
Rentgen
2007-01-10 11:06
2007.01.28
как из TDateTime вычесть к примеру 5 минут?


15-1167991529
alexeis
2007-01-05 13:05
2007.01.28
Установить принтер, не подключая его