-
> ПостОвый терминатор © (05.05.08 17:38) [79]
А ведь кто-то, буквально ~8 минут назад, флуданул в другой ветке. Не будем показывать пальцами, но это был слоненок.
-
ПостОвый терминатор © (05.05.08 17:38) [79]
А зачем ты в начинающих пишешь под чужими никами ? Накажу.
-
> Игорь Шевченко © (05.05.08 17:44) [81]
Не понял, а каком посте идет речь?
-
Игорь Шевченко © (05.05.08 15:33) [46] прежде чем спорить, про предмет спора почитай малость
а я ни с чем не спорил. Перечитываем дружно два раза.
-
Итак приступим
> Григорьев Антон © (05.05.08 16:36) [70] > > > oxffff © (05.05.08 15:48) [52] > > type > > TXFUNC=function (const a:TvarRec):TvarRec; > > > > function abc(var List:array of const;func:TXFUNC):integer; > > > > > var i:integer; > > begin > > for i:=0 to length(List)-1 do LIST[i]:=func(LIST[i]); > > end; > > > > function XSample(const a:TvarRec):TvarRec; > > begin > > > > end; > > > > procedure TForm1.Button1Click(Sender: TObject); > > var a:array of TVarRec; > > begin > > abc(A,XSample); > > end; > > Не компилируется abc([1,'a', 2], XSample), т.е. константный > список кушать не хочет. В Лиспе с этим проблем нет. Я уж > молчу о том, что чтобы правильно сформировать содержимое > массива a, надо будет повозиться с полями TVarRec, что очень > неудобно. Полиморфизм функции XSample тоже не так просто > сделать.
А разве должно? function abc(var )
Однако кто вам мешает сделать так?
type TXFUNC=function (const a:TvarRec):TvarRec; VarRecArray=array of TVarRec;
function abc(var List:array of const;func:TXFUNC):integer; var i:integer; begin for i:=0 to length(List)-1 do LIST[i]:=func(LIST[i]); end;
function XSample(const a:TvarRec):TvarRec; begin
end;
function TrickInit(const List:array of const):VarRecArray; begin Setlength(result,length(list)); copyMemory(result,@list,sizeof(TvarRec)*length(List)); end;
procedure TForm1.Button1Click(Sender: TObject); var A:VarRecArray; begin A:=TrickInit([1,'2',3,4]); abc(A,XSample); end;
-
Продолжим.
> Григорьев Антон © (05.05.08 16:36) [70] > oxffff © (05.05.08 15:50) [54] > Как у вас с ООП? > Видимо, очень плохо. Потому что не представляю, при чём > вообще ООП, когда я хочу выполнить простые операции над > типами integer, real, char и т.п.
Идея состоит в том, что вы создаете иерархию классов оберток для типов в том числе и для элементарных. И определяете унарные операции над типом ввиде например интерфейсов, виртуальных методов, или published методов, т.е. все с поздним связыванием.
Используя аналогичную идею как с TCustomvariant
-
Пробегал2... (05.05.08 18:50) [83]
Эт ты сказки рассказывай где-нибудь еще. Ты тут личность давно известная, повадки твои тоже. Так еще раз - прежде чем спорить, изучи предмет спора.
-
> Григорьев Антон © (05.05.08 16:36) [70] > > Да, читали. Но TCustomVariant - это всё-таки не элементарный > тип, а обеспечивать полиморфизм на уровне простых типов > Delphi не умеет. > > Получил ожидаемый результат - исключение в строке с синусом. > Потому что такие фокусы проходят только когда v содержит > указатель на IDispatch, т.е. простые типы опять пролетают > как фанера над Парижем. Ответ насчёт стандартной функции > sin не засчитывается.
Это вам задание на дом, а именно как прикрутить disp вызовы к элементарным типам. Подумайте.
-
> Игорь Шевченко © (05.05.08 16:42) [72] > oxffff © (05.05.08 16:20) [67] > > Мне будет крайне интересна передача классов в иерархии через > TVarRec > > type > TFooBase = class > public > procedure SomeMethod (Param: TParam); virtual; > end; > > TFoo = class(TFooBase) > ... > end; > TBar = class(TFoo) > ... > public > procedure SomeMethod (Param: TParam); override; > end; > > То есть, при generic-ах я могу написать > > type > TFooList = TList<TFoobase> > public > ... > procedure ApplySomeMethod (Param: TParam); > end; > > procedure TFooList.ApplySomeMethod (Param: TParam); > var > I: Integer; > begin > for I:=0 to Count-1 do > Items[I].SomeMethod (Param); > end;
Я не понял вашего вопроса?
-
> ПостОвый терминатор © (05.05.08 17:38) [79] > Господа, заинтересованные! Извините еще в очередной раз. > Позвольте спросить, что Вам мешает открыть соответствующую > (новую) обсуждению ветку? А не флудить в ветке автора, которого > ваша "переписка" похоже не интересует:(
Мне показалось, что меня не поняли:( Или на самом деле на этом форуме все ... Еще раз прошу извинить за резкость (просто становится обидно за форум)
-
> oxffff © (05.05.08 20:40) [84] > Однако кто вам мешает сделать так? <...> procedure TForm1.Button1Click(Sender: TObject); var A:VarRecArray; begin A:=TrickInit([1,'2',3,4]); abc(A,XSample); end;
А если понадобится так? procedure TForm1.Button1Click(Sender: TObject); var A:VarRecArray; begin A:=TrickInit([1,'abc',3,4]); abc(A,XSample); end; Будете использовать CopyMemory с автоматически финализируемым типом?
-
> Будете использовать CopyMemory с автоматически финализируемым > типом?
А может изучить мат. часть?
TVarRec = record { do not pack this record; it is compiler-generated } case Byte of vtInteger: (VInteger: Integer; VType: Byte); vtBoolean: (VBoolean: Boolean); vtChar: (VChar: Char); vtExtended: (VExtended: PExtended); vtString: (VString: PShortString); vtPointer: (VPointer: Pointer); vtPChar: (VPChar: PChar); vtObject: (VObject: TObject); vtClass: (VClass: TClass); vtWideChar: (VWideChar: WideChar); vtPWideChar: (VPWideChar: PWideChar); vtAnsiString: (VAnsiString: Pointer); vtCurrency: (VCurrency: PCurrency); vtVariant: (VVariant: PVariant); vtInterface: (VInterface: Pointer); vtWideString: (VWideString: Pointer); vtInt64: (VInt64: PInt64); end;
-
> oxffff © (05.05.08 22:34) [91] > > > Будете использовать CopyMemory с автоматически финализируемым > > > типом? > > > А может изучить мат. часть? > > TVarRec = record { do not pack this record; it is compiler- > generated } > case Byte of > vtInteger: (VInteger: Integer; VType: Byte); > vtBoolean: (VBoolean: Boolean); > vtChar: (VChar: Char); > vtExtended: (VExtended: PExtended); > vtString: (VString: PShortString); > vtPointer: (VPointer: Pointer); > vtPChar: (VPChar: PChar); > vtObject: (VObject: TObject); > vtClass: (VClass: TClass); > vtWideChar: (VWideChar: WideChar); > vtPWideChar: (VPWideChar: PWideChar); > vtAnsiString: (VAnsiString: Pointer); > vtCurrency: (VCurrency: PCurrency); > vtVariant: (VVariant: PVariant); > vtInterface: (VInterface: Pointer); > vtWideString: (VWideString: Pointer); > vtInt64: (VInt64: PInt64); > end;
-
oxffff © (05.05.08 21:15) [88]
> Я не понял вашего вопроса?
Есть иерархия. Она описана. Есть шаблонный класс списка классов из этой иерархии. Я описал гипотетический пример, как класс списка мог бы выглядеть с применением generic-ов, и как это выглядит в C# и С++ насколько я понял, ты предлагаешь реализовать функциональность generic-ов через TVarRec Вот мне и любопытно увидеть реализацию моего гипотетического примера с помощью TVarRec
-
а можно я скажу, можно? привет, придурки!
Игорь, Розыч — ну не удаляйте. разве я не прав?
зыж для остальных: Кэтмар — ламер. это общеизвестный факт.
-
> Игорь Шевченко © (05.05.08 23:37) [93] > oxffff © (05.05.08 21:15) [88] > > > > Я не понял вашего вопроса? > > > Есть иерархия. Она описана. Есть шаблонный класс списка > классов из этой иерархии. Я описал гипотетический пример, > как класс списка мог бы выглядеть с применением generic- > ов, и как это выглядит в C# и С++ > насколько я понял, ты предлагаешь реализовать функциональность > generic-ов через TVarRec > Вот мне и любопытно увидеть реализацию моего гипотетического > примера с помощью TVarRec
вопрос был про TYPE ANY (шаблонные) функции.
-
>oxffff © (06.05.08 09:05) [95] многое можно сделать через ж но не нужно
-
> oxffff © (05.05.08 22:34) [91] > А может изучить мат. часть?
Учите. Вам знаний матчасти как раз очень не хватает. Берём ваш код и слегка дополняем, чтобы можно было получить какой-то результат. type
TXFUNC=function (const a:TvarRec):TvarRec;
VarRecArray=array of TVarRec;
function abc(var List:array of const;func:TXFUNC):integer;
var
i:integer;
begin
for i:=0 to length(List)-1 do
LIST[i]:=func(LIST[i]);
Result:=0;
end;
function XSample(const a:TvarRec):TvarRec;
begin
Result:=a;
end;
function TrickInit(const List:array of const):VarRecArray;
begin
Setlength(result,length(list));
copyMemory(result,@list,sizeof(TvarRec)*length(List));
end;
procedure TForm1.Button1Click(Sender: TObject);
var A:VarRecArray;
S:string;
begin
S:='abc';
UniqueString(S);
A:=TrickInit([S]);
S:='123';
abc(A,XSample);
ASSERT(A[0].VType = vtAnsiString);
Label1.Caption:=string(A[0].VAnsiString)
end; Функция XSample оставляет переданное ей значение без изменения, поэтому следует ожидать появления в Label1 текста 'abc', который был присвоен переменной S, переданной затем в качестве элемента массива. Тем не менее, на экране появляется непонятно что (проверено в Delphi 7). А вот если убрать строку, отмеченную звёздочкой, будет, как и ожидалось, строка "abc". Поясню, что здесь происходит. С помощью UniqueString мы добиваемся того, что значение S хранится в динамической памяти со счётчиком ссылок, равным 1. Когда мы передаём это значение в конструктор открытого вариантного массива, указатель на эту строку тупо копируется как простой указатель, который и сохраняется в нулевом элементе массива A. Механизм подсчёта ссылок при этом не включается. И когда переменной S присваивается другое значение, память, занимаемая строкой, считается свободной, и что там будет располагаться - это как повезёт. А в A [0] при этом сохраняется этот битый указатель, в результате чего мы и имеем проблемы. Кстати, рекомендую попробовать после строки со звёздочкой вставить UniqueString(S) - увидите ещё один интересный эффект :)) Кстати, я вчера задал вам несколько вопросов по поводу ваших предложений, но для ответа вы почему-то выбрали только один из них, скромно умолчав про остальные. В общем, я не советую вам больше разговароивать на грани хамства с использованием выражений "читай справку", "учи матчасть" и т.п., потому что после такого становится особенно неприятно, когда тебя самого ловят на незнании матчасти. Конечно, можно в вашу функцию TrickInit добавить контроль за счётчиком ссылок или вообще преобразование, сводящее всё к PChar и ручному управлению памятью. Потребуется ещё куча функций, которые будут в разных ситуациях отвечать за правильное освобождение памяти в нужный момент. Но удобно ли будет пользоваться такой библиотекой с такими наворотами? Да ещё и с учётом того, что для работы с ней подходит не любой тип данных, а специально организованный, и не любая функция, а только специально написанная? Предлагаю вам остановится на таком завершении спора: "В Delphi, сильно извратившись, можно написать библиотеку, которая, при добровольном соблюдении её пользователем кучи ограничений, позволит ему программировать в стиле, похожем на Лисп. Но для решения любой практической задачи будет удобнее писать в стиле Delphi, чем использовать такую библиотеку".
-
> Alkid © (05.05.08 17:22) [76] > А на ABAP как mapcar написать? :)))
Например, можно так: form mapcar
using in_table type index table
func_name type string
changing out_table type index table
.
field-symbols: <in>, <out>.
clear out_table.
loop at in_table assigning <in>.
append initial line to out_table assigning <out>.
perform (func_name) in program (sy-cprog)
using <in>
changing <out>
.
endloop.
endform.
-
oxffff © (06.05.08 09:05) [95]
> вопрос был про TYPE ANY (шаблонные) функции.
Переведи пожалуйста, я не понял ответа
|