请问怎样获取结构的大小?

FSB 2004-08-11 10:45:44
请问怎样获取结构的大小?
...全文
195 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wu_07 2004-08-12
  • 打赏
  • 举报
回复
$PBExportHeader$nvo_sizeof.sru
$PBExportComments$Non visual user O B J E C T that implements the SizeOf function present on other languages (C, Delphi, VB)
forward
global type nvo_sizeof from nonvisual O B J E C T
end type
end forward

global type nvo_sizeof from nonvisual O B J E C T autoinstantiate
end type

type variables
Private:
CONSTANT integer SIZE_BOOLEAN = 1 // Boolean
CONSTANT integer SIZE_CHAR = 1 // Char
CONSTANT integer SIZE_INT = 2 // Signed integer
CONSTANT integer SIZE_UINT = 2 // Unsigned integer
CONSTANT integer SIZE_LONG = 4 // Signed Long
CONSTANT integer SIZE_ULONG = 4 // Unsigned Long
CONSTANT integer SIZE_STRING = 4 // Assume as string pointer

// Supported DataTypes
integer INTEGER
uint UINT
long LONG
ulong ULONG
char CHAR
string STRING
boolean BOOLEAN

end variables

forward prototypes
public function long sizeof (long data)
public function long sizeof (ulong data)
public function long sizeof (integer data)
public function long sizeof (uint data)
public function long sizeof (character data)
public function long sizeof (string data)
public function long sizeof (any data[])
public function long sizeof (boolean data)
public function long sizeof (power O B J E C T data)
private function long sizeof (variabledefinition vardef[])
end prototypes

public function long sizeof (long data);Return(SIZE_LONG)
end function

public function long sizeof (ulong data);Return(SIZE_ULONG)
end function

public function long sizeof (integer data);Return(SIZE_INT)
end function

public function long sizeof (uint data);Return(SIZE_UINT)
end function

public function long sizeof (character data);Return(SIZE_CHAR)
end function

public function long sizeof (string data);Return(SIZE_STRING)
end function

public function long sizeof (any data[]);// Gives the dimension of an array
//
// Arguments: Data[] => Array to know the dimension
//
// Returns: Size of the array
//
// Notes:
// 1) Supports mixed type arrays (and variable sized strings within the array)
// 2) DOESN'T support multi-dimension arrays;
long ll_Index, ll_Count, ll_Size = 0

ll_Count = UpperBound(Data)

For ll_Index = 1 To ll_Count

Choose Case ClassName(Data[ll_Index])
Case "long"
ll_Size += SizeOf(LONG)
Case "unsignedlong","ulong"
ll_Size += SizeOf(ULONG)
Case "int","integer"
ll_Size += SizeOf(INTEGER)
Case "uint","unsignedinteger","unsignedint"
ll_Size += SizeOf(UINT)
Case "char", "character"
ll_Size += SizeOf(CHAR)
Case "string"
ll_Size += SizeOf(CHAR) * SizeOf(String(Data[ll_Index]))
Case "boolean"
ll_Size += SizeOf(BOOLEAN)
End Choose

Next

Return(ll_Size)
end function

public function long sizeof (boolean data);Return(SIZE_BOOLEAN)
end function

public function long sizeof (power O B J E C T data);// This function calculates the size of a structure
//
// The structure can contain simple datatypes (long, integer, boolean), arrays or
// other structures within it
//
// Arguments: Data => Structure to know the size of..
//
// Returns: Size of the structure or -1 if error
//
// Notes:
//
// 1) Cannot calculate the size of a structure with strings (variable size), for fixed
// sized strings use a char array;
// 2) CAN calculate the size of multi-dimension arrays within the structures
ClassDefinition ClassDef
VariableDefinition VarDef[]

ClassDef = Data.ClassDefinition

if Not ClassDef.IsStructure then return - 1

VarDef = ClassDef.VariableList

Return(SizeOf(VarDef))

end function

private function long sizeof (variabledefinition vardef[]);// Internal calculations for structure sizes
long ll_Index, ll_Count, ll_Size, ll_Array = 0
ClassDefinition TypeInfo
VariableDefinition VarList[]
VariableCardinalityDefinition VarCarDef
ArrayBounds ArrBounds[]

ll_Count = Upperbound(VarDef)

For ll_Index = 2 To ll_Count //ll_Index=1 itself

VarCarDef = VarDef[ll_Index].Cardinality

if VarCarDef.Cardinality=BoundedArray! then
ArrBounds = VarCarDef.ArrayDefinition

If Upperbound(ArrBounds) = 1 Then
ll_Array = ArrBounds[1].UpperBound
elseif Upperbound(ArrBounds) >=2 then //two dim array
ll_Array =(ArrBounds[2].UpperBOund)*(ArrBounds[1].UpperBOund)
End If
Else //ScalarType! or UnboundedArray!
ll_Array = 1
End If
Choose Case lower(VarDef[ll_Index].TypeInfo.DataTypeOf)
Case "long"
ll_Size += SizeOf(LONG) * ll_Array
Case "ulong","unsignedlong"
ll_Size += SizeOf(ULONG) * ll_Array
Case "int","integer"
ll_Size += SizeOf(INTEGER) * ll_Array
Case "uint","unsignedint","unsignedinteger"
ll_Size += SizeOf(UINT) * ll_Array
Case "char","character"
ll_Size += SizeOf(CHAR) * ll_Array
Case "string"
ll_Size += SizeOf(STRING) * ll_Array
Case "structure"
TypeInfo = VarDef[ll_Index].TypeInfo
VarList = TypeInfo.VariableList
ll_Size += SizeOf(VarList)
Case Else
//if just store pointer in pb?? ll_Size+=(4*ll_Array)
MessageBox("SizeOf error","Type is not supported, possibly variable sized or O B J E C T type!",StopSign!,Ok!)
Return(-1)
End Choose

Next

Return(ll_Size)
end function

on nvo_sizeof.create
call super::create
TriggerEvent( this, "constructor" )
end on

on nvo_sizeof.destroy
TriggerEvent( this, "destructor" )
call super::destroy
end on
jackxrh 2004-08-12
  • 打赏
  • 举报
回复
不能得到 . 在 c/c++ 里有 sizeof(),pb里没有
amekoxiao 2004-08-11
  • 打赏
  • 举报
回复
楼主能否说清楚些你想干什么?
为什么要得到结构的大小4
yzh963 2004-08-11
  • 打赏
  • 举报
回复
结构的大小?你是指结构里变量的个数吗?
lzheng2001 2004-08-11
  • 打赏
  • 举报
回复
试试
len(结构名)
FSB 2004-08-11
  • 打赏
  • 举报
回复
to lzheng2001

你的方法我明的,但怕会有字节对齐吧

暂时还是用VC做个DLL来实现
lzheng2001 2004-08-11
  • 打赏
  • 举报
回复
LONG为4字节
int为2字节用于API时好象当作4字节处理,我觉得反正用LONG就可以了,不用INT
CHAR(1) 1字节

你逐个元素加上去就是TYPE的总字节长.

如果你懂C,C++ 建议以C++的长度为准!(即将类型看成C的变量类型作参考)
FSB 2004-08-11
  • 打赏
  • 举报
回复
我试过用len,PB不允许, 可len只允许string和blob参数。能不能进行类型转换?

to yzh963(冰峰)
是指整个结构的大小

我要调用windows API, 要传参数,在初始化参数时,其中一个参数要知道自已的大小

1,075

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 相关问题讨论
社区管理员
  • 基础类社区
  • WorldMobile
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