fork download
  1. program ideone;
  2.  
  3. {$MODE OBJFPC}
  4.  
  5. type
  6. Val = record
  7. id: Integer;
  8. name: String;
  9. end;
  10. Ref = class
  11. public
  12. id: Integer;
  13. name: String;
  14. end;
  15.  
  16. function NewVal(id: Integer; name: String): Val;
  17. begin
  18. Result.id := id;
  19. Result.name := name;
  20. end;
  21.  
  22. function NewRef(id: Integer; name: String): Ref;
  23. begin
  24. Result := Ref.Create;
  25. Result.id := id;
  26. Result.name := name;
  27. end;
  28.  
  29. procedure PrintVal(const s: String; const v: Val);
  30. begin
  31. WriteLn('ValBy' + s, v.id, ' ', v.name);
  32. end;
  33.  
  34. procedure PrintRef(const s: String; const r: Ref);
  35. begin
  36. WriteLn('RefBy' + s, r.id, ' ', r.name);
  37. end;
  38.  
  39. procedure ValByVal(v: Val);
  40. begin
  41. v.name := 'Foo';
  42. v := NewVal(123, 'Bar');
  43. end;
  44.  
  45. procedure RefByVal(r: Ref);
  46. begin
  47. r.name := 'Foo';
  48. r := NewRef(123, 'Bar');
  49. end;
  50.  
  51. procedure ValByRef(var v: Val);
  52. begin
  53. v.name := 'Foo';
  54. v := NewVal(123, 'Bar');
  55. end;
  56.  
  57. procedure RefByRef(var r: Ref);
  58. begin
  59. r.name := 'Foo';
  60. r := NewRef(123, 'Bar');
  61. end;
  62.  
  63. procedure DemoValByVal;
  64. var v: Val;
  65. begin
  66. v := NewVal(456, 'Val');
  67. PrintVal('Val Before: ', v);
  68. ValByVal(v);
  69. PrintVal('Val After: ', v);
  70. end;
  71.  
  72. procedure DemoRefByVal;
  73. var r: Ref;
  74. begin
  75. r := NewRef(456, 'Ref');
  76. PrintRef('Val Before: ', r);
  77. RefByVal(r);
  78. PrintRef('Val After: ', r);
  79. end;
  80.  
  81. procedure DemoValByRef;
  82. var v: Val;
  83. begin
  84. v := NewVal(456, 'Val');
  85. PrintVal('Ref Before: ', v);
  86. ValByRef(v);
  87. PrintVal('Ref After: ', v);
  88. end;
  89.  
  90. procedure DemoRefByRef;
  91. var r: Ref;
  92. begin
  93. r := NewRef(456, 'Ref');
  94. PrintRef('Ref Before: ', r);
  95. RefByRef(r);
  96. PrintRef('Ref After: ', r);
  97. end;
  98.  
  99. begin
  100. DemoValByVal;
  101. WriteLn;
  102. DemoRefByVal;
  103. WriteLn;
  104. DemoValByRef;
  105. WriteLn;
  106. DemoRefByRef;
  107. end.
Success #stdin #stdout 0s 4576KB
stdin
Standard input is empty
stdout
ValByVal Before: 456 Val
ValByVal After:  456 Val

RefByVal Before: 456 Ref
RefByVal After:  456 Foo

ValByRef Before: 456 Val
ValByRef After:  123 Bar

RefByRef Before: 456 Ref
RefByRef After:  123 Bar