AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Template for numbers only

Ein Thema von WojTec · begonnen am 5. Feb 2015 · letzter Beitrag vom 5. Feb 2015
Antwort Antwort
WojTec

Registriert seit: 17. Mai 2007
480 Beiträge
 
Delphi XE6 Professional
 
#1

Template for numbers only

  Alt 5. Feb 2015, 13:19
Delphi-Version: XE6
I have function:

Delphi-Quellcode:
function SimilarValue(const AValue: Float32; AValues: array of Float32; out AResult: Float32): Int32;
var
  I: Int32;
  Distance: Float80;
  SmallestDistance: Float80;
begin
  Result := -1;
  AResult := 0;

  SmallestDistance := 16777216;

  for I := Low(AValues) to High(AValues) do
  begin
    Distance := Sqr(AValue - AValues[I]);
    if Distance < SmallestDistance then
    begin
      Result := I;
      AResult := AValues[I];

      SmallestDistance := Distance
    end;
  end;
end;
I want to make it working for any numeric type, but won't to overloading. Is it possible to do it with templates?

Delphi-Quellcode:
type
  TSimilarValue<T> = class
    class function Get(const AValue: T; AValues: array of T; out AResult: T): Int32;
  end;

class function TSimilarValue<T>.Get(const AValue: T; AValues: array of T; out AResult: T): Int32;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#2

AW: Template for numbers only

  Alt 5. Feb 2015, 14:02
Natürlich wäre es so auch möglich,


oder einfach nur so
Delphi-Quellcode:
function SimilarValue(const AValue: Double; AValues: array of const; out Index: Ineger): Double;
oder
function SimilarValue(const AValue: Double; AValues: array of Variant; out Index: Ineger): Double;
Funktioniert für alle Integer-Typen (beim Result natürlich mit Round) und allen normalen Float-Typen (Single und Double).
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.442 Beiträge
 
Delphi 12 Athens
 
#3

AW: Template for numbers only

  Alt 5. Feb 2015, 14:12
(beim Result natürlich mit Round)
Ist dir vielleicht entgangen, daß der Result den Index im Array zurückgibt?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#4

AW: Template for numbers only

  Alt 5. Feb 2015, 14:17
Nein, ist mir nicht , aber bei VAR/OUT muß der Typ genau stimmen muß und da nur der Index-Typ vordefiniert ist, da hab ich das einfach mal gedreht.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.156 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Template for numbers only

  Alt 5. Feb 2015, 14:19
Generics (or "templates") won't help you here because there is no way of constraining a type to "numbers only".

As others said, System.Math.SameValue is probably your best bet for checking equality of floats
  Mit Zitat antworten Zitat
WojTec

Registriert seit: 17. Mai 2007
480 Beiträge
 
Delphi XE6 Professional
 
#6

Re: Template for numbers only

  Alt 5. Feb 2015, 14:55
How to change code if parameter will ba array of const?
Can do it better? With SameValue? How?

Geändert von WojTec ( 5. Feb 2015 um 14:59 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.156 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Template for numbers only

  Alt 5. Feb 2015, 14:58
array of const is just a legacy way of writing "array of TVarRec".

I still don't quite get what you plan to do "better" than System.Math.SameValue(..)
  Mit Zitat antworten Zitat
WojTec

Registriert seit: 17. Mai 2007
480 Beiträge
 
Delphi XE6 Professional
 
#8

Re: AW: Template for numbers only

  Alt 5. Feb 2015, 15:16
I still don't quite get what you plan to do "better" than System.Math.SameValue(..)
Not better than, but better with. How to do with SameValue?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#9

AW: Re: AW: Template for numbers only

  Alt 5. Feb 2015, 18:52
I still don't quite get what you plan to do "better" than System.Math.SameValue(..)
Er möchte nicht zwei Werte vergleichen (Delphi-Referenz durchsuchenSameValue), sondern in einer Liste von Werten den Ähnlichsten heraussuchen.

Also eher wie Delphi-Referenz durchsuchenMaxValue, nur eben nicht das Größte, sondern das Ähnlichste ... fast wie eine unscharfe Suche ala Delphi-Referenz durchsuchenMatchText, zusammengemanscht mit einem Delphi-Referenz durchsuchenIndexText.


array of const -> siehe Delphi-Referenz durchsuchenFormat = Man kann alles möglichen Typen übergeben (Integer, Float usw.) und entscheidet dann intern, wie man welchen Typen behandelt, also ähnlich einem array of variant .




Delphi und C# kennen sowas wie "Number" nicht als Einschränkung.
http://docwiki.embarcadero.com/RADSt...ierte_Typen%29
https://msdn.microsoft.com/de-de/library/d5x73970.aspx
Java kann so etwas, aber dort ist doch letztendlich alles irgendwie eine Klasse.
http://www.java-forum.org/java-basic...chraenken.html

Ohne "nummerische" Typeinschränkung funktioieren viele Dinge einfach nicht.
Warum es soeine Einschränkung nicht gibt, welche alle nummerischen Typen und Records mit Operatoren erlauft, weiß ich nicht.
Delphi-Quellcode:
type
  TValue<T> = class
    class function Similar(const AValue: T; const AValues: array of T; out AResult: T): Integer;
  end;

class function TValue<T>.Similar(const AValue: T; const AValues: array of T; out AResult: T): Integer;
var
  i: Integer;
  Distance, Smallest: T;
begin
  Result := -1;
  AResult := Default(T);
  Smallest := Max(T); // gibt es nicht
  for i := Low(AValues) to High(AValues) do begin
    Distance := Abs(AValue - AValues[i]); // geht nicht
    if Distance < Distance then begin // geht nicht
      Result := I;
      AResult := AValues[I];
      Smallest := Distance
    end;
  end;
end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 6. Feb 2015 um 00:44 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:49 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz