Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Дженерик в строку 
:(
    Опции темы
Keeper89
Дата 21.2.2010, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 9
Всего: 58



Доброго времени суток.

Имеется массив FValues
Код

TCoefficientList<T> = class
  strict private
    FValues: array of T;
...


В качестве T будут выступать Integer или Double.

Каким образом можно преобразовать значение FValues в строку?
Format и FloatToStr говорят об отсутствии необходимой перезагруженной функции.

Заметил, что складывать элементы массива тоже не получается...

Это сообщение отредактировал(а) Keeper89 - 21.2.2010, 21:31


--------------------
PM MAIL WWW   Вверх
DarkProg
Дата 21.2.2010, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

Репутация: 4
Всего: 19



По одному оправляешь во FloatToStr и складываешь в строке, только когда отправляешь элемент попробуй вот так FloatToStr(FValues[i] as float)


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
Keeper89
Дата 21.2.2010, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 9
Всего: 58



Тогда уж
Код

as Real

Но, такой тайпкаст все-равно не работает:
Цитата

Operator not applicable to this operand type



--------------------
PM MAIL WWW   Вверх
bems
Дата 21.2.2010, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Похорошему тут бы использовать Constraints, но к сожалению в дельфи нет ограничения numeric
В рантайме ты можешь узнать конкретный тип так
Код

if typeinfo(T) = typeinfo(Integer)
   then Inc(IntSum, PInteger(@FValues[i])^);


Добавлено @ 22:24
DarkProg, в дельфи примитивные типы - не классы, им нельзя делать AS

Добавлено @ 22:29
Еще посмотри на эту процедуру из Generics.Defaults
Код

function EqualityComparer_Selector_Float(info: PTypeInfo; size: Integer): Pointer;
begin
  case GetTypeData(info)^.FloatType of
    ftSingle: Result := @EqualityComparer_Instance_R4;
    ftDouble: Result := @EqualityComparer_Instance_R8;
    ftExtended: Result := @EqualityComparer_Instance_R10;
    ftComp: Result := @EqualityComparer_Instance_RI8;
    ftCurr: Result := @EqualityComparer_Instance_RC8;
  else
    System.Error(reRangeError);
    Exit(nil);
  end;
end;

Идея должна быть ясна

Это сообщение отредактировал(а) bems - 21.2.2010, 22:40


--------------------
Обижено школьников: 8
PM MAIL   Вверх
profesiachuvak
Дата 21.2.2010, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 7.11.2009
Где: Беларусь, Минск

Репутация: 1
Всего: 4



Если я правильно понял суть проблемы, то вот пример с T : integer;

Код

var
FValues : array[1..10] of integer;
s,s1:string;
i:integer;
begin
 for i:=low(FValues) to High(Fvalues) do
  begin
    FValues[i]:=i;
  end;
 for i:=low(FValues) to High(FValues) do
  begin
    s:=IntToStr(FValues[i]);
    s1:=Concat(s,s1);
  end;
  ShowMessage(s1);
end;


Это сообщение отредактировал(а) profesiachuvak - 21.2.2010, 22:37


--------------------
Закон Мерфи :если есть вероятность того, что какая-нибудь неприятность может случиться, то она обязательно произойдет.
PM MAIL   Вверх
bems
Дата 21.2.2010, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



profesiachuvak, суть проблемы чтобы написать код, который бы работал и для Integer и для Extended

Добавлено через 29 секунд
Keeper89, подправил пример


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Keeper89
Дата 22.2.2010, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 9
Всего: 58



bems
спасибо, сделал тестовый пример так:
Код

function TCoefficientList<T>.ToString(): string;
var
  i: Integer;
begin

  Result := EmptyStr;

  if TypeInfo(T) = TypeInfo(Integer) then
  begin
    for i := Low(FValues) to High(FValues) do
      Result := Result + Format('%d', [PInteger(@FValues[i])^]) + ', '
  end
  else //if TypeInfo(T) = TypeInfo(Double) then
  begin
    for i := Low(FValues) to High(FValues) do
      Result := Result + Format('%5.2f', [PDouble(@FValues[i])^]) + ', '
  end
end;

Т.е. сначала мы определяем тип переменной, а затем обращаемся к ней через указатель (никак иначе), верно?

Это сообщение отредактировал(а) Keeper89 - 22.2.2010, 00:43


--------------------
PM MAIL WWW   Вверх
bems
Дата 22.2.2010, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Цитата(Keeper89 @  22.2.2010,  00:42 Найти цитируемый пост)
Т.е. сначала мы определяем тип переменной
Ну да, сравнивая указатель на RTTI. Обычный каст тут не проходит, наверное потому что компилятор не может тут лаже проверить корректность размера типов в памяти.

Можно порыть RTTI и на более элегантные решения. Плясать от
Код

GetTypeData(typeinfo(T))




--------------------
Обижено школьников: 8
PM MAIL   Вверх
Keeper89
Дата 22.2.2010, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 9
Всего: 58



ОК, пороюсь, а тему пока прикрою.


--------------------
PM MAIL WWW   Вверх
bems
Дата 22.2.2010, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Цитата(bems @  22.2.2010,  01:00 Найти цитируемый пост)
не может тут лаже проверить

а опечатался в тему, да smile


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Keeper89
Дата 22.7.2010, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 9
Всего: 58



Еще вопрос появился smile
Код

procedure TKList<T>.Invert;
var
  item: T;
begin

      for item in FItems do
        PDouble(@item)^ := -PDouble(@item)^;

end;

Скорее всего что-то я напутал, т.к. значения не изменяются. FItems - TList<T>.

И еще вопрос: все возможные типы T - числовые (дробные или целые) и некоторые операции у них одинаковые (например сложение, сравнение и т.п.). Возможно ли написание более универсального кода без определения типа в каждом случае?

Это сообщение отредактировал(а) Keeper89 - 23.7.2010, 01:41


--------------------
PM MAIL WWW   Вверх
bems
Дата 24.7.2010, 02:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



item в теле цикла нужно рассматривать как const. Не случайно без @ тебе компилятор не дает присвоить


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Keeper89
Дата 24.7.2010, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 9
Всего: 58



Ясно, но как тогда присвоить FItems[i] значение?

И
Цитата(Keeper89 @  22.7.2010,  22:50 Найти цитируемый пост)
И еще вопрос: все возможные типы T - числовые (дробные или целые) и некоторые операции у них одинаковые (например сложение, сравнение и т.п.). Возможно ли написание более универсального кода без определения типа в каждом случае?



Это сообщение отредактировал(а) Keeper89 - 24.7.2010, 12:43


--------------------
PM MAIL WWW   Вверх
Keeper89
Дата 31.7.2010, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 9
Всего: 58



bems, а если через обычный for..to..do - это возможно?


--------------------
PM MAIL WWW   Вверх
bems
Дата 31.7.2010, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



да


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1236 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.