Jump to content

Alberto Paganini

Members
  • Content Count

    45
  • Joined

  • Last visited

Everything posted by Alberto Paganini

  1. Hello Everybody, I am looking for the equivalent of the Excel function LINEST in Delphi but I cannot find it. Do you know any library has it? Many thanks Alberto
  2. Alberto Paganini

    One more memory leak and FastMM4

    TBetFairApi.GetToken works perfectly now, thank you very much! Now I have to debug the rest because, you are right, there is another leak elsewhere. I will work on a minimal example. Thank you again, everybody. I have learnt a few new things !
  3. Alberto Paganini

    One more memory leak and FastMM4

    I did more investigation on the leaking instruction and found out that LJSONValue.Value; is UnicodeString. As FToken was a string I changed FToken into a UnicodeString but this didn't change anything. I don't know if this can help.
  4. Alberto Paganini

    One more memory leak and FastMM4

    Hi Remy, I tried the code you suggests but I still have leaks. The following is the report: --------------------------------2020/6/24 16:32:52-------------------------------- A memory block has been leaked. The size is: 116 This block was allocated by thread 0x2D9C, and the stack trace (return addresses) at the time was: 404DA6 [System.pas][System][@GetMem$qqri][3454] 408BBB [System.pas][System][@NewUnicodeString$qqri][19030] 408DEC [System.pas][System][@UStrFromPWCharLen$qqrr20System.UnicodeStringpbi][19697] 40A0C9 [System.pas][System][@UStrCopy$qqrx20System.UnicodeStringii][24873] E5CAD3 [Data.DBXPlatform.pas][Data.DBXPlatform][Dbxplatform.TDBXStringBuffer.ToString$qqrv][697] E8E8BC [Data.DBXJSON.pas][Data.DBXJSON][Dbxjson.TJSONString.Value$qqrv][1541] E92948 [uBetFair.pas][uBetFair][TBetFairApi.GetToken$qqrv][238] E92E00 [uTokenBL.pas][uTokenBL][TTokenBL.GetToken$qqrv][30] E5B593 [Main.pas][Main][TMainForm.FormActivate$qqrp14System.TObject][402] 557ED9 [Vcl.Forms][Forms.TCustomForm.Activate$qqrv] 558F99 [Vcl.Forms][Forms.TCustomForm.CMActivate$qqrr27Winapi.Messages.TWMNoParams] 4B4930 [Vcl.Controls.pas][Vcl.Controls][Controls.TControl.WndProc$qqrr24Winapi.Messages.TMessage][7204] 76EAC431 [Unknown function at gapfnScSendMessage] 76EAC3EE [Unknown function at gapfnScSendMessage] 76EAC380 [Unknown function at gapfnScSendMessage] The block is currently used for an object of class: UnicodeString The allocation number is: 60670 and the following is the line 238 FToken := LJSONValue.Value; I am confused here. If I don't have to free TJSONValue why is there this line in the code you propose? finally LJSONValue.Free; end; What am I missing here?
  5. Alberto Paganini

    One more memory leak and FastMM4

    I will answer your questions here below. 1) I didn't know about the FreeAndNil. I will google it and find out the details of when to use it and when not to. 2) FidHTTP, FList, FIdSSL are private variable of TBetFairApi. As these classes were used in two different procedures I declared this way to share them. No problem, declaring them locally will make the code more readable and maintainable. 3) This is very good advice indeed. I will follow it going forward 4) FToken is a private string which is used in a number of procedures in TBetFairApi. This is also linked to the TBetFairApi.Token property. The result of TBetFairApi.GetToken is a boolean because it was easier for me to do unit testing. I may change it in the future tho. 6) I think this is because this function comes from another version of Delphi hence the IFDEFs. I may change it in the future. 😎 FToken is UnicodeString now 5) I tried your code but it always gives me a leak on the line 235 which are the lines you suggested. UniqueString(FToken); or FToken := Trim(FToken+' '); here is the report --------------------------------2020/6/24 16:25:39-------------------------------- A memory block has been leaked. The size is: 116 This block was allocated by thread 0x2FA8, and the stack trace (return addresses) at the time was: 404DA6 [System.pas][System][@GetMem$qqri][3454] 408BBB [System.pas][System][@NewUnicodeString$qqri][19030] 4091AF [System.pas][System][InternalUniqueStringU$qqrr20System.UnicodeString][20569] E929AA [uBetFair.pas][uBetFair][TBetFairApi.GetToken$qqrv][235] E92E8C [uTokenBL.pas][uTokenBL][TTokenBL.GetToken$qqrv][30] E5B593 [Main.pas][Main][TMainForm.FormActivate$qqrp14System.TObject][402] 557ED9 [Vcl.Forms][Forms.TCustomForm.Activate$qqrv] 558F99 [Vcl.Forms][Forms.TCustomForm.CMActivate$qqrr27Winapi.Messages.TWMNoParams] 4B4930 [Vcl.Controls.pas][Vcl.Controls][Controls.TControl.WndProc$qqrr24Winapi.Messages.TMessage][7204] 76EAC431 [Unknown function at gapfnScSendMessage] 76EAC3EE [Unknown function at gapfnScSendMessage] 76EAC380 [Unknown function at gapfnScSendMessage] 76EAC431 [Unknown function at gapfnScSendMessage] 76EAC3EE [Unknown function at gapfnScSendMessage] 76EA4D0E [Unknown function at GetScrollBarInfo]
  6. Alberto Paganini

    One more memory leak and FastMM4

    Here is the revised code: function TBetFairApi.GetToken: Boolean; var LJSONObject: TJSONObject; LJSONValue: TJSONValue; s:string; IdLogFile:TIdLogFile; begin try Result := False; FidHTTP := TidHTTP.Create(nil); FidHTTP.HTTPOptions := FidHTTP.HTTPOptions - [hoForceEncodeParams]; IdLogFile:=TIdLogFile.Create(FidHTTP); FidHTTP.Intercept := IdLogFile; s:=ExtractFileName(ParamStr((0))); s:=Copy(s,1,Pos('.',s)-1); TIdLogFile(FidHTTP.Intercept).Filename := 'c:\'+s+'.log'; TIdLogFile(FidHTTP.Intercept).Active := true; FList := TStringList.Create; FIdSSL := TIdSSLIOHandlerSocketOpenSSL.Create; FIdSSL.SSLOptions.Method:=sslvTLSv1_2; FidHTTP.Request.Accept := 'application/json'; FidHTTP.Request.CustomHeaders.Clear; FidHTTP.Request.CustomHeaders.AddValue('X-Application', cBetfair_AppKey); FList.Clear; FList.Add('username=' + FUserID); FList.Add('password=' + FPassword); FidHTTP.Request.ContentType := 'application/x-www-form-urlencoded'; FidHTTP.HandleRedirects := true; {$IFDEF VER230} FidHTTP.IOHandler := FIdSSL; {$ENDIF} LJSONObject := TJSONObject.ParseJSONValue(FidHTTP.Post(URL_LOGIN, FList)) as TJSONObject; // This is line 218 try if Assigned(LJSONObject) then begin LJSONValue := LJSONObject.{$IFDEF VER230}Get('token').JsonValue{$ELSE}Values['token']{$ENDIF}; try if Assigned(LJSONValue) then begin FToken := LJSONValue.Value; Result := True; end; finally FreeAndNil(LJSONValue); // I free the object as soon as I don't need any longer end; end; finally FreeAndNil(LJSONObject); end; finally FreeAndNil(IdLogFile); FreeAndNil(FidHTTP); {$IFDEF VER230} FreeAndNil(FIdSSL); {$ENDIF} FreeAndNil(FList); end; end; and this is the leak report from FastMM4 --------------------------------2020/6/23 21:33:53-------------------------------- FastMM has detected an attempt to call a virtual method on a freed object. An access violation will now be raised in order to abort the current operation. Freed object class: Data.DBXJSON.TJSONString Virtual method: Offset +16 Virtual method address: E8D644 The allocation number was: 60454 The object was allocated by thread 0xAD4, and the stack trace (return addresses) at the time was: 406E0F [System.pas][System][TObject.NewInstance$qqrv][13000] 40747E [System.pas][System][@ClassCreate$qqrpvzc][14164] E8E3E7 [Data.DBXJSON.pas][Data.DBXJSON][Dbxjson.TJSONString.$bctr$qqrx20System.UnicodeString][1410] E8FD6C [Data.DBXJSON.pas][Data.DBXJSON][Dbxjson.TJSONObject.ParseString$qqrpx28Data.Dbxjson.TJSONByteReaderpx26Data.Dbxjson.TJSONAncestor][2235] E8F78E [Data.DBXJSON.pas][Data.DBXJSON][Dbxjson.TJSONObject.ParseValue$qqrpx28Data.Dbxjson.TJSONByteReaderpx26Data.Dbxjson.TJSONAncestor][2010] E8F5F5 [Data.DBXJSON.pas][Data.DBXJSON][Dbxjson.TJSONObject.ParsePair$qqrpx28Data.Dbxjson.TJSONByteReaderpx24Data.Dbxjson.TJSONObject][1958] E8F476 [Data.DBXJSON.pas][Data.DBXJSON][Dbxjson.TJSONObject.Parse$qqrpx28Data.Dbxjson.TJSONByteReader][1892] E8F577 [Data.DBXJSON.pas][Data.DBXJSON][Dbxjson.TJSONObject.ParseObject$qqrpx28Data.Dbxjson.TJSONByteReaderpx26Data.Dbxjson.TJSONAncestor][1938] E8F7AA [Data.DBXJSON.pas][Data.DBXJSON][Dbxjson.TJSONObject.ParseValue$qqrpx28Data.Dbxjson.TJSONByteReaderpx26Data.Dbxjson.TJSONAncestor][2024] E8EE51 [Data.DBXJSON.pas][Data.DBXJSON][Dbxjson.TJSONObject.ParseJSONValue$qqrx25System.%DynamicArray$tuc%xixio][1666] 432D26 [System.SysUtils][Sysutils.TEncoding.GetBytes$qqrx20System.UnicodeString] E8EDF0 [Data.DBXJSON.pas][Data.DBXJSON][Dbxjson.TJSONObject.ParseJSONValue$qqrx25System.%DynamicArray$tuc%xio][1651] E8EED1 [Data.DBXJSON.pas][Data.DBXJSON][Dbxjson.TJSONObject.ParseJSONValue$qqrx20System.UnicodeString][1677] E92947 [uBetFair.pas][uBetFair][TBetFairApi.GetToken$qqrv][218] E92EE0 [uTokenBL.pas][uTokenBL][TTokenBL.GetToken$qqrv][30] The object was subsequently freed by thread 0xAD4, and the stack trace (return addresses) at the time was: 404DC2 [System.pas][System][@FreeMem$qqrpv][3502] 406E2D [System.pas][System][TObject.FreeInstance$qqrv][13006] 4074C9 [System.pas][System][@ClassDestroy$qqrp14System.TObject][14206] E8E455 [Data.DBXJSON.pas][Data.DBXJSON][Dbxjson.TJSONString.$bdtr$qqrv][1419] 406E73 [System.pas][System][TObject.Free$qqrv][13025] E929CE [uBetFair.pas][uBetFair][TBetFairApi.GetToken$qqrv][230] E92EE0 [uTokenBL.pas][uTokenBL][TTokenBL.GetToken$qqrv][30] E5B593 [Main.pas][Main][TMainForm.FormActivate$qqrp14System.TObject][402] 557ED9 [Vcl.Forms][Forms.TCustomForm.Activate$qqrv] 558F99 [Vcl.Forms][Forms.TCustomForm.CMActivate$qqrr27Winapi.Messages.TWMNoParams] 4B4930 [Vcl.Controls.pas][Vcl.Controls][Controls.TControl.WndProc$qqrr24Winapi.Messages.TMessage][7204] 7600C431 [Unknown function at gapfnScSendMessage] 7600C3EE [Unknown function at gapfnScSendMessage] 7600C380 [Unknown function at gapfnScSendMessage] 7600C431 [Unknown function at gapfnScSendMessage] The current thread ID is 0xAD4, and the stack trace (return addresses) leading to this error is: 406E73 [System.pas][System][TObject.Free$qqrv][13025] E8F12D [Data.DBXJSON.pas][Data.DBXJSON][Dbxjson.TJSONObject.$bdtr$qqrv][1762] 406E73 [System.pas][System][TObject.Free$qqrv][13025] E929F6 [uBetFair.pas][uBetFair][TBetFairApi.GetToken$qqrv][234] E92EE0 [uTokenBL.pas][uTokenBL][TTokenBL.GetToken$qqrv][30] E5B593 [Main.pas][Main][TMainForm.FormActivate$qqrp14System.TObject][402] 557ED9 [Vcl.Forms][Forms.TCustomForm.Activate$qqrv] 558F99 [Vcl.Forms][Forms.TCustomForm.CMActivate$qqrr27Winapi.Messages.TWMNoParams] 4B4930 [Vcl.Controls.pas][Vcl.Controls][Controls.TControl.WndProc$qqrr24Winapi.Messages.TMessage][7204] 7600C431 [Unknown function at gapfnScSendMessage] 7600C3EE [Unknown function at gapfnScSendMessage] 7600C380 [Unknown function at gapfnScSendMessage] 7600C431 [Unknown function at gapfnScSendMessage] 7600C3EE [Unknown function at gapfnScSendMessage] 76004D0E [Unknown function at GetScrollBarInfo] Current memory dump of 256 bytes starting at pointer address 7F2FEFC0: 94 B2 F1 00 80 80 80 80 80 80 80 80 80 80 80 80 A9 74 9A 96 80 80 80 80 00 00 00 00 61 E5 2F 7F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 27 EC 00 00 0F 6E 40 00 7E 74 40 00 6F CA E5 00 18 6E 40 00 7E 74 40 00 04 E4 E8 00 6C FD E8 00 8E F7 E8 00 F5 F5 E8 00 76 F4 E8 00 77 F5 E8 00 AA F7 E8 00 51 EE E8 00 26 2D 43 00 F0 ED E8 00 D4 0A 00 00 D4 0A 00 00 C2 4D 40 00 2D 6E 40 00 C9 74 40 00 66 6E 40 00 73 6E 40 00 3F E4 E8 00 73 6E 40 00 CE 29 E9 00 E0 2E E9 00 93 B5 E5 00 D9 7E 55 00 99 8F 55 00 30 49 4B 00 31 C4 00 76 EE C3 00 76 10 00 00 00 18 C3 E5 00 9F 4C 8D 7C 94 B2 F1 00 80 80 80 80 80 80 80 80 80 80 80 80 60 B3 72 83 80 80 80 80 00 00 00 00 80 B7 2F 7F 00 00 00 00 00 00 00 00 80 47 41 00 00 00 00 00 59 EC 00 00 A6 4D 40 00 0F 6E 40 00 7E 74 40 00 ” ² ñ . € € € € € € € € € € € € © t š – € € € € . . . . a å / � . . . . . . . . . . . . . . . . ' ì . . . n @ . ~ t @ . o Ê å . . n @ . ~ t @ . . ä è . l ý è . Ž ÷ è . õ õ è . v ô è . w õ è . ª ÷ è . Q î è . & - C . ð í è . Ô . . . Ô . . . Â M @ . - n @ . É t @ . f n @ . s n @ . ? ä è . s n @ . Î ) é . à . é . “ µ å . Ù ~ U . ™ � U . 0 I K . 1 Ä . v î Ã . v . . . . . Ã å . Ÿ L � | ” ² ñ . € € € € € € € € € € € € ` ³ r ƒ € € € € . . . . € · / � . . . . . . . . € G A . . . . . Y ì . . ¦ M @ . . n @ . ~ t @ . I put a breakpoint on the line FreeAndNil(IdLogFile) and LJSONValue is nil
  7. Alberto Paganini

    One more memory leak and FastMM4

    Get('token') return a TJSONPair object I tried to add the following after having retrieved the value: LJSONObject.Free; LJSONValue.Free; LJSONObject.Get('token').Free; LJSONObject.Get('token').JsonValue.Free; but all of them made things worse
  8. Alberto Paganini

    One more memory leak and FastMM4

    The line 222 in TBetFairApi.GetToken is if Assigned(LJSONValue) I tried FreeAndNil(LJSONValue) after having retrieved the value but this generates additional errors. I know and I appreciate that.
  9. Alberto Paganini

    One more memory leak and FastMM4

    Sorry, Delphi XE2 I have added it to my profile now.
  10. I have fixed all the leaks related to units I have developed but now I ran into the following: --------------------------------2020/6/21 15:43:36-------------------------------- A memory block has been leaked. The size is: 36 This block was allocated by thread 0x26AC, and the stack trace (return addresses) at the time was: 404DA6 [System.pas][System][@GetMem$qqri][3454] 408BBB [System.pas][System][@NewUnicodeString$qqri][19030] 409E37 [System.pas][System][@UStrSetLength$qqrr20System.UnicodeStringi][24243] 409E8E [System.pas][System][@UStrCat$qqrr20System.UnicodeStringx20System.UnicodeString][24326] C2B610 [IdURI.pas][IdURI][TIdURI.GetPathAndParams$qqrv][672] C60593 [IdHttp.pas][IdHTTP][TIdCustomHTTP.PrepareRequest$qqrp21Idhttp.TIdHTTPRequest][1828] C635FE [IdHttp.pas][IdHTTP][TIdCustomHTTP.DoRequest$qqrx20System.UnicodeString20System.UnicodeStringp22System.Classes.TStreamt3psxi][3156] C1E193 [IdIOHandlerStack.pas][IdIOHandlerStack][TIdIOHandlerStack.Connected$qqrv][244] C5DE5B [IdHttp.pas][IdHTTP][TIdCustomHTTP.Post$qqr20System.UnicodeStringp22System.Classes.TStreamt2][812] C5E6E5 [IdHttp.pas][IdHTTP][TIdCustomHTTP.Post$qqr20System.UnicodeStringp23System.Classes.TStringsp22System.Classes.TStream52System.%DelphiInterface$t24Idglobal.IIdTextEncoding%][1067] C5E804 [IdHttp.pas][IdHTTP][TIdCustomHTTP.Post$qqr20System.UnicodeStringp23System.Classes.TStrings52System.%DelphiInterface$t24Idglobal.IIdTextEncoding%][1084] The block is currently used for an object of class: UnicodeString The allocation number is: 58517 Current memory dump of 256 bytes starting at pointer address 7F35D810: B0 04 02 00 01 00 00 00 0A 00 00 00 2F 00 61 00 70 00 69 00 2F 00 6C 00 6F 00 67 00 69 00 6E 00 00 00 E1 8F B9 72 80 80 00 00 00 00 F1 D8 35 7F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 48 E3 00 00 A6 4D 40 00 0F 6E 40 00 55 CC 40 00 7E 74 40 00 8E AA EB 00 CB 5E 73 00 09 9A EC 00 C3 FC ED 00 CB 2B 8D 00 51 64 8F 00 55 18 7B 00 AC 26 00 00 AC 26 00 00 C2 4D 40 00 2D 6E 40 00 C9 74 40 00 94 AB EB 00 BB CC 40 00 C7 CB 40 00 D5 A7 40 00 C5 A6 40 00 E3 6E 40 00 26 6E 40 00 C9 74 40 00 20 00 00 00 90 A8 EB 00 E8 0B 67 89 94 A2 F1 00 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 17 F4 98 76 80 80 80 80 00 00 00 00 C1 DD 35 7F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 17 E3 00 00 A6 4D 40 00 0F 6E 40 00 55 CC 40 00 ° . . . . . . . . . . . / . a . p . i . / . l . o . g . i . n . . . á � ¹ r € € . . . . ñ Ø 5 � . . . . . . . . . . . . . . . . H ã . . ¦ M @ . . n @ . U Ì @ . ~ t @ . Ž ª ë . Ë ^ s . . š ì . Ã ü í . Ë + � . Q d � . U . { . ¬ & . . ¬ & . . Â M @ . - n @ . É t @ . ” « ë . » Ì @ . Ç Ë @ . Õ § @ . Å ¦ @ . ã n @ . & n @ . É t @ . . . . � ¨ ë . è . g ‰ ” ¢ ñ . € € € € € € € € € € € € € € € € € € € € € € € € € € € € . ô ˜ v € € € € . . . . Á Ý 5 � . . . . . . . . . . . . . . . . . ã . . ¦ M @ . . n @ . U Ì @ . I haven't developed or amended any of the units mentioned in the report. I strongly doubt there is a leak in the units mentioned in the report as they are either part of the VCL or part of Indy but at the same time, I don't know where I can find the leak in my code. Can anybody help me? Many thanks Alberto
  11. Alberto Paganini

    Again with memory leaks and FastMM4

    Yes, the following is the destructor now destructor TBetFairApi.Destroy; begin //if Assigned(FList) then // FList.Free; // if Assigned(FidHTTP) then // FidHTTP.Free; // {$IFDEF VER230} // if Assigned(FIdSSL) then // // FIdSSL.Free; // {$ENDIF} inherited Destroy; end; before the code was not commented on.
  12. Alberto Paganini

    Again with memory leaks and FastMM4

    I moved FreeAndNil(IdHttp) from the Destructor to the procedure where IdHttp is created and no more leaks. This suggests a bad design of the class (I made it) and I will look into that again because it seems the destructor is not invoked. I double-checked and in the declaration section and the destructor has override in it, correctly.
  13. Alberto Paganini

    Again with memory leaks and FastMM4

    This is something I am rather sure not to be the case as I avoid exits as much as possible. I will check these too though. I am running the application step by step and see the objects created at run time and see where/if they are released. Thanks everybody for your help Alberto
  14. I have started removing memory leaks in my application and installed and configured FastMM4. I ran the application and the following is an excerpt from the memory leaks report. --------------------------------2020/6/20 21:24:00-------------------------------- A memory block has been leaked. The size is: 100 This block was allocated by thread 0x13C4, and the stack trace (return addresses) at the time was: 404DA6 [System.pas][System][@GetMem$qqri][3454] 406E0F [System.pas][System][TObject.NewInstance$qqrv][13000] 40747E [System.pas][System][@ClassCreate$qqrpvzc][14164] 45926E [System.Classes.pas][System.Classes][Classes.TStringList.$bctr$qqrv][6408] EAF697 [uBetFairAPIHorseHelperBL.pas][uBetFairAPIHorseHelperBL][TBetFairAPIHorseHelperBL.ResetEventID$qqrv][921] EAED20 [uBetFairAPIHorseHelperBL.pas][uBetFairAPIHorseHelperBL][TBetFairAPIHorseHelperBL.ListEvents$qqr20System.UnicodeString][611] D4C0EB [DBAccess][TCustomDADataSet.GetRecordCount$qqrv] E92D6A [uTokenBL.pas][uTokenBL][TTokenBL.GetTokenID$qqrv][34] E5A73D [Main.pas][Main][TMainForm.btnFindRacesClick$qqrp14System.TObject][190] E5B5C5 [Main.pas][Main][TMainForm.FormActivate$qqrp14System.TObject][418] 557E7D [Vcl.Forms][Forms.TCustomForm.Activate$qqrv] The block is currently used for an object of class: System.Classes.TStringList The allocation number is: 199660 Current memory dump of 256 bytes starting at pointer address 7F322C00: 2C A7 44 00 00 00 00 00 00 00 00 00 40 B7 A9 7F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 88 40 34 7F 01 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FC CD 79 80 80 80 80 80 80 80 80 00 00 00 00 01 33 32 7F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 99 E6 0B 00 A6 4D 40 00 0F 6E 40 00 7E 74 40 00 6E 92 45 00 18 6E 40 00 7E 74 40 00 2D 37 D7 00 CA 53 D7 00 A3 11 DA 00 93 E9 D3 00 A8 4F D4 00 C4 13 00 00 C4 13 00 00 C2 4D 40 00 2D 6E 40 00 C9 74 40 00 23 8B 45 00 73 6E 40 00 8E 37 D7 00 73 6E 40 00 67 54 D7 00 ED 11 DA 00 73 6E 40 00 EB 37 CD 00 5C 00 00 00 2C A7 44 00 26 3A 59 8A 94 A2 F1 00 80 80 80 80 80 80 80 80 80 80 80 80 , § D . . . . . . . . . @ · © � . . . . . . . . . . . . . . . . . . . . . . . . . . . . ˆ @ 4 � . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ÿ ü Í y € € € € € € € € . . . . . 3 2 � . . . . . . . . . . . . . . . . ™ æ . . ¦ M @ . . n @ . ~ t @ . n ’ E . . n @ . ~ t @ . - 7 × . Ê S × . £ . Ú . “ é Ó . ¨ O Ô . Ä . . . Ä . . . Â M @ . - n @ . É t @ . # ‹ E . s n @ . Ž 7 × . s n @ . g T × . í . Ú . s n @ . ë 7 Í . \ . . . , § D . & : Y Š ” ¢ ñ . € € € € € € € € € € € € As this is the first time I use FastMM4 I don't know how to start to fix the leaks. Can somebody point out a tutorial that starts from scratch on this topic? Many thanks Alberto
  15. Alberto Paganini

    Fixing memory leaks with FastMM4

    Thank you very much for your answer, Alexander. Is there anything on the web that teaches how to read the report?
  16. Alberto Paganini

    LINEST function

    I have found here https://support.office.com/en-gb/article/linest-function-84d7d0d9-6e50-4101-977a-fa7abf772b6d the formula and I was able to implement my solution: program Project3; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; function Linest(x, y: array of Double): Double; var AverageX, AverageY: Double; Total: Double; I: Integer; XMinusAverageX: Double; YMinusAverageY: Double; XMinusAverageXSquare: Double; XMinusAverageXByYMinusAverageY: Double; TotalXMinusAverageXSquare: Double; TotalXMinusAverageXByYMinusAverageY: Double; begin Total := 0; for I := 0 to Length(x) - 1 do Total := Total + x[I]; AverageX := Total / Length(x); Total := 0; for I := 0 to Length(y) - 1 do Total := Total + y[I]; AverageY := Total / Length(y); TotalXMinusAverageXSquare := 0; TotalXMinusAverageXByYMinusAverageY := 0; for I := 0 to Length(x) - 1 do begin XMinusAverageX := x[I] - AverageX; YMinusAverageY := y[I] - AverageY; XMinusAverageXSquare := Sqr(XMinusAverageX); XMinusAverageXByYMinusAverageY := XMinusAverageX * YMinusAverageY; TotalXMinusAverageXSquare := TotalXMinusAverageXSquare + XMinusAverageXSquare; TotalXMinusAverageXByYMinusAverageY := TotalXMinusAverageXByYMinusAverageY + XMinusAverageXByYMinusAverageY; end; Result := TotalXMinusAverageXByYMinusAverageY / TotalXMinusAverageXSquare; end; const ArrayDimension = 14; var x, y: array of Double; I: Integer; aResult: Double; begin SetLength(x, ArrayDimension); for I := 0 to Length(x) - 1 do x[I] := I; SetLength(y, ArrayDimension); y[0] := 184.45; y[1] := 134.71; y[2] := 157.16; y[3] := 168.63; y[4] := 219.83; y[5] := 247.9; y[6] := 247.37; y[7] := 247.37; y[8] := 343.45; y[9] := 570.45; y[10] := 558.21; y[11] := 559.39; y[12] := 559.39; y[13] := 559.39; aResult := Linest(x, y); end. This is just a simplification of the function because LINEST can accept more parameters but this is what I needed.
  17. Alberto Paganini

    IDE Code Coverage Plugin available

    Hi Uwe, Does it work for XE2 ?
×