C_far icon

AMX: Handling dimensions array

C_far | PRO | 12/06/17 08:48:30 AM UTC | 0 ⭐ | 7523 👁️ | Never ⏰ | []
Pawn |

2.2 KB

|

None

|

0 👍

/

0 👎

#include "a_samp"
 
main()
{
    new 
        a[3] = {111, 222, 333},
        b[5][5] =
        {
            {91, 92, 93, 94, 95},
            {96, 97, 98, 99, 910},
            {911, 912, 913, 914, 915},
            {916, 917, 918, 919, 920},
            {921, 922, 923, 924, 925}
        },
        c[3][3][3] =
        {
            {
                {1, 2, 3},
                {4, 5, 6},
                {7, 8, 9}
            },
            {
                {11, 22, 33},
                {44, 55, 66},
                {77, 88, 99}
            },
            {
                {111, 222, 333},
                {444, 555, 666},
                {777, 888, 999}
            }
        },
        v = 0;
 
    // a[1] -> 222
    #emit ADDR.pri a // a
    #emit ADD.C 4 // a[1]
    #emit LOAD.I
    #emit STOR.S.pri v
 
    printf("%d", v); // a[1] = 222
 
    // b[1][1] -> 97
    #emit ADDR.pri b // b
    #emit ADD.C 4 // b[1]
    #emit MOVE.alt
    #emit LOAD.I
    #emit ADD
    #emit ADD.C 4 // b[1][1]
    #emit LOAD.I
    #emit STOR.S.pri v
 
    printf("%d", v); // b[1][1] = 97
 
    // c[1][1][1] -> 55
    #emit ADDR.pri c // c
    #emit ADD.C 4
    #emit MOVE.alt
    #emit LOAD.I
    #emit ADD // c[1]
    #emit ADD.C 4
    #emit MOVE.alt
    #emit LOAD.I
    #emit ADD // c[1][1]
    #emit ADD.C 4 // c[1][1][1]
    #emit LOAD.I
    #emit STOR.S.pri v
 
    printf("%d", v); // c[1][1][1] = 55
    print("---------------");
    printf("%d", func(a, 1)); // a[1] = 222
    printf("%d", func(b, 1, 1)); // b[1][1] = 97
    printf("%d", func(c, 1, 1, 1)); // c[1][1][1] = 55
}
 
func(...)
{
    new 
        args = 0;
 
    #emit LOAD.S.pri 8 // get args (in bytes)
    #emit STOR.S.pri args
    
    if(args == 8) // 2 args
    {
        #emit LOAD.S.pri 12
        #emit LREF.S.alt 16
        #emit SHL.C.alt 2
        #emit ADD
        #emit LOAD.I
        #emit STACK 4
        #emit RETN
    }
 
    else if(args == 12) // 3 args
    {
        #emit LOAD.S.pri 12
        #emit LREF.S.alt 16
        #emit SHL.C.alt 2
        #emit ADD
        #emit MOVE.alt
        #emit LOAD.I
        #emit ADD
        #emit LREF.S.alt 20
        #emit SHL.C.alt 2
        #emit ADD
        #emit MOVE.alt
        #emit LOAD.I
        #emit STACK 4
        #emit RETN
    }
 
    else if(args == 16) // 4 args
    {
        #emit LOAD.S.pri 12
        #emit LREF.S.alt 16
        #emit SHL.C.alt 2
        #emit ADD
        #emit MOVE.alt
        #emit LOAD.I
        #emit ADD
        #emit LREF.S.alt 20
        #emit SHL.C.alt 2
        #emit ADD
        #emit MOVE.alt
        #emit LOAD.I
        #emit ADD
        #emit LREF.S.alt 24
        #emit SHL.C.alt 2
        #emit ADD
        #emit LOAD.I
        #emit STACK 4
        #emit RETN
    }
 
    return 0;
}

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