关于VARIANT 变量的运算的问题

六月初七 2014-04-03 03:55:25
网上看到一个例子中:
VARIANT size,out;
Variantint(&size);
Variantint(&out);
........
后面要显示结果数据时,strtext.Format(%.f”,(XXX+i*m_size+j));
要实现out值与(i*m_size+j)相加,显示结果,XXX要填什么呢?
...全文
153 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
六月初七 2014-04-04
  • 打赏
  • 举报
回复
引用 1 楼 oyljerry 的回复:
out.dblVal
调用动态链接库程序中,这句话是什么意思呢? strtext.Format("%.f",*(mxGetPr(out)+i*m_size+j)); 其中变量的定义如下: UpdateData(TRUE); double data; data=double(m_size); mxArray *size; //输入参数 mxArray *out=NULL; //输出参数 //创建mxArray数据对象,双精度标量 size=mxCreateDoubleScalar(data); //内存复制赋值 memcpy(mxGetPr(size),&data,1*sizeof(double)); mlfMypascal(1,&out,size);//函数调用 Mypascal函数的功能貌似是生成一个矩阵,矩阵首行首列都为1,其余位置的值等于其左边和上边紧挨着的数据的和 如上图
六月初七 2014-04-03
  • 打赏
  • 举报
回复
引用 1 楼 oyljerry 的回复:
out.dblVal
好像不对。

CString strtext;
int i,j;
//清除已显示的数据
m_List.DeleteAllItems();
intncolumn=m_List.GetHeaderCtrl()->
GetItemCount();
for (i=0;i<ncolumn;i++) m_List.DeleteColumn(0);
//设置标题栏
m_List.InsertColumn(0," ");//附空值
m_List.SetColumnWidth(0,60);//设置每栏宽度
for (i=0;i<m_size;i++)
{
strtext.Format("Column %d",i+1);
m_List.InsertColumn(i+1,strtext);
m_List.SetColumnWidth(i+1,60);
}
//显示结果数据
for (i=0;i<m_size;i++)
{
strtext.Format("Row %d",i+1);
m_List.InsertItem(i+1,strtext);
for(j=0;j<m_size;j++)
{
strtext.Format("%.f",*(mxGetPr(out)+i*m_size+j));
m_List.SetItemText(i,j+1,strtext);
}
}
把红色部分替换掉结果应该是这样:

oyljerry 2014-04-03
  • 打赏
  • 举报
