var_parameter.ob 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. MODULE m;
  2. TYPE
  3. PR = POINTER TO R;
  4. R = RECORD i: INTEGER; byte: BYTE; a: ARRAY 3 OF INTEGER; p: POINTER TO R END;
  5. VAR
  6. i: INTEGER;
  7. byte: BYTE;
  8. b: BOOLEAN;
  9. a: ARRAY 5 OF INTEGER;
  10. byteArray: ARRAY 3 OF BYTE;
  11. PROCEDURE p1(VAR i1, i2: INTEGER; VAR byte: BYTE);
  12. BEGIN
  13. i1 := 1;
  14. i2 := 2;
  15. byte := 3;
  16. END p1;
  17. PROCEDURE p2(i: INTEGER; byte: BYTE; b: BOOLEAN);
  18. END p2;
  19. PROCEDURE index(VAR i: INTEGER): INTEGER;
  20. RETURN i
  21. END index;
  22. PROCEDURE indexByte(VAR b: BYTE): BYTE;
  23. RETURN b
  24. END indexByte;
  25. PROCEDURE array(VAR a: ARRAY OF INTEGER): INTEGER;
  26. RETURN a[0]
  27. END array;
  28. PROCEDURE p3(VAR i: INTEGER; VAR byte: BYTE; VAR b: BOOLEAN);
  29. VAR j: INTEGER;
  30. r: R;
  31. ar: ARRAY 5 OF R;
  32. ai: ARRAY 5 OF INTEGER;
  33. BEGIN
  34. j := i + 1;
  35. j := 2 * i;
  36. j := i DIV 2;
  37. j := -i;
  38. b := ~b;
  39. a[i] := i;
  40. p1(j, i, byte);
  41. p1(i, j, byte);
  42. p1(i, a[index(i)], byteArray[indexByte(byte)]);
  43. p2(i, byte, b);
  44. p1(r.i, ar[index(r.i)].i, ar[index(r.i)].byte);
  45. NEW(r.p);
  46. NEW(ar[j].p);
  47. p1(r.p.i, ar[j].p.i, ar[j].p.byte);
  48. p2(ar[j].p.i, ar[j].p.byte, r.p.i = ar[j].p.i);
  49. j := array(ai);
  50. j := array(r.a);
  51. END p3;
  52. PROCEDURE testPointerDereferenceAndPassAsVAR(p: PR);
  53. PROCEDURE innerVAR(VAR r: R);
  54. END innerVAR;
  55. PROCEDURE innerConstVAR(r: R);
  56. END innerConstVAR;
  57. BEGIN
  58. innerVAR(p^);
  59. innerConstVAR(p^);
  60. END testPointerDereferenceAndPassAsVAR;
  61. BEGIN
  62. p3(i, byte, b)
  63. END m.