目录
一,声明数组类型
通用格式: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);
Left Side | Right Side | Notes |
vector2 | float[] | vector2 v = {1,2} |
vector | float[] | vector v = {1,2,3} |
vector4 | float[] | vector4 v = {1,2,3,4} |
matrix2 | float[] | matrix2 m = {1,2,3,4} |
matrix2 | vector2[] | matrix2 m = { {1,2}, {4,5} } |
matrix3 | float[] | matrix3 m = {1,2,3,4,5,6,7,8,9} |
matrix3 | vector[] | matrix3 m = { {1,2,3}, {4,5,6}, {7,8,9}} |
matrix | float[] | matrix m = {1,2,3,4,5,6,7,8,9.., 16} |
matrix | vector4[] | matrix m = { {1,2,3,4}, {5,6,7,8}, ... {13,14,15,16}} |
float[] | vector2 | Create an array of 2 floats |
float[] | vector | Create an array of 3 floats |
float[] | vector4 | Create an array of 4 floats |
float[] | matrix2 | Create an array of 4 floats |
vector2[] | matrix2 | Create an array of 2 vector2s |
float[] | matrix3 | Create an array of 9 floats |
vector[] | matrix3 | Create an array of 3 vectors |
float[] | matrix4 | Create an array of 16 floats |
vector4[] | matrix4 | Create an array of 4 vector4s |
五,循环数组
可使用foreach,循环数组内的每个成员;
int an_array[] = {1, 2}
foreach(int num; an_array)
{
printf("%d", num);
}
六,数组函数的使用
数组有许多函数,可用于查询和管理数组;
Functions | Using |
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);