跨平台freebasic集锦(4)-基本语法(3)-dim(3)
admin
2024-05-15 12:42:18
0

目录

    • 数组
      • any
      • Preserve

数组

共以下三种方式

Dim name ( [lbound To] ubound [, ...] ) As DataType
Dim name ( Any [, Any...] ) As DataType
Dim name ( ) As DataType
Declare Sub PrintZDim shared z(0 to 2) as integer
'( [lbound To] ubound [, ...] ) As DataType
z(0)=1
z(1)=2
z(2)=3printZSub PrintZDim z As Integerz=19    Print "shared z(0) is ";.z(0)Print "z is ";z
End Sub

编译后运行

F:\learn\fbs>1
shared z(0) is  1
z is  19F:\learn\fbs>

数组下限可以大于1,但要按比下限小的索引访问数组,将得到随机结果

Declare Sub PrintZDim shared z(3 to 5) as integer
'( [lbound To] ubound [, ...] ) As DataType
z(3)=11
z(4)=2
z(5)=3printZSub PrintZDim z As Integerz=19  Print "shared z(0) is ";.z(0)Print "shared z(5) is ";.z(5)Print "z is ";z
End Sub
F:\learn\fbs>1
shared z(0) is  9126480
shared z(5) is  3
z is  19F:\learn\fbs>
F:\learn\fbs>1
shared z(0) is  8077904
shared z(5) is  3
z is  19F:\learn\fbs>

any

Any关键字以各种方式用作类型或值的占位符。

指针:

称为Any Ptr(或“Any pointer”)的特殊指针类型允许指向任何变量类型。如果将其转换为DataType Ptr,则可以对其进行索引或解引用,以作为DataType的实例访问内存。指针算术在Any Ptr上是允许的,并将其视为Byte Ptr:指针以1为增量进行更改。

纯Any Ptr没有编译器的类型检查。它可以通过赋值或参数传递隐式转换为其他指针类型或从其他指针类型隐式转换。

Any本身不是变量的有效数据类型。此外,取消引用Any Ptr是非法的(尽管Any Ptr-Ptr可能会被取消引用以生成Any Pter)。

这不应与Variant混淆,Variant是一种可以包含任何类型变量的Visual Basic数据类型。FreeBASIC不为Variant类型提供本机支持。

Byref参数:

可以在过程原型(在Declare语句中)中使用Any和ByRef参数,以禁用编译器检查传递的变量的正确类型(这包括数组参数,因为总是通过引用隐式传递)。

但是,它不适用于UDT成员过程,除非它们是静态过程。

Any的这种用法已被弃用,它只为与QB兼容而存在。

数组尺寸:

在数组声明中,可以指定Any来代替数组边界,以便创建具有特定维数的动态数组,该维数是根据指定的Any的数量确定的(在Type内声明动态数组成员时,必须使用Any的语法)。

在参数声明中,也可以指定Any而不是空括号,以固定维数。

初始化:

Any可以用作伪初始值设定项,以禁用变量的默认初始化为0,从而使变量未初始化。这可以节省程序关键部分的时间。在读取变量之前,程序有责任用有意义的数据填充变量。

与C/C++的比较:这与C/C++中没有初始化值的变量声明的行为相匹配。

与变量的Any初始化器类似,Any也可以与New Expression或Placement New运算符一起使用,以使新创建的对象保持未初始化状态(仅允许用于没有构造函数的数据类型)。

Instr/InstrRev::

Any可以与Instr或InstrRev一起用作子字符串参数的限定符,以指示可以匹配其中的任何单个字符。

Declare Sub PrintZDim shared z(any)  as integer
redim z(0 to 3) as integerz(0)=11
z(1)=22
z(2)=44
z(3)=33
printZSub PrintZDim z As Integerz=19  Print "shared z(1) is ";.z(1)Print "z is ";z
End Sub
F:\learn\fbs>1
shared z(1) is  22
z is  19F:\learn\fbs>
Declare Sub PrintZDim array(any)  as integer
ReDim array(1 To 3) As Integer
Dim i As Integerarray(1) = 10
array(2) = 5
array(3) = 8ReDim Preserve array(1 To 10)For i = 1 To 10Print "array("; i; ") = "; array(i)
Next

Preserve

与Redim一起使用以保留内容将调整数组大小

与Redim一起使用,以便在调整数组大小时,数据不会被重置,而是被保留。这意味着当数组被放大时,只有新数据被重置,而旧数据保持不变(但不一定位于内存中相同的绝对地址)。

注意:Redim Preserve在所有情况下都可能无法正常工作:

Preserve的当前行为是保持原始数据在内存中的连续性,并且只扩展或截断内存的大小(如果无法调整大小,则首先将整个原始数据块移动到另一个内存位置)。

只有当上限被改变时,它的行为(具有单个维度)才被定义清楚。如果下限被更改,当前结果是数据实际上被移动到新的下限开始。

如果存在多个维度,则只有第一个维度的上限可以安全更改。如果第一维度减小,则现有的可映射数据可能会丢失。如果完全调整了低阶维度的大小,则很难预测其影响(因为多维数组按行主要顺序存储:仅在最后一个索引中不同的值是连续的)。

