Discussion:
[Lazarus] Runtime error: INCLOCKED
Valdas Jankūnas via Lazarus
2018-04-29 16:16:12 UTC
Permalink
Hello,

I'm stuck. I always getting weird error when executing this code (stripped down to minimum):

program project1;

type
TElement = record
strr: String;
end;
TList = array of TElement;
Plist = ^TList;

TSetting = record
list: Plist;
end;

const
_List: array [0..1] of TElement = (
(strr: 'a'),
(strr: 'b'));

_Settings: array [0..0] of TSetting = (
(list: @_List));

procedure Display(a: TList);
begin // <-------------------------------- line 23
writeln(' +++ ', a[0].strr);
end;

var
setting: TSetting;
begin
setting := _Settings[0];
writeln(' ---- ', Assigned(setting.list), ' ', Length(setting.list^));
Display(setting.list^);

end.


In console I get:

---- TRUE 2
Runtime error 216 at $0000000000400BD5
$0000000000400BD5 INCLOCKED
$0000000000400216 DISPLAY, line 23 of project1.lpr
$0000000000400360 main, line 32 of project1.lpr
$000000000042BE00 SYSENTRY, line 129 of system.pp
$00000000004001D2


Why I getting that error? Something wrong with records and constant initialization?

My system is: Linux 4.13.0-39-generic #44-Ubuntu SMP Thu Apr 5 14:25:01 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
FPC (from SVN): 3.1.1 [2018/02/21] for x86_64

--
Valdas Jankūnas
--
Vojtěch Čihák via Lazarus
2018-04-29 17:38:38 UTC
Permalink
Hi,
 
I changed line 7:
 
TElement = record
      strr: String;
  end;
  TList = array[0..1] of TElement;  //HERE
  Plist = ^TList;   
 
and demo works. Simply, static and dynamic arrays are not the same.
AFAIR, dynamic array is just pointer while static array are data.
I guess someone else will give you more detailed answer.
 
V.
______________________________________________________________
> Od: Valdas Jankūnas via Lazarus
> Komu: ***@lists.lazarus-ide.org
> Datum: 29.04.2018 18:16
> Předmět: [Lazarus] Runtime error: INCLOCKED
>

type
  TElement = record
      strr: String;
  end;
  TList = array of TElement;
  Plist = ^TList;
.....

Why I getting that error? Something wrong with records and constant initialization?

My system is: Linux 4.13.0-39-generic #44-Ubuntu SMP Thu Apr 5 14:25:01 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
FPC (from SVN): 3.1.1 [2018/02/21] for x86_64
--
  Valdas Jankūnas
--
_______________________________________________
Lazarus mailing list
***@lists.lazarus-ide.org
https://lists.lazarus-ide.org/listinfo/lazarus <https://lists.lazarus-ide.org/listinfo/lazarus>
Santiago A. via Lazarus
2018-05-11 09:36:51 UTC
Permalink
El 29/04/2018 a las 19:38, Vojtěch Čihák via Lazarus escribió:
>
> Hi,
>
>  
>
> I changed line 7:
>
>  
>
> TElement = record
>
>       strr: String;
>
>   end;
>
>   TList = array[0..1] of TElement;  //HERE
>
>   Plist = ^TList;   
>
>  
>
> and demo works. Simply, static and dynamic arrays are not the same.
>
> AFAIR, dynamic array is just pointer while static array are data.
>
> I guess someone else will give you more detailed answer.
>


Yes, but I think that it should be considered a FPC bug

  TList = array of TElement;
  Plist = ^TList;

  TSetting = record
      list: Plist;
  end;

const
  _List: array [0..1] of TElement = (
      (strr: 'a'),
      (strr: 'b'));

  _Settings: array [0..0] of TSetting = ( 
      (list: @_List)); //  <=== This line should rise a compiler error.
You are asigning a pointer to an static array to a pointer to a dynamic
array.

-------------------
You could add a type cast of the pointer to Plist

  _Settings: array [0..0] of TSetting = ( 
      (list: Plist(@_List) ));

You explicitly tell the complier to bypass type check, it is up to deal
with this potential dangerous




>  
>
> V.
>
> ______________________________________________________________
> > Od: Valdas Jankūnas via Lazarus
> > Komu: ***@lists.lazarus-ide.org
> > Datum: 29.04.2018 18:16
> > Předmět: [Lazarus] Runtime error: INCLOCKED
> >
>
>
> type
>   TElement = record
>       strr: String;
>   end;
>   TList = array of TElement;
>   Plist = ^TList;
> .....
>
> Why I getting that error? Something wrong with records and constant
> initialization?
>
> My system is: Linux 4.13.0-39-generic #44-Ubuntu SMP Thu Apr 5
> 14:25:01 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
> FPC (from SVN): 3.1.1 [2018/02/21] for x86_64
> --
>   Valdas Jankūnas
> --
> _______________________________________________
> Lazarus mailing list
> ***@lists.lazarus-ide.org
> https://lists.lazarus-ide.org/listinfo/lazarus
>
>

--
Saludos

Santiago A.
Valdas Jankūnas via Lazarus
2018-05-18 09:35:00 UTC
Permalink
2018-05-11 12:36, Santiago A. via Lazarus rašė:
> Yes, but I think that it should be considered a FPC bug
>
>   TList = array of TElement;
>   Plist = ^TList;
>
>   TSetting = record
>       list: Plist;
>   end;
>
> const
>   _List: array [0..1] of TElement = (
>       (strr: 'a'),
>       (strr: 'b'));
>
>   _Settings: array [0..0] of TSetting = (
>       (list: @_List)); //  <=== This line should rise a compiler error.
> You are asigning a pointer to an static array to a pointer to a dynamic
> array.

Reported: https://bugs.freepascal.org/view.php?id=33757

--
Valdas Jankūnas
--
Loading...