Poslední příspěvky

Stran: 1 [2] 3 4 ... 10
11
Obecné / Re:DLL - tabuľky v nej či v DB
« Poslední příspěvek od Stanislav Hruška kdy 22-01-2022, 16:55:57 »
Na dve veci  ;D Na nič a na hovno. Ďakujem. Bolo mi trochu divné, že to v druhom prípade nemám. Namiesto analýzy som sa na to vykašlal.
12
Obecné / Re:DLL - tabuľky v nej či v DB
« Poslední příspěvek od vandrovnik kdy 22-01-2022, 15:09:19 »
Nie. To mi funguje dobre. Najprv si v "hlavičke" (os X) zistím stĺpce, medzi ktorými sa nachádza parameter "X". Preto 0. To isté pre Y. Tak získam 4 hodnoty, ktoré mi určujú 4 bunky v poli, kde si musím nájsť výslednú hodnotu.
Testoval som to aj pre krajné stavy.
Ide mi len o to prepašovanie polí, alebo čohokoľvek iného vhodného, do funkcie.

Máš tam:
Kód: [Vybrat]
function TfrmMainForm.GetX2(const MaxX, MaxY: Integer; const ValueX: Currency): Integer;
var  X, Y: Integer;
begin
  Result := MaxX;
.
  for Y := 0 to MaxY do
  begin
    for X := 0 to MaxX do
    begin
      if Asc[0][X] >= ValueX then
      begin        Result := X;        Break;      end;
    end;
  end;
end;

K čemu tam tedy je cyklus pro Y?
13
Obecné / Re:DLL - tabuľky v nej či v DB
« Poslední příspěvek od Stanislav Hruška kdy 22-01-2022, 14:53:33 »
Nie. To mi funguje dobre. Najprv si v "hlavičke" (os X) zistím stĺpce, medzi ktorými sa nachádza parameter "X". Preto 0. To isté pre Y. Tak získam 4 hodnoty, ktoré mi určujú 4 bunky v poli, kde si musím nájsť výslednú hodnotu.
Testoval som to aj pre krajné stavy.
Ide mi len o to prepašovanie polí, alebo čohokoľvek iného vhodného, do funkcie.
14
Obecné / Re:DLL - tabuľky v nej či v DB
« Poslední příspěvek od vandrovnik kdy 22-01-2022, 14:39:10 »
Jen na letmé kouknutí, řádek 98, nemá tam být Asc[Y][X] ?
15
Obecné / Re:DLL - tabuľky v nej či v DB
« Poslední příspěvek od Stanislav Hruška kdy 22-01-2022, 14:26:57 »
V niektorých diskusiách som narazil na generiká (T<T>). Ale tam som bol úplne mimo. Je to v knižnici cesta pre mňa?
16
Obecné / Re:DLL - tabuľky v nej či v DB
« Poslední příspěvek od Stanislav Hruška kdy 22-01-2022, 14:16:30 »
Prikladám celé svoje terajšie riešenie. Ide mi funkciu Aprox
Kód: [Vybrat]
unit MainForm;
interface uses...
type
  TfrmMainForm = class(TForm)
...
  strict private
  const
    Asc: array[0..6, 0..6] of Currency =
    (( 0, 3.0, 4.5, 6.0, 9.0, 12.0, 15.0),
    (  0, 0.0, 0.0, 0.0, 0.0,  0.0,  0.0),
    ( 20, 0.0, 0.0, 0.0, 0.0,  0.0,  0.0),
    ( 40, 1.2, 1.7, 2.2, 2.7,  3.1,  3.3),
    ( 60, 2.4, 3.2, 3.9, 4.9,  5.6,  6.1),
    ( 80, 3.2, 4.3, 5.1, 6.4,  7.3,  8.0),
    (100, 3.9, 5.1, 6.1, 7.6,  8.7,  9.5));
    Asc1: array[0..10, 0..2] of Currency =
    ((0.3, 160, 100),
     (0.4, 150,  95),
     (0.5, 140,  90),
     (0.6, 130,  85),
     (0.7, 120,  80),
     (0.8, 110,  75),
     (0.9, 100,  70),
     (1.0,  90,  65),
     (1.1,  80,  60),
     (1.2,  70,  55),
     (1.3,  60,  50));
    function Aprox(const ValueX, ValueY: Currency): Real;
    function GetDeltaX(var X1, X2: Integer; const ValueX: Currency): Real;
    function GetDeltaY(var Y1, Y2: Integer; const ValueY: Currency): Real;
    function GetX2(const MaxX, MaxY: Integer; const ValueX: Currency): Integer;
    function GetY2(const MaxY: Integer; const ValueY: Currency): Integer;
  end;
var
  frmMainForm: TfrmMainForm;