F:\learn\fbs>1
array( 1) =  10
array( 2) =  5
array( 3) =  8
array( 4) =  0
array( 5) =  0
array( 6) =  0
array( 7) =  0
array( 8) =  0
array( 9) =  0
array( 10) =  0F:\learn\fbs>
Declare Sub PrintZDim shared z(any)  as integer
redim Shared z(0 to 3) as integerz(0)=11
z(1)=22
z(2)=44
z(3)=33redim Preserve z(0 to 4)
z(4)=55printZSub PrintZDim z As Integerz=19  Print "shared z(3) is ";.z(3)Print "shared z(4) is ";.z(4)    Print "z is ";z
End Sub
F:\learn\fbs>1
shared z(3) is  33
shared z(4) is  55
z is  19

下面程序的运行结果和上面相同

Declare Sub PrintZDim shared z()  as integer
redim Shared z(0 to 3) as integerz(0)=11
z(1)=22
z(2)=44
z(3)=33redim Preserve z(0 to 4)
z(4)=55printZSub PrintZDim z As Integerz=19  Print "shared z(3) is ";.z(3)Print "shared z(4) is ";.z(4)    Print "z is ";z
End Sub

二维的情况

Declare Sub PrintZDim shared z()  as integer
redim Shared z(0 to 1,0 to 1) as integerz(0,0)=11
z(0,1)=22
z(1,0)=44
z(1,1)=33redim Preserve z(0 to 2,0 to 1)
z(2,0)=55printZSub PrintZDim z As Integerz=19  Print "shared z(1,0) is ";.z(1,0)Print "shared z(2,0) is ";.z(2,0)    Print "z is ";z
End Sub
F:\learn\fbs>1
shared z(1,0) is  44
shared z(2,0) is  55
z is  19F:\learn\fbs>

相关内容

热门资讯

斗金订购APP贵金属期货投资被...   斗金订购APP的投资者被广告宣传给诱导,注册就送什么现金,然后充值返现金卷等等这些宣传方式,都是...
哈易购APP非法期货交易欺骗投...   哈易购APP宣传可做白银铂金贵金属订购交易,但实际上并没有取得相关交易资质!哈易购APP本质上就...
消息称百度旗下昆仑芯瞄准500... 6 月 29 日消息,据《The Information》昨日援引知情人士消息,百度旗下 AI 芯片...
打造夏日消费新场景 第35届北... 北京商报讯(记者 翟枫瑞)6月29日消息,第35届北京国际燕京啤酒文化节新闻发布会在京举行。本届啤酒...
社保基金持仓数据出炉,一季度增... 最近各大上市公司一季度财报都公开了,咱们国家社保基金的持仓数据也全部曝光。目前社保拿着比亚迪价值44...
36氪首发 | 海思、中兴团队... 作者 | 乔钰杰 编辑 | 袁斯来 硬氪获悉,广州宸思通讯科技有限公司(以下简称“宸思科技”)近日完...
两天蒸发47亿市值!一纸税务通... 一纸税务通知书,能让一家百亿龙头两天蒸发47亿市值。 6月22日,北大荒(600598.SH)公告称...
SK海力士将投资1100万亿韩... SK集团会长崔泰源6月29日在韩国“三大重大计划”发布会上宣布,公司将投资1100万亿韩元扩大半导体...
两只A股,终止上市! 两家A股公司,即将摘牌。 6月29日,退市沪科(600608.SH)公告称,上海证券交易所将在202...
原创 M... 一家成立近十年的自动驾驶公司,在IPO时吸引了14家基石投资者认购近一半的发行股份,其中不乏奔驰、比...
基金忠言|国寿安保滤镜碎,三年... 图片来源:视觉中国 蓝鲸新闻6月29日讯(记者 祁和忠)保险系基金公司国寿安保总经理换人了。 6月2...
三星电机计划加码玻璃基板!相关... 6月29日,玻璃基板概念股午后有所回升, 华工科技(000988.SZ)逼近涨停, 彩虹股份(600...
拉萨海关持续壮大外贸经营主体 ...   新华网拉萨6月28日电(记者蒋梦辰)近日,记者从拉萨海关获悉,今年前5个月,西藏有进出口实绩的外...
机构:二季报临近,医药生物板块... 6月29日,华源证券发布了一篇医药生物行业的研究报告,报告指出,业绩期临近,产业链景气度有望再次迎来...
每日收评科创50放量涨超4.5... 财联社6月29日讯,三大指数全线收红,创业板指探底回升,科创50指数大涨4.61%。沪深两市成交额3...
6月多地土拍结构性升温:深圳单... 进入2026年6月,不少城市核心区地块集中诞生高溢价宗地,热度突出的城市包含深圳、杭州、长沙。 其中...
业绩炸裂!盛达资源半年预盈3.... 6月29日,贵金属矿山龙头盛达资源(000603.SZ)发布 2026 年半年度业绩预告,上半年业绩...
A股午后拉升三大股指收涨:半导... A股三大股指6月29日开盘涨跌互现。早盘沪强深弱,创指一度跌超2%。半导体午后拉升,带动两市上涨,沪...
原创 空... 前言 大家好,我是老金。 这几天,两幅极度割裂的画面放在一起,把我看笑了。 一边是在持续的热浪下,欧...