请教没看懂的两段话:关于VB指针、API、结构指针的

slowgrace 2009-04-25 08:24:34
加精
在这个帖子的11楼:http://topic.csdn.net/u/20081223/18/9E5CEC7B-5025-460A-BA30-2BC85704BEB8.html

unsigned说:所有指针都一律定义为Long,但是自己要记得,或者做个标记,需要用到的时候,再通过VarPtr等传入指针(实体一定不能被释放掉)。
eglic问:那对于结构里面,固定长度的字符串呢?这个没办法用指针了吧?
unsigned说:使用byte array,对于unicode应该可以使用[string * N],当然也可以使用两倍的Byte Array或者Integer Array然后Copy进去,实际上对于结构最关键的就是结构对齐

在这篇文章的后部:http://www.vbgood.com/vb.good/article-do-view-articleid-2386.html
作者写道:有一点需要特别注意,在VB中指针的算法非常重要。此外,你必须计算元素的大小,因为VB不会帮你完成这项工作。你还必须处理缺乏无符号长整型数据类型的问题。下面的函数实现了无符号算法
Function UnsingedAdd (ByVal Start As Long, ByVal Incr As Long) As Long
Const SignBit As Long = &H80000000
UnsignedAdd=(Start Xor SignBit) + Incr Xor SignBit
End Function



没看懂的是标记为红色的部分,貌似他们在说相同的东西:
(1)unsigned说:“对于结构最关键的就是结构对齐”。这是什么意思?
(2)第二篇文章说:“在VB中指针的算法非常重要”。这个指针的算法是什么?能举个例子说明么?一般什么时候用?
(3)第二篇文章说:“你必须计算元素的大小”。这又是什么意思
(4)能逐字逐句解释一下上面这个“无符号算法”的意思么?
...全文
2013 127 打赏 收藏 转发到动态 举报
写回复
用AI写文章
127 条回复
切换为时间正序
请发表友善的回复…
发表回复
slowgrace 2009-05-05
  • 打赏
  • 举报
回复
谢谢楼上各位的耐心指点,俺基础差、脑子慢还贪玩,过了这么些天才算整明白了(也许只是自以为的明白)。

写了两个长长的笔记在这里:

一个是关于字节对齐的:http://blog.csdn.net/slowgrace/archive/2009/04/26/4124347.aspx

一个是关于无符号加减法的:http://blog.csdn.net/slowgrace/archive/2009/04/27/4130448.aspx

送给和我一样的菜鸟,俺就不另帖显摆了。

另外,高手就不必去看了(太长太长,充满了基础知识),不过要是有时间去指点一下,也是不胜荣幸的

谢谢各位这么长时间的关注!
PctGL 2009-05-04
  • 打赏
  • 举报
回复

......
太长了,跟小说是的。。。。

整数加法是不区分有无符号的,简单的理解起来,数值的存储和表示完全是两码事
另外这个东西已经证实过无数次了,就连计算机指令都是不区分有/无符号数的
神马都能聊 2009-05-04
  • 打赏
  • 举报
回复
楼主的帖子差不多都是经典了 哈哈哈

星星多啊... 好帖子得顶...
Tiger_Zhao 2009-05-04
  • 打赏
  • 举报
回复
[Quote=引用 121 楼 slowgrace 的回复:]
to tiger_zhao: 我觉得无符号整数的减法也是可以用加法来处理的。见这篇文章的3.6节。[/Quote]
真的没兴趣看。
做程序不是写YY小说,想到什么就是什么。
程序是以满足一定需求为前提的,UnsingedAdd() 的目的很明确,就是做无符号加法的。脱离这个限定就是跑题了。
如果想扩散话题,可以到 www.qidian.com
lizhizhendan 2009-05-04
  • 打赏
  • 举报
回复
貌似是这里,路过-.-
熊孩子开学喽 2009-05-03
  • 打赏
  • 举报
回复
这就像鸟和鱼一样.

鸟是在空气中飞行的,它习惯于空中的生活,
鱼是在水里"飞行"的,它习惯于水中的生活.

鸟可以尝试潜水,体验一下鱼的生活片断,
鱼也可以跃出水面,享受一下鸟的乐趣.

但是毕竟那不是属于它们自己的生活.

SO, 可以做一条有性格的鱼,也可以做一只有性格的鸟,但是你无法真正的改变生存的环境.

学了C,觉得没有指针是很难想像的事.
学了VB,觉得没有指针是很正常的事.

所以真的要体会指针,就去学C吧,用鸟的语言去表达鱼的生活,或者用鱼的语言去表达鸟的生活,都是吃力又不讨好的事.

这里不去讨论各种语言的优劣高低, 那太无聊.

但是学通了一种语言再去学其他的语言,会有不同的体会,这是肯定的.

SO, 在VB毕业之前, 了解一下有指针这个东西就行, 不必花太多力气深究了, 我相信99.99%的VB程序用不到这个.

楼上那些和你"讨论"VB指针技术的家伙, 都是通了VB又懂C的, 所以楼主还是先自己努力提高吧.
slowgrace 2009-05-03
  • 打赏
  • 举报