回复
out.dblVal
delphi 为了完全支持OLE,32位Delphi 增加了Variant 数据类型,本节将从宏观角度来分析这种数据类型。实际上,Variant类型对Pascal语言有普遍而深入的影响,Delphi 控件库中与OLE 无关的地方也使用到这种类型。 Variant变量没有类型 一般说来,你可以用Variant 变量存储任何数据类型,对它执行各种操作和类型转换。需要注意的是:这违反了Pascal 语言的一贯原则,有悖于良好的编程习惯。variant 变量的类型检查和计算在运行期间才进行,编译器不会提示代码中的潜在错误,这些错误在进一步测试中才能发现。总之,你可以认为包含variant变量的代码是解释性代码,正如解释性代码一样,许多操作直到执行时才能知道,这对代码运行速度会有很大的影响。 上面对Variant 类型的使用提出了警告,现在来看看Variant 类型究竟能干什么。基本上说,如果声明了一个variant 变量: var V: Variant; 你就可以把各种不同类型的值赋给它: V := 10; V := 'Hello, World'; V := 45.55; 一旦得到一个variant 值,你可以把它拷贝给任何兼容或不兼容的数据类型。如果你把值赋给不兼容的数据类型,Delphi 会力尽所能进行转换,无法转换则颁布一个运行时间错误。实际上,variant变量中不仅包含了数据还包含有类型信息,并允许一系列运行时间操作,这些操作很方便,但运行速度慢且安全性差。 见例VariTest,它是上面代码的扩展。窗体上有三个编辑框,一对按钮,第一个按钮的OnClick 事件代码如下: procedure TForm1.Button1Click(Sender: TObject); var V: Variant; begin V := 10; Edit1.Text := V; V := 'Hello, World'; Edit2.Text := V; V := 45.55; Edit3.Text := V; end; 很有趣是不是?你可以把一个值为字符串的variant 变量赋给编辑框Text 属性,还可以把值为整数或浮点数的variant 变量赋给Text属性。正如你在图10.1中所看到的,一切正常。 (图10.1)按Assign按钮后,例VariTest的输出结果 图 10.1: 例 VariTest 的 Assign 按钮 Click 事件输出结果 更糟糕的是:你还可以用variant变量计算数值,从第二个按钮的Click事件代码就可看到这一点: procedure TForm1.Button2Click(Sender: TObject); var V: Variant; N: Integer; begin V := Edit1.Text; N := Integer(V) * 2; V := N; Edit1.Text := V; end; 至少这种代码带有一定危险性,如果第一个编辑框包含了一个数字,那么一切运行正常;如果不是,将会引发异常。这里再重申一遍,如果不到万不得以,不要随便使用Variant 类型,还是应坚持使用传统的Pascal 数据类型和类型检查方法。在Delphi 和 VCL中,variant变量主要是用于 OLE 支持和数据库域的访问。 Variant类型内部结构 Delphi中定义了一个 variant 记录类型,TVarData,它与Variant 类型有相同的内存布局。你可以通过TVarData访问variant变量的实际类型。TVarData 结构中包含了Variant类型信息(由Vtype域表示)、一些保留域及当前值。 VType域的取值包括OLE 自动化中的所有数据类型,这些类型通常叫OLE 类型或variant 类型。以下是variant 类型的完整列表,按字母顺序排列: varArray varBoolean varByRef varCurrency varDate varDispatch varDouble varEmpty varError varInteger varNull varOleStr varSingle varSmallint varString varTypeMask varUnknown varVariant 你可以在Delphi 帮助系统的variants 主题下找到这些类型的说明。 还有许多操作variant 变量的函数,你可以用它们进行特定的类型转换,或通过它们获取variant变量的类型信息(例如VarType 函数),当你用variant变量写表达式时,Delphi会自动调用这些类型转换和赋值函数。另外还有操作variant 数组的例程,你可以通过帮助文件的Variant support routines 主题了解相关内容。 Variant类型运行很慢! Variant 类型代码运行很慢,不仅数据类型转换如此,两个值为整数的Variant 变量相加也是如此。它们几乎跟Visual Basic这种解释性代码一样慢!为了比较Variant变量和整型变量的运行速度,请看例VSpeed 。 程序中设置了一个循环,记录运行时间并在进程条中显示运行状态。下面是基于variant类型的一段代码,基于整型的代码与此相似: procedure TForm1.Button1Click(Sender: TObject); var time1, time2: TDateTime; n1, n2: Variant; begin time1 := Now; n1 := 0; n2 := 0; ProgressBar1.Position := 0; while n1 < 5000000 do begin n2 := n2 + n1; Inc (n1); if (n1 mod 50000) = 0 then begin ProgressBar1.Position := n1 div 50000; Application.ProcessMessages; end; end; // we must use the result Total := n2; time2 := Now; Label1.Caption := FormatDateTime ( 'n:ss', Time2-Time1) + ' seconds'; end; 记时这段代码值得一看,因为你可以把它用到任何类型的性能测试中。正如你所看到的,程序用Now 函数获取当前的时间,用FormatDateTime 函数格式化时间差,输出结果以分("n")和秒("ss")表示。除此之外,你可以用Windows API的GetTickCount 函数,该函数能精确显示操作系统启动后至当前的毫秒数。 从上例可见两者的速度差异非常之大,以至于不用精确记时也能看到这种差异。图10.2是在本人计算机上运行程序看到的结果。当然运行结果取决于运行程序的计算机,但是两者的数值比不会有太大变化。
网站建设与维护&网络程序设计 实验指导书 实验二 VBScript程序设计 一、实验目的及要求 1.了解并掌握VBScript脚本程序设计语言的基本语法知识及简单程序设计方法; 2.熟练掌握ASP环境中的输出方法; 3.熟练掌握VBScript的If语句和Select Case语句的编程技术; 4.熟练掌握VBScript的For…Next、Do…Loop和For each…In等循环语句的编程技术; 二、实验内容 ⒈ 利用VBScript在网页中输出当前的时间和日期。 ⒉ 上机验证教材上的VBScript各个函数的功能,熟悉其用法。 ⒊ 上机验证教材上的例3-1至例3-8。 ⒋ 试用VBScript编程,实现计算并输出1到10的阶乘之和。 ⒌ 试用VBScript编程,实现计算并输出100到500的之间的水仙花数(水仙花数是指该数的值等于各位数字的立方和)。 ⒍ 试用VBScript编程,利用数组实现矩阵乘法。 三、实验指导 (一)VBScript函数 函数是一种特定的运算,在程序中要使用一个函数时,只要给出函数名并给出一个或多个参数,就能得到它的函数值。 VBScript内部函数可分为:转换函数、字符串函数、日期和时间函数、数学函数和检验函数。 1.转换函数 VBScript对Variant变量一般会根据需要自动转换成合适的数据类型;但有时,自动转换有可能造成数据类型不匹配错误。此时,就应使用VBScript的转换函数来强制转换数据的子类型。 常用的转换函数见下表: 函数功能 CStr(Variant)将变量Variant转化为字符串类型 CDate(Variant)将变量Variant转化为日期类型 CInt(Variant)将变量Variant转化为整数类型 CLng(Variant)将变量Variant转化为长整数类型 CSng(Variant)将变量Variant转化为Single类型 CDbl(Variant)将变量Variant转化为Double类型 CBool(Variant)将变量Variant转化为布尔类型 2.字符串函数 常用字符串函数及功能如下表: 函数功能 取字符串长度Len(string) 大、小写字母转换Lcase(String), Ucase(String) 截取子字符串Mid(string,start[,length]) Left(string,length) Right(string,length) 删除空格Trim(string), Ltrim(string), Rtrim(string) 重复String(num1,str1) 空格Space(num1) 取代字符串Replace(str1,str2,str3) 字符串拆分为1维数组Split(str1,delimiter) 返回字符串位置InStr(str1,str2) 3.时间和日期函数 函数功能 Now()取得系统当前日期和时间 Date()取得系统当前日期 Time()取得系统当前时间 Month(Date)取得给定日期的月份 Day(Date)取得给定日期是几号 WeekDay(Date)取得给定日期是星期几 (星期天,1到6分别为1~7) Year(Date)取得给定日期的年份 DateDiff(“Var”,Var1,Var2)计算日期或时间Var1与Var2的间隔 “Var”:为时间间隔因子 DateAdd(“Var”,num,date) num:间隔倍数;date:原始日期或时间对时间/日期num作加法 FormatDateTime(Date,2)显示短日期格式 FormatDateTime(Date,1)显示长日期格式 FormatDateTime(Date,4)显示短时间格式 FormatDateTime(Date,3)显示长时间格式 4.数学函数 函数功能 Abs(number)返回一个数的绝对值 Sqr(number)返回一个数的平方根 Int(number)取number的最大整数部分 FormatNumber(num1,num2)将num1转化为指定小数位num2的数 Rnd()返回0到1的随机数 Ubound(数组名,维数)返回最大下标数 Lbound(数组名,维数)返回最小下标数 5.检验函数 函数功能 VarType(Variant)返回变量Variant的数据子类型 IsEmpty(Variant)检查变量Variant是否为Empty IsNull(Variant)检查变量Variant是否为Null IsObject(Variant)检查变量Variant是否为对象类型 IsNumeric(Variant)检查变量Variant是否为数值类型 IsArray(Variant)检查变量Variant是否为数组类型 IsDate(Variant)检查变量Variant是否为日期类型 (二)VBScript脚本语言语句 1.条件语句 ⑴ If Then End If If 条件语句 Then 执行语句 End If ⑵ If Then Else End If(单条件) If 条件语句 Then 执行语句1 Else 执行语句2 End If ⑶ If Then Else End If(多条件) If 条件语句1 Then 执行语句1 ElseIf 条件语句2 Then 执行语句2 …….. Else 执行语句n+1 End If ⑷ Select Case 语句 Select Case 变量或表达式 Case 结果1 执行语句1 Case 结果2 执行语句2 …… Case 结果 n 执行语句n Case Else 执行语句n+1 End Select 2.循环语句 ⑴ For …… Next循环 For counter=start To end [Step number] 执行语句 Next ⑵ Do …… Loop循环 Do While 条件1 执行语句 Loop 或 Do 执行语句 Loop While 条件1 ⑶ For Each…In循环 For Each <元素> In <集合> <语句> Next 说明:对<集合>中的每一个<元素> 依次执行<语句>一次。其集合元素为离散型的。 (三)VBScript过程 在VBScript中,过程有两种:Sub子程序和Function函数。 (1) Sub子程序 ● Sub子程序的语法: Sub 子程序名(参数1,参数2,…) 语句…… End Sub ● 调用子程序 1) Call 子程序名(参数1,参数2,…) 2) 子程序名 参数1,参数2,… (2) Function函数 ● Function函数的语法: Function 函数名(参数1,参数2,…) 语句…… End Function ● 调用函数 变量= Function 函数名(参数1,参数2,…) 函数可以向变量一样引用和参与运算 (四)“显示当月日历”实例分析 该程序的运行结果为显示当月的日历,其输出形式为: ......

3,248

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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