Local procedure/function '_GetValue2' assigned to procedure variable

Local procedure/function '_GetValue2' assigned to procedure variable
MR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 120
0

Przerabiam pewną funkcję i napotkałem problem, którego nie potrafię obejść
Mam globalną zmienną typu record

Kopiuj
 temp_list = record
                idsys,idskl : integer;
                nazwa : string;
                wartosc : real;

Otóż wcześniej miałem globalną zmienną lista_sum:array[0..100] of temp_list;
oraz dwie funkcje

Kopiuj
function _GetValue2(i:integer):real;
    var k:integer;
    begin
      Result:=0;
      for k:=0 to 100 do
        if lista_sum[k].idskl=i then
       begin
        Result:= lista_sum[k].wartosc; 
        Break;
      end;
    end;

    function _GetFunction2(nr:integer; par:integer=0):real;
    var k:integer;
    begin
      Result:=0;
        for k:=0 to 100 do
          if lista_sum[k].idsys=par then begin
          Result:= lista_sum[k].wartosc;
          Break;
        end;
      end;
    end;

wcześniej te dwie funkcje były podstawiane jako parametry do kolejnej funkcji
function Analyze(s:string; v:TGetValue; fc:TGetFunction):real;

Kopiuj
val:= Analyze(MmDM.SkladnikTDefinicja.AsString,_GetValue2,_GetFunction2);   <- tutaj error Local procedure/function '_GetValue2' assigned to procedure variable

i to zawsze działało

i teraz przeniosłem lista_sum oraz te dwie funkcje jako lokalne i kompilator już zgłasza błąd na linii wywołania Analize

Do się to zrobić w ten sposób?

hzmzp
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 758
1

Błąd kompilatora, gdy próbujesz przypisać lokalną funkcję do parametru typu proceduralnego (czyli wskaźnika na funkcję). Funkcja lokalna (zadeklarowana wewnątrz innej funkcji) nie może być przypisana do zmiennej proceduralnej (np. parametru typu TGetValue, TGetFunction). Wynika to z tego, że lokalne funkcje mają ukryty dostęp do zewnętrznych zmiennych, czego klasyczne wskaźniki na funkcje nie wspierają, chyba że używasz typu reference to function, ale to tylko w nowszych wersjach Delphi).
Nie wiem którą wersje delphi masz ale 2009+ powinno działać

Kopiuj
type
  TGetValue = reference to function(i: integer): real;
  TGetFunction = reference to function(nr: integer; par: integer = 0): real;

...

var
  lista_sum: array[0..100] of temp_list;
  GetValue: TGetValue;
  GetFunction: TGetFunction;

begin
  // lokalna funkcja jako lambda
  GetValue := function(i: integer): real
  var k: integer;
  begin
    Result := 0;
    for k := 0 to 100 do
      if lista_sum[k].idskl = i then
      begin
        Result := lista_sum[k].wartosc;
        Break;
      end;
  end;

  GetFunction := function(nr: integer; par: integer = 0): real
  var k: integer;
  begin
    Result := 0;
    for k := 0 to 100 do
      if lista_sum[k].idsys = par then
      begin
        Result := lista_sum[k].wartosc;
        Break;
      end;
  end;

  val := Analyze(MmDM.SkladnikTDefinicja.AsString, GetValue, GetFunction);
end;


Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.