回复
这个指针算法,总算勉强弄明白了,谢谢楼上各位。

小结写在这里:http://blog.csdn.net/slowgrace/archive/2009/04/27/4130448.aspx。很长:) 因为以我的基础和理解力,要理解这样的东西要补充说明很多知识。

to soyokaze: 经过思考,觉得我抄的那个算法,即使按你的解释,也是有缺陷的,见这篇文章的2.5节。

to tiger_zhao: 我觉得无符号整数的减法也是可以用加法来处理的。见这篇文章的3.6节。
slowgrace 2009-05-03
  • 打赏
  • 举报
回复
[Quote=引用 118 楼 WallesCai 的回复:]
这就像鸟和鱼一样.

鸟是在空气中飞行的,它习惯于空中的生活,
鱼是在水里"飞行"的,它习惯于水中的生活.

鸟可以尝试潜水,体验一下鱼的生活片断,
鱼也可以跃出水面,享受一下鸟的乐趣.

但是毕竟那不是属于它们自己的生活.

SO, 可以做一条有性格的鱼,也可以做一只有性格的鸟,但是你无法真正的改变生存的环境.

学了C,觉得没有指针是很难想像的事.
学了VB,觉得没有指针是很正常的事.

所以真的要体会指针,…
[/Quote]

说得真好,深有同感!
littlefish636 2009-05-03
  • 打赏
  • 举报
回复
学习
slowgrace 2009-05-03
  • 打赏
  • 举报
回复
[Quote=引用 78 楼 m60a1 的回复:]
60L所说的是有数据后的地址对齐,如果地址不对齐的话,当要再使用此变量中的数据时,就会取不出正确的来
而LZ的意思只是说明了,在IDE中定义一个变量后,IDE或者OS如何来分配内存地址这个变量,二者说的不是同
一东西.
[/Quote]

请问m60a1,你是在试图告诉我堆空间和栈空间的区别么?

to tiger_zhao: 请问VB6中堆和栈的使用及其他内存的使用,和这篇文章中描述的一样么?http://blog.csdn.net/slowgrace/archive/2009/05/03/4144519.aspx

yyunffu 2009-05-02
  • 打赏
  • 举报
回复
精彩!
这个一定要顶!

其实这个就是内存访问方面的东西,字节对齐就是为了能使内存访问更具效率,省去不少CPU运算时间。
关于指针操作,如果想搞得明白一些,还是看看C/C++,虽然是学VB的。做开发的人,知识面宽一点只能更好。
czq117647602 2009-05-02
  • 打赏
  • 举报
回复
API……
wsq279024988 2009-05-02
  • 打赏
  • 举报
回复
支持一个啊
slowgrace 2009-05-01
  • 打赏
  • 举报
回复
[Quote=引用 90 楼 Tiger_Zhao 的回复:]
既然已经命名为 UnsignedAdd,Soyokaze 在 88 楼说传入负数做减法是具有严重二义性的,Incr := &H80000000 到底是 +2147483648 还是 -2147483648 就不确定了。
既然做无符号运算,有 UnsignedAdd 就要有对应的 UnsignedSub。
[/Quote]

这其实不是个问题。因为当作正数或当作负数,计算结果只是会相差2^32。而这相当于对32位整数取模,对计算结果没影响的。也就是,对于32位整数(无论是否有符号):
A+B=A+B+2^32=A+B-2^32
shuihan20e 2009-04-30
  • 打赏
  • 举报
回复
收藏了
Simao 2009-04-30
  • 打赏
  • 举报
回复
学习中...
Tiger_Zhao 2009-04-30
  • 打赏
  • 举报
回复
[Quote=引用 101 楼 slowgrace 的回复:]
貌似有道理,可是的话,那94楼的代码我给lY传个&H80000000 ,那到底是加啊还是减啊?或者说

(1)希望lX前进&H80000000
(2)希望lY后退&H80000000

这两个分别如何给lY传值?[/Quote]
UnsignedAdd 哪来的减法?
Soyokaze 的说法已经偏离了函数的设计需求,不予讨论。
Soyokaze 2009-04-30
  • 打赏
  • 举报
回复
[Quote=引用 106 楼 slowgrace 的回复:]
恩,也是。&H80000000的绝对值是整个取值范围的一半大了,无论是按加还是按减算,有效的地址只能有一个。
[/Quote]
105#的情况只是一个特例。
在VB里,写作16进制的数,VB直接原封不动的输入,例如&H80000000就是按照0B1000000000000000000000000000000输入,写作10进制的,VB就需要按照补码输入了。
“无论是按加还是按减算”,这只是编程者的意图,在电脑里,直接把incr和start相加的。
所以,运算的结果到底是加还是减,是看incr的形式。要明确的把补码运算原理和硬件的全加器工作过程区分开。
nettman 2009-04-30
  • 打赏
  • 举报
回复
Mark!
slowgrace 2009-04-29
  • 打赏
  • 举报
回复
还没完全看懂,先严重谢谢soyakaze and zhao。

另外,异或真是个奇妙的运算符,跟它对眼中……
加载更多回复(107)

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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