C_far

AMX: Handling dimensions array

Dec 6th, 2017
253
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 2.20 KB | None | 0 0
  1. #include "a_samp"
  2.  
  3. main()
  4. {
  5.     new
  6.         a[3] = {111, 222, 333},
  7.         b[5][5] =
  8.         {
  9.             {91, 92, 93, 94, 95},
  10.             {96, 97, 98, 99, 910},
  11.             {911, 912, 913, 914, 915},
  12.             {916, 917, 918, 919, 920},
  13.             {921, 922, 923, 924, 925}
  14.         },
  15.         c[3][3][3] =
  16.         {
  17.             {
  18.                 {1, 2, 3},
  19.                 {4, 5, 6},
  20.                 {7, 8, 9}
  21.             },
  22.             {
  23.                 {11, 22, 33},
  24.                 {44, 55, 66},
  25.                 {77, 88, 99}
  26.             },
  27.             {
  28.                 {111, 222, 333},
  29.                 {444, 555, 666},
  30.                 {777, 888, 999}
  31.             }
  32.         },
  33.         v = 0;
  34.  
  35.     // a[1] -> 222
  36.     #emit ADDR.pri a // a
  37.     #emit ADD.C 4 // a[1]
  38.     #emit LOAD.I
  39.     #emit STOR.S.pri v
  40.  
  41.     printf("%d", v); // a[1] = 222
  42.  
  43.     // b[1][1] -> 97
  44.     #emit ADDR.pri b // b
  45.     #emit ADD.C 4 // b[1]
  46.     #emit MOVE.alt
  47.     #emit LOAD.I
  48.     #emit ADD
  49.     #emit ADD.C 4 // b[1][1]
  50.     #emit LOAD.I
  51.     #emit STOR.S.pri v
  52.  
  53.     printf("%d", v); // b[1][1] = 97
  54.  
  55.     // c[1][1][1] -> 55
  56.     #emit ADDR.pri c // c
  57.     #emit ADD.C 4
  58.     #emit MOVE.alt
  59.     #emit LOAD.I
  60.     #emit ADD // c[1]
  61.     #emit ADD.C 4
  62.     #emit MOVE.alt
  63.     #emit LOAD.I
  64.     #emit ADD // c[1][1]
  65.     #emit ADD.C 4 // c[1][1][1]
  66.     #emit LOAD.I
  67.     #emit STOR.S.pri v
  68.  
  69.     printf("%d", v); // c[1][1][1] = 55
  70.     print("---------------");
  71.     printf("%d", func(a, 1)); // a[1] = 222
  72.     printf("%d", func(b, 1, 1)); // b[1][1] = 97
  73.     printf("%d", func(c, 1, 1, 1)); // c[1][1][1] = 55
  74. }
  75.  
  76. func(...)
  77. {
  78.     new
  79.         args = 0;
  80.  
  81.     #emit LOAD.S.pri 8 // get args (in bytes)
  82.     #emit STOR.S.pri args
  83.    
  84.     if(args == 8) // 2 args
  85.     {
  86.         #emit LOAD.S.pri 12
  87.         #emit LREF.S.alt 16
  88.         #emit SHL.C.alt 2
  89.         #emit ADD
  90.         #emit LOAD.I
  91.         #emit STACK 4
  92.         #emit RETN
  93.     }
  94.  
  95.     else if(args == 12) // 3 args
  96.     {
  97.         #emit LOAD.S.pri 12
  98.         #emit LREF.S.alt 16
  99.         #emit SHL.C.alt 2
  100.         #emit ADD
  101.         #emit MOVE.alt
  102.         #emit LOAD.I
  103.         #emit ADD
  104.         #emit LREF.S.alt 20
  105.         #emit SHL.C.alt 2
  106.         #emit ADD
  107.         #emit MOVE.alt
  108.         #emit LOAD.I
  109.         #emit STACK 4
  110.         #emit RETN
  111.     }
  112.  
  113.     else if(args == 16) // 4 args
  114.     {
  115.         #emit LOAD.S.pri 12
  116.         #emit LREF.S.alt 16
  117.         #emit SHL.C.alt 2
  118.         #emit ADD
  119.         #emit MOVE.alt
  120.         #emit LOAD.I
  121.         #emit ADD
  122.         #emit LREF.S.alt 20
  123.         #emit SHL.C.alt 2
  124.         #emit ADD
  125.         #emit MOVE.alt
  126.         #emit LOAD.I
  127.         #emit ADD
  128.         #emit LREF.S.alt 24
  129.         #emit SHL.C.alt 2
  130.         #emit ADD
  131.         #emit LOAD.I
  132.         #emit STACK 4
  133.         #emit RETN
  134.     }
  135.  
  136.     return 0;
  137. }
Advertisement