implementation
{$R *.dfm}
.
function TfrmMainForm.Aprox(const ValueX, ValueY: Currency): Real;
var  X1, X2, Y1, Y2, MaxX, MaxY: Integer;
begin
  MaxY := High(Asc);
  MaxX := High(Asc[0]);
  X2 := GetX2(MaxX, MaxY, ValueX);
.
  if X2 = MaxX then
    X1 := X2
  else  if Asc[0][X2] <> ValueX then
    X1 := X2 - 1
  else
    X1 := X2;
.
  Y2 := GetY2(MaxY, ValueY);
.
  if Y2 = MaxY then
    Y1 := Y2
  else  if Asc[Y2][0] <> ValueY then
    Y1 := Y2 - 1
  else
    Y1 := Y2;
.
  var DeltaX := GetDeltaX(X1, X2, ValueX);
  var DeltaX1Value := Asc[Y1][X1] + (Asc[Y1][X2] - Asc[Y1][X1]) * DeltaX;
  var DeltaX2Value := Asc[Y2][X1] + (Asc[Y2][X2] - Asc[Y2][X1]) * DeltaX;
  Result := DeltaX1Value + ((DeltaX2Value - DeltaX1Value) * GetDeltaY(Y1, Y2, ValueY));
end;
.
procedure TfrmMainForm.btn1Click(Sender: TObject);
begin
ShowMessage(FloatToStr(Aprox(Asc, advedtX.Value, advedtY.Value)));
end;
.
function TfrmMainForm.GetDeltaX(var X1, X2: Integer; const ValueX: Currency): Real;
begin
  if Asc[0][X2] = Asc[0][X1] then
    Result := 1
  else
    Result := (ValueX - Asc[0][X1]) / (Asc[0][X2] - Asc[0][X1]);
end;
.
function TfrmMainForm.GetDeltaY(var Y1, Y2: Integer; const ValueY: Currency): Real;
begin
  if Asc[Y2][0] = Asc[Y1][0] then
    Result := 1
  else
    Result := (ValueY - Asc[Y1][0]) / (Asc[Y2][0] - Asc[Y1][0]);
end;
.
function TfrmMainForm.GetX2(const MaxX, MaxY: Integer; const ValueX: Currency): Integer;
var  X, Y: Integer;
begin
  Result := MaxX;
.
  for Y := 0 to MaxY do
  begin
    for X := 0 to MaxX do
    begin
      if Asc[0][X] >= ValueX then
      begin        Result := X;        Break;      end;
    end;
  end;
end;
.
function TfrmMainForm.GetY2(const MaxY: Integer; const ValueY: Currency): Integer;
var  Y: Integer;
begin
  Result := MaxY;
.
  for Y := 0 to MaxY do
  begin
    if Asc[Y][0] >= ValueY then
    begin      Result := Y;      Break;    end;
  end;
end;
17
Obecné / Re:DLL - tabuľky v nej či v DB
« Poslední příspěvek od Stanislav Hruška kdy 22-01-2022, 14:05:12 »
Krížia sa mi oči :o  Na mňa príliš zložité ???  Uvediem tu príklady dvoch polí:
Kód: [Vybrat]
    Asc: array[0..6, 0..6] of Currency =
    (( 0, 3.0, 4.5, 6.0, 9.0, 12.0, 15.0),
    (  0, 0.0, 0.0, 0.0, 0.0,  0.0,  0.0),
    ( 20, 0.0, 0.0, 0.0, 0.0,  0.0,  0.0),
    ( 40, 1.2, 1.7, 2.2, 2.7,  3.1,  3.3),
    ( 60, 2.4, 3.2, 3.9, 4.9,  5.6,  6.1),
    ( 80, 3.2, 4.3, 5.1, 6.4,  7.3,  8.0),
    (100, 3.9, 5.1, 6.1, 7.6,  8.7,  9.5));
    Asc1: array[0..10, 0..2] of Currency =
    ((0.3, 160, 100),
     (0.4, 150,  95),
     (0.5, 140,  90),
     (0.6, 130,  85),
     (0.7, 120,  80),
     (0.8, 110,  75),
     (0.9, 100,  70),
     (1.0,  90,  65),
     (1.1,  80,  60),
     (1.2,  70,  55),
     (1.3,  60,  50));
Našiel som ešte nejaké príklady. Musím si ich naštudovať ako fungujú. Uvidím, ako sa mi bude dariť.
Ja si pred volaním funkcie musím zistiť ktorú tabuľku/objekt jej mám poslať. Z tohto pohľadu je jedno či si definujem kopu konštantných polí, alebo objektov.
Chcem mať len jedinú funkciu. A nie 27 funkcií podľa rozmerov poľa. V podstate sú všetky ukážky s jedným typom poľa.
18
Obecné / Re:DLL - tabuľky v nej či v DB
« Poslední příspěvek od pf1957 kdy 22-01-2022, 12:56:37 »
Našiel som dve veci:
Kód: [Vybrat]
type
  TData = array of integer;
  PData = ^TData;
