Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1167820697
DeadMeat
2007-01-03 13:38
2007.01.28
Скроллбар в DBAware компонентах


2-1168505675
Vemer
2007-01-11 11:54
2007.01.28
Application.Active


2-1168315962
koha
2007-01-09 07:12
2007.01.28
А картиночку на MessageBox прорисовать можно?


15-1168381360
Bogdan1024
2007-01-10 01:22
2007.01.28
Генерирование документов


2-1168287682
Dim..ON
2007-01-08 23:21
2007.01.28
закрытие чужого приложения





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский