第一部分 GeoGeo脚本基础 第1章 变量与数组

来源:互联网 发布:mac的image文件夹在哪 编辑:程序博客网 时间:2024/06/16 07:46


1.1支持的数据类型

GeoGeo支持如下12种基本数据类型。有符号数用小写字母表示,无符号数用大写字母表示。见表1.1

1.1 RSD脚本语言支持的数据类型

---------------------------------------------------------------------------------------------------------------------

      类型名                 RSD类型标识             ID  说明

---------------------------------------------------------------------------------------------------------------------

      char                     SINT8B                      19   char类型表示有符号 8位整型

      BYTE                  UINT8B                      1    BYTE类型表示无符号 8位整型

      short                    SINT16BL                   3    short表示有符号 16位整型

      WORD                UINT16BL                  2    WORD表示无符号 16位整型

      int                       SINT32BL                   10   int表示有符号 32位整型

      DWORD             UINT32BL                  9    DWORD表示无符号 32位整型

      longlong               SINT64BL                   14   longlong表示有符号 64位整型

      ULONGLONG   UINT64BL                  13   ULONGLONG表示无符号 64位整型

      float                     FLOAT32BL               5    float表示32位浮点型

      double                DOUBLE64BL            6    double表示64位浮点型

      STRING              STRING                      101 STRING表示窄字符串

      WSTRING          WSTRING                  102 WSTRING表示宽字符串

      Struct                   STRUCT                     103 结构类型(自定义)

----------------------------------------------------------------------------------------------------------------------

1.2变量声明

GeoGeo脚本的变量需要预先声明,可以在程序的任何位置声明,只要保证在使用前声明即可。声明方式如下:

<类型说明符> <变量名>[<数组说明表达式> …] [ = <表达式>] ;

1.2.1简单变量的声明

下面是简单变量的声明的例子。各自声明了一个4字节有符号整型、一个8字节浮点型和一个窄字符字符串类型的变量。

      int a;

      double f;

      STRING str;

1.2.2变量声明时初始化

下面是声明变量后马上进行初始化的例子。将声明的单字节字符型初始化为字符T,将8字节的浮点型变量初始化为3.1415926,将字符串变量设置为“GeoGeo脚本

      BYTE c = ‘T’;

      double f = 3.1415926;

      STRING str = “GeoGeo脚本”;

GeoGeo脚本除支持常量初始化,也支持变量初始化,下面的写法是合法的:

int a= 10;

int b= a;

1.2.3数组的声明

GeoGeo主要以数组方式工作,因此数组声明是GeoGeo脚本的重要内容。数组的维数最大不超过16维,每维大小没有特别限制,取决于计算机的处理能力。下面的例子声明了一个4维的整型数组和一个1维的无符号长整型数组。

      int a[2][3][4][5];

      ULONGLONG ull[100];

注意:GeoGeo数组下标不要求一定为常量,它可以是一个表达式。下述声明是合法的:

      int a = 10;

      int b = 2;

      

      double db[a+b];

字符串类型只支持1维数组,下述声明是合法的:

      STRING str[10];

1.2.4数组声明时初始化

      int a[4] = {1,2,3,4};

      float f[][3][4] = {0.1,0.2,.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0,1.1,1.2,2.1,2.2,2.3,2.4,2.5,2.6, 2.7, 2.8,       2.9, 2.0,2.1,2.2};

      DWORD dw[] = {1,2,3};

可以使用一对儿大括号括起来初始化数据,以分号结束。每个数据以‘,’号分隔。多维数据排列次序为从最后面的维数向前面的维数排列。如上述f个元素的数据排列如下:

      f[0][0][0] = 0.1;

      f[0][0][1] = 0.2;

      f[0][0][2] = 0.3;

      f[0][0][3] = 0.4;

      f[0][1][0] = 0.5;

      f[0][1][1] = 0.6;

      

      f[1][2][2] = 2.1;

      f[1][2][3] = 2.2;

数组初始化时第一维的大小可以不指定。如上述对数组变量f的声明中,第1维的大小自动计算为21维数组dw的大小自动计算为3。多维数组除第1维以外其它维数的大小必须显式指定。

字符串数组也可以使用字符串常量进行初始化,如下述语句声明了一个1维字符串数组,共有3个元素。

      STRING str[3] = {“GeoGeo脚本”,”沈阳农业大学”,”李国春”};

程序清单1.1是变量声明的例子。

程序清单 1.1

main (){

   int x;

   BYTE c = 'T';

   double f = 3.1415926;

   STRING str ="GeoGeo脚本";

   int a[4] = {1,2,3,4};

   float b[][3][4] ={0.1,0.2,.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0,1.1,1.2,2.1,2.2,2.3,2.4,2.5, 2.6, 2.7,2.8,2.9, 2.0,2.1,2.2};

   DWORD dw[] = {1,2,3};

   STRING str2[3] = {"GeoGeo脚本","沈阳农业大学","李国春"};

}

1.1GeoGeo解释程序中程序清单1.1的运行状况,窗口的上半部分是代码,在main函数的最后一行设置一个断点,程序运行到该行暂停。窗口的下半部分是一些变量的监视结果,包括变量名、值、数据类型、数组维数以及各维大小。数组变量时仅显示了前两个元素的值。

1.1变量声明

1.3全局变量与局部变量

GeoGeo支持全局变量和局部(或称局地)变量的概念。在函数(见函数部分)内声明的变量为局部变量,在函数外声明的变量为全局变量。

无论全局变量或者局部变量,GeoGeo进程将变量建立在堆上,或者大数据集的变量建立在外存上,而不是建立在分配给GeoGeo解释程序的栈上。从操作系统来看,只有GeoGeo解释程序是主进程,其它所有运行的GeoGeo脚本执行线程都是GeoGeo解释程序的子线程(详见第5章),并且GeoGeo是以处理大数据集为目的,GeoGeo解释程序的栈空间无法承载GeoGeo脚本变量的需求。

1.3.1局部变量

从可见性看,GeoGeo的局部变量在所声明该局部变量的函数内均可见。也就是说无论是在代码块(由一对儿大括号括起来的代码)内部或者外部声明的变量,只要是在该函数内部均可以对其访问。

1.3.2全局变量

GeoGeo的一个非常特别的设计特征是全局变量不但在本脚本执行线程可见,同时在本脚本解释器的所有执行线程内可见。也就是说当在一段执行代码中申明了一个全局变量后,该变量即归GeoGeo解释器所有,即便该部分执行线程结束后,全局变量仍然保持有效,仍然可以被其它线程访问使用。

需要不断申请和释放全局变量时请显式声明和销毁(使用AllocFree函数)。详见第8章内存/数据管理。

1.3.3变量声明示例

运行并观察下述代码:

程序清单 1.2局部与全局变量.c

double dbA[8000][8000]; //声明具有8000*8000个元素的8字节浮点型2维数组

main (){

   Print("已申请8000*8000*8字节全局变量");

   Print("主程序休眠10");

   Sleep(10000);

   int a = 8000*8000;

   int b = func1(a);

   Print("子程序结束局部变量释放。");

   Print("主程序结束未释放全局变量。");

   return 1;

}

int func1(int a){

   Print("子程序申请8000*8000*8字节局部变量并休眠10秒。");

   double dbB[a];

   Sleep(10000);

   return 1;

}

打开Windows的任务管理器->性能选项卡。观察内存占用情况。加载这段代码并运行,可以发现:

    程序一开始,在执行main函数之前,先申请了一个8000*8000个元素的全局变量dbA

    执行main函数,休眠10秒,观察内存占用情况。

    调用func1函数,在函数内申请了一个8000*8000个元素的局部变量dbB。内存占用增加。

    func1函数休眠10秒后返回主程序,局地变量dbB,释放,内存占用大致恢复到调用func1函数之前的水平。

    main函数执行完,全局变量dbA并没有释放。

    结束GeoGeo解释程序,全局变量dbA被释放。

由此可见,局部变量在函数结束时自动释放,全局变量不被自动释放,除非进程结束或者显式释放。

声明的变量元素占用内存过多会引起内存分配错误,请参阅大数据集管理部分内容。

全局变量不允许使用同一名字重复申请,同一函数内部的局部变量变量名也不允许重复。但是在不同的函数内的局部变量或者在局部变量和全局变量之间可以使用相同的变量名。

全局变量在程序内部任何地方可见,局部变量只有在本函数内部可见。在函数内部声明的局部变量如果与全局变量重名,则同名的全局变量被隐藏。函数退出时该局部变量被释放,全局变量继续有效。

1.4变量赋值和求值

全局变量和局部变量只要在可见区域内其赋值和求值方式是相同的。

1.4.1简单变量的赋值

简单变量也像其初始化一样,使用“=”号赋值。

int a;

a = 10; //将变量a赋值为10

1.4.2字符串变量的赋值

字符串变量也可以使用“=”号直接赋值。下述语句是合法的:

STRING str = "GeoGeo示例代码";

str = "沈阳农业大学李国春";

在这个例子中,尽管str被初始化为“GeoGeo示例代码”,但仍然可以被重新赋值为任意需要的内容,无需考虑字符串的大小和所占字节数。

1.4.3数组变量与子变量

GeoGeo支持多维数组变量的部分求值。这部分功能是基于这样的设计思想:假如一个n维数组,其第1维数组下标为m,那么这个n维数组可以分解为mn-1维数组。如:

int a[2][10] ={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};

对数组的单个元素求值与c/c++语言一致,如a[0][1]的值为1a[1][9]的值为19

GeoGeo中可以将inta[2][10]分解为a[0]a[1]两个数组,其中a[0]的值为:

0,1,2,3,4,5,6,7,8,9

a[1]的值为:

10,11,12,13,14,15,16,17,18,19

可以使用数组求值结果对另一个数组赋值,如使用上述数组a[2][10]a[1]对另一个数组b赋值,下述写法是合法的。

int b[10];

b = a[1];

数组变量的一部分数组是这个数组变量的子变量,子变量可以单独求值和赋值,用法和独立的数组变量基本一样。

上例中,a20个数组元素,可以看为a20个整型简单子变量。同时也可以看为aa[0]a[1]两个数组型子变量,余类推。

参阅下述示例代码:

程序清单 1.3 1-3-数组赋值和求值.c

float fVar[][3][4] ={0.1,0.2,.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0,1.1,1.2,2.1,2.2,2.3,2.4,

2.5,2.6,2.7,2.8,2.9,3.0,3.1,3.2};

main(){

   STRING string;

   double dbVar[3][4];

   double y[4];

   //用数组的一部分数据对新数组初始化。y的元素为2.52.62.72.8

   y = fVar[1][1];

   Format(string," %f    %f   %f    %f   \n",y[0],y[1],y[2],y[3]);

   Print(string);

   dbVar = fVar[0];

   Format(string," %f    %f   %f    %f   \n", dbVar[2][0], dbVar[2][1],dbVar[2][2], dbVar[2][3]);

   Print(string);

   y = dbVar[1];

   Format(string," %f    %f   %f    %f   \n",y[0],y[1],y[2],y[3]);

   Print(string);

   return 0;

}

输出结果为:

2.500000 2.600000 2.700000 2.800000

0.900000 1.000000 1.100000 1.200000

0.500000 0.600000 0.700000 0.800000

注意:用部分数组求值结果对数组赋值要求元素数一致,对于数组求值结果的元素数与目标数组元素数不一致的情况,请参阅MatSlabMatStickMatSlabTileMatStickTile函数。

1.5结构——自定义数据类型

GeoGeo支持自定义结构类型,可以用来构造复杂数据。

1.5.1结构的声明

结构按下述声明

struct <结构类型名> {[<类型说明符> <变量名>[<数组说明表达式> …] ;]...} ;

下面是一个声明结构的例子:

struct MyStruc{

      intn;

      doublef;

      STRINGstr;

};

上例中,struct是结构关键字,MyStruc是自定义的结构类型的类型名,大括号中间的简单变量声明称之为结构的成员。结构声明以“;”号结束。

结构成员可以是数组,下述声明是合法的:

struct MyStruc{

      intn[10][10][10];

      double;

      STRINGstr[100];

};

也可以有结构类型的结构成员,只要这个作为成员的结构之前已经被合法声明过,例如可以进行下述声明:

struct SubStruc{

      ULONGLONGull;

      BYTEby;

      STRINGstr[8];

};

struct MyStruc{

      SubStrucsub[2][2];

      intn;

      doublef;

      STRINGstr;

};

1.5.2定义结构变量

结构变量的定义与普通变量的声明和定义一样(见1.2节),只是类型是结构类型而不是简单数据类型,对于上述1.5.1中声明的结构类型,按下述定义结构变量是合法的:

MyStruc struct1;

MyStruc struct2[10];

1.5.3结构变量的赋值和引用

c/c++一样,对结构成员进行操作时也使用“.”操作符来完成,由于GeoGeo没有指针,因此c/c++的“->”操作符不能在GeoGeo结构成员中使用。下述语句是结构成员应用的例子:

程序清单 1.4 1-4-结构声明.c

struct Struc{

   ULONGLONG ull;

   BYTE by;

   STRING str[8];

};

main(){

   // 1.简单结构成员赋值

   Struc strc;

   strc.by = 64;

   Print("%d \n",strc.by);

   // 2.结构数组元素的赋值

   Struc s0[10];

   s0[2].ull = 23456;

   // 3.结构数组元素中成员为数组时赋值

   s0[2].str[2] ="沈阳农业大学李国春";

   // 4.结构拷贝

   strc = s0[2];

   Print("%d \n",strc.ull);

   Print("%s \n",strc.str[2]);

}

运行上述代码,输出:

64

23456

沈阳农业大学李国春

1.6子变量

GeoGeo使用一种子变量的概念。子变量是一个数组变量的部分数组或者基本数组元素。一个二维数组,可以看成是由数组元素个数的子变量组成,如定义一个数组变量

int A[4]

其所有可以使用的变量名为:

A

A[0]A[1]A[2]A[3]

单独使用 A时代表所有元素,这与C/C++中单独使用A表示是数组指针的状况不同。可以使用诸如

A = 10;

这样的语句,这样就把A的所有元素都赋值成了10。当然这样的操作没有实际应用意义,其用途在于子变量可以在一些场合被看成是变量。

多维数组的情况类似,定义

doubledbX[2][3][4]

其所有可以使用的变量名为:

dbX——共有24个数组元素

dbX[0]dbX[1] ——每个有12个元素

dbX[0][0]dbX[0][1]dbX[0][2]——每个有4个元素

dbX[1][0]dbX[1][1]dbX[1][2]——同上

dbX[0][0][0]~ dbX[1][2][3],共24个,每个一个元素。

1.7本章小结

1. GeoGeo支持多种数据类型,包括自定义结构类型。

2.简单变量的声明和设置初始值与C语言相同。如果不设置变量的初始值,则数值型设置为0,字符类型设置为空。

3.数组声明也象C语言一样在变量名后面加方括号,有几对方括号就说明该数组有几维,数组的维数最大不超过16维。方括号里面可以用表达式指定每维的大小,没有C语言中必须用常量指定每维大小的约束。

4.数组设置初始值可以使用在数组声明后面用大括号括起来的初始值设置,但是只能使用1对大括号。

5. GeoGeo也有全局和局部变量。全局变量在整个GeoGeo解释程序中可见,局部变量只在函数内可见。语句块中声明的变量是局部变量,不仅在语句块中可见,在语句块外的函数中也可见。

6. GeoGeo可以使用自定义结构类型,结构类型的声明需要在函数外进行。定义结构变量可以象定义普通变量一样定义。

7. GeoGeo使用了子变量的概念。一个数组变量可以分解为若干子变量独立使用。

 

下载地址:http://download.csdn.net/detail/gordon3000/7922555

0 0