Ano, tohle je princip, ktery musis uplatnit, ale a) tohle je dynamicke pole, staticka definice je primo v Delphi TIntegerArray a mozna jeste nejaka dalsi b) pro vicerozmerne pole si budes muset zahrat na prekladac a adresu prvku pole vypocitat a jeho hodnotu pres pointer ziskat.

Citace
  TMyArray = Array[1..30] Of SomeThing;
Procedure DoStuff(Var AnArray : TMyArray);
Tohle je k nicemu, to se jen zbavuje PData z predchoziho. A misto var se da pouzit const.

Kdyz vezmu to pole z predchozi odpovedi:
Kód: Delphi [Vybrat]
  1. const
  2.   A: Array [1 .. 2, 1 .. 5] of real = (
  3.     (1.1, 1.2, 1.3, 1.4, 1.5),
  4.     (2.1, 2.2, 2.3, 2.4, 2.5)
  5.   );
  6.  
tak si muzu nadefinovat pointer na dummy pole (jeho pouziti vyzaduje vypnuti range checkingu) jinak bys musel pouzit pro horni hranici kazdeho rozmeru pole nejake velke konstanty, ktere v danem pripade prakticky nemuzes prekrocit):
Kód: Delphi [Vybrat]
  1. type
  2.   TRealArray = array [0..0] of real;
  3.   PRealArray = ^TRealArray;
  4.  

A pak treba funkce, ktera pristupuje k hodnote v poli:

Kód: Delphi [Vybrat]
  1. {$R-}// Nejdriv by mel schovat puvodni stav direktivy
  2. function TForm1.GetDim2RealValue(ARealArray: PRealArray;
  3.   ARowLow, ARowHigh, AColLow, AColHigh: integer; ARowIdx, AColIdx: integer): real;
  4. var
  5.   pCols: PRealArray;
  6.   pCell: PRealArray;
  7. begin
  8.   pCols := PRealArray(addr(ARealArray[(ARowIdx - ARowLow) *
  9.     (AColHigh - AColLow + 1)]));
  10.   pCell := addr(pCols^[AColIdx - AColLow]);
  11.   result := pCell^[0];
  12. end;
  13. {$R+}//mel by obnovit puvodni stav pred $R-, nevim, jestli uz Delphi umi zapamatovat/obnovit stav direktivy
  14.  

A nakonec pouziti:
Kód: Delphi [Vybrat]
  1. var
  2.   r: real;
  3. ...
  4.   r := GetDim2RealValue(addr(A), low(A), high(A), low(A[low(A)]), high(A[low(A)]), 2, 3);
  5.  

Na tomhle pripadu je videt, proc se ve vetsine jazyku natvrdo indexuji pole od nuly, coz muzes samorejme taky udelat. 
19
Obecné / Re:DLL - tabuľky v nej či v DB
« Poslední příspěvek od Stanislav Hruška kdy 22-01-2022, 10:48:29 »
Našiel som dve veci:
Kód: [Vybrat]
type
  TData = array of integer;
  PData = ^TData;
.
procedure IncArray(data: PData);
var i : integer;
begin
  for i := Low(data^) to High(data^) do
    data^[i] := data^[i] + 5;
end;
.
Type
  TMyArray = Array[1..30] Of SomeThing;
Procedure DoStuff(Var AnArray : TMyArray);
Begin
  {whatever}
End;
Prvé si musím vyskúšať či to je vôbec vhodné riešenie pre dvojrozmerné pole.
Druhé riešenie vyzerá (pre mňa) lepšie. Akurát
  • nebudem mať polia ako konštanty a
  • hneď pri definícii priradím aj obsah poľa
20
Obecné / Re:DLL - tabuľky v nej či v DB
« Poslední příspěvek od Stanislav Hruška kdy 22-01-2022, 10:14:26 »

Mám funkciu, ktorej potrebujem odovzdať pole. Jeden zo spôsobov je definovať type. Problém je v počte polí. Polí je 127, druhov (iná veľkosť) asi 25.
To je priveľa na také riešenie.
Exituje nejaké iné univerzálne riešenie? Tu som k tomu našiel dva návrhy:
Citace
Udelej si pole jako typ, ktery dana fce vraci nebo predavej pole odkazem do fce.
Neviem ako sa realizuje riešenie s odkazom.
.
Možno by sa toto dalo aplikovať. Pri rýchlom prečítaní to neviem posúdiť:
#8
https://forum.delphi.cz/index.php/topic,10364.msg60157.html#msg60157
Idem sa medzitým pozrieť na cudzojazyčné weby.

Stran: 1 [2] 3 4 ... 10