VEX —— 数组Arrays

28 篇文章 4 订阅

目录

一,声明数组类型

二,访问与设置数组

三,数组切片

四,在数组和向量/矩阵之间复制

五,循环数组

六,数组函数的使用

七,局限


一,声明数组类型

通用格式:member_type var_name [ ]

  • 可在[ ]添加尺寸大小数字,但vex编译器会忽略此数字;
  • 在声明函数返回数组时,关键字function不可省略;
//声明变量
float my_array[];
vector vector_array[];
string str_array[];
//声明函数返回数组时,关键字function不可省略
function int[] myarray(int x,y){
    int tmp[] = array(x, y);
    return tmp;
}
printf("%d",myarray(1,2));

初始化

  • 初始化时可不给初始值,不会报警或报错,默认为空数组;
  • 可使用大括号{}初始化,成员用逗号隔开;因其是在编译时构造的,所以初始化值不可包含变量;
  • 也可使用array()函数,此函数是在运行时构造数组的,则可以使用变量;
vector an_array[] = { {1, 2, 3}, {2, 3, 4}, {4, 5, 6} };
function vector[] rgb_array() {return { {1, 0, 0}, {0, 1, 0}, {0, 0, 1} };}
string arr[] = {'ab', "cd"};
//使用array创建数组
int a,b,c,d;
a=b=c=d=1;
int my_array[] = array(a, b, c, d);
//指定标量值给矢量,则所有分量均为该标量值
vector an_array[] = {1, 2, 3};
//等价于an_array[] == { {1, 1, 1}, {2, 2, 2}, {3, 3, 3} }

二,访问与设置数组

使用格式:arrayname [index

  • 边界会在运行时检测,超出边界的访问会返回0或“”;可能会生成警告或运行时错误;
  • 超出边界的写入,将重置数组尺寸以适应数组大小;
  • 类似python风格的索引,意味着负索引将从数组末尾开始;
  • 此格式即可访问也可设置值,等价于getcomp、setcomp函数;
  • 也适用于vector和matrix类型;
//访问
int nums[] = { 0, 1, 2, 3, 4, 5 };
int n = nums[10];  // Returns 0
int b = nums[-2];  // Returns 4

string strs[] = { };
string s = strs[20];  //超边界访问 Returns ""

//访问matrix
float a = m3[0][1];
//访问和设置函数
int a[] = {1,2,3};
int b = getcomp(a,1); //类似a[1]
setcomp(a, 22, 1); //类似a[1]=22

三,数组切片

        可使用类似python切片的方法,提取子数组,等同于slice函数;

int nums[] = { 0, 1, 2, 3, 4, 5 };
int start[] = nums[0:2]; // { 0, 1 }
int end[] = nums[-2:]; // { 4, 5 }
int rev[] = nums[::-1]; // { 5, 4, 3, 2, 1, 0 }
int odd[] = nums[1::2]; // { 1, 3, 5 }

int slice_nums[] = slice[nums, 0, 2]; // { 0, 1 }

四,在数组和向量/矩阵之间复制

  • 赋值运算符支持在矢量和浮点数组之间赋值;
    • 如数组不够长,去覆盖vector、matrix,则最后成员会被复制;
  • 也可在matrix与vector2/vector/vector4数组间赋值;
float x[];
x = set(P);
Cf = set(x);
float x[] = {1, 2} // Not long enough to fill a vector
Cf = set(x);  // Cf == {1, 2, 2}
vector2 v2[];
vector v[];
vector4 v4[];
matrix2 m2 = 1;
matrix3 m3 = 1;
matrix m4 = 1;

v = set(m3); 
m3 = set(v);
v4 = set(m4);
m4 = set(v4);
数组和vector/matrix间复制
Left SideRight SideNotes
vector2float[]vector2 v = {1,2}
vectorfloat[]vector v = {1,2,3}
vector4float[]vector4 v = {1,2,3,4}
matrix2float[]matrix2 m = {1,2,3,4}
matrix2vector2[]matrix2 m = { {1,2}, {4,5} }
matrix3float[]matrix3 m = {1,2,3,4,5,6,7,8,9}
matrix3vector[]matrix3 m = { {1,2,3}, {4,5,6}, {7,8,9}}
matrixfloat[]matrix m = {1,2,3,4,5,6,7,8,9.., 16}
matrixvector4[]matrix m = { {1,2,3,4}, {5,6,7,8}, ... {13,14,15,16}}
float[]vector2Create an array of 2 floats 
float[]vectorCreate an array of 3 floats
float[]vector4Create an array of 4 floats
float[]matrix2Create an array of 4 floats
vector2[]matrix2Create an array of 2 vector2s
float[]matrix3Create an array of 9 floats
vector[]matrix3Create an array of 3 vectors
float[]matrix4Create an array of 16 floats
vector4[]matrix4Create an array of 4 vector4s

五,循环数组

        可使用foreach,循环数组内的每个成员;

int an_array[] = {1, 2}
foreach(int num; an_array) 
{
    printf("%d", num);
}

六,数组函数的使用

        数组有许多函数,可用于查询和管理数组;

数组函数
FunctionsUsing
resize设置数组长度
len返回数组长度
pop移除数组最后一个元素或指定元素
removevalue移除匹配的第一个值
removeindex移除指定索引位置的元素
push在数组末尾添加一个元素
getcomp获取数组内的元素,类似arr[num]
setcomp设置数组内的元素,类似arr[num]=value
array有效地从其参数创建一个数组
serialize将向量或矩阵数组展平为浮点数组
unserialize反转序列化的效果,将浮点数的平面数组组装成向量或矩阵的数组
neighbours返回邻居点的点号数组;
min返回数组最小值
avg返回数组的平均值
spline沿着polyline或spline曲线采样值
import()读取属性数据,已由getattrib替代
addattribute()

已由addattrib、setattrib替代

metaimport查询metaball的属性

七,局限

  • 当前不支持多维数组;
  • 不能在shaders之间传递(通过 simport 等);
  • 不能写入图像平面(image planes);

注:打印数组

//打印数组
printf("%g\n", arr);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值