《编程的奥秘》读者问答(时时更新)

2024-01-18 08:32

本文主要是介绍《编程的奥秘》读者问答(时时更新),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

以下将我收到的邮件中读者常问的问题进行统一回答。欢迎读者反馈各种意见。

(有关问题我会以评论的方式及时在此跟贴,时时更新)


问:

您好,金老师,我是贵书《编程的奥秘》的读者,虽然还未读完,但能感受到您对编程的热情以及对教育事业的努力,请允许我说一声“谢谢”,下边说一下我在读贵书时遇到的困惑。

环境:win2000pre+VS.NET 2003
问题:几乎每个例子编译时都会提示:“未处理的“System.ArithmeticException”类型的异常出现在 system.drawing.dll 中。其他信息: 算术运算中发生溢出或下溢。”
,之后我请教过别人,但他们的办法我试后无效。我曾怀疑是编译器的问题,但在网上DOWN了三个IOS文件,安装后出现同样的问题,另外,我按书中打源代码编译时问题一样出现。您经验比我丰富,或许知道问题的原因,所以我发信一封想您请教。

恳请金老师帮忙,为谢!!!

回复:
如果是每个例子都无法编译,那只能肯定是VS.NET未安装好。最简单的办法是安装一个“干净的”的Windows,然后先安装VS.NET,成功以后再安装其它软件。另一原因是病毒影响,GDI+(刚好在System.Drawing.DLL中)有个漏洞,可被病毒利用,微软发布过相关补丁。
--------------------------------------------------------------------------------------------------------

问:
今天把您的著作粗略的读完了,信心很足,打开vs.net准备写点东西.
但是一开始就遇到了麻烦,虽然解决了但是心中还存有疑虑
 
'点击按钮出现一个窗体

Private fm1 As form1
If fm1 Is Nothing Then
fm1 = New form1
fm1.Show()
End If
这样的话,当新窗体关闭后,再点击按钮就不出现新窗体了


Private fm1 As form1
If fm1 Is Nothing OrElse fm1.IsDisposed Then
fm1 = New form1
fm1.Show()
End If

加上OrElse fm1.IsDisposed 的话就正常了

关闭窗体不就是销毁窗体了嘛?为什么还要判断IsDisposed ,不能只判断nothing呢?

也就是说当实例窗体关闭(点右上X关闭)后 fm1不是nothing嘛?

答:
关键在于.NET的垃圾回收机制。与C++不同,在VB.NET中将一个窗体关闭之后,并不会立即销毁它,并回收其资源,而只是打上了一个“不用”的标记(IsDisposed =True),等到垃圾回收进程运行时,这些对象才会被真正地销毁,在此之前,frm1<>Nothing。
---------------------------------------------------------------

问:
今天遇到一个困惑,我把书上215~217上的程序敲入,准备运行,但是运行后点击"从数据库获取数据按钮后",出现了"未处理的“System.Data.OleDb.OleDbException”类型的异常出现在 system.data.dll 中。
"的错误提示.此时程序执行到da.fill(dt)这一行.

请金老师百忙之中抽空看一下.

另外,程序中" da.SelectCommand = comm"不是很理解. 为什么不是 da.SelectCommand = comm.commandtext呢?


答:
有非常多的错误会引发这个异常,常见的原因是SQL命令的格式有误。
    另外,OleDbDataAdapter的SelectCommand属性接收一个OleDbCommand类型的对象,此对象用于从数据库中提取数据。
    第七章中有详细说明,请参看7.4节。
----------------------------------------------------------
问:
您好,我是一位江苏无锡的读者,对您的著作甚是喜欢,但是其中也有不明白的地方,请指教:

P130页  “两个SUB过程,为什么传值后tempobj与obj指向的对象还是同一个,而引用后就不同了。”
看了您作出的解释但是不是很明白,能否请您在百忙之中再给我详细解释一下呢?

答:
  对象变量其实可以看成是一个整数变量,只不过它存放的“整数”很特殊,是内存地址值。
    dim obj as new RefVal
    这句执行后,在内存中创建了一个“大”的区域,用于存放以类RefVal为模板创建的对象(一个类可以创建任意多个对象)数据,存放这些数据的第一个内存单元的地址被放到变量obj中(如果把内存单元看成是小屋子,则内存地址可以看成是门牌号),假设其为ABCD。
    所以,Obj.i=100的含义是到地址为ABCD的内存单元处开始寻址并找到变量i的区域,将其改为100.
    当obj作为参数被传送到Sub ChangeObjByVal()中时,一个隐含的整数对象被创建,其值与obj相同,也为ABCD.
这样,在Sub过程内部使用的Obj其实与Sub过程外的Obj是两个独立的整数对象。只不过其值相同,都代表着真正的RefVal对象数据的首地址。
    但在这个过程中,RefVal对象本身并没有被复制一份,被复制的只不过是它的首地址数据(如ABCD)罢了。
    在Sub ChangeObjByRef()中,与上不同之处在于在Sub ChangeObjByRef过程内使用的obj变量与过程外的是同一个,不存在地址值的复制问题。是否会将参数复制一份,这就是ByRef与ByVal的区别所在。
    呵呵,希望我讲清楚了。请再回头看看P84页的相关内容。

再问:
但是 Sub ChangeObjByVal()中 "obj=new refval"这句话不是又重新初始化了实例啊
这时obj.i=0啊,难道 这个obj和sub外的obj不是同一个?

再答:
凡是以ByVal方式传送的参数都被复制了一份。所以,在Sub ChangeObjByVal()中的obj和Sub外部的obj不是一个。
obj=new refval"这句话确实重新初始化了实例,但它的修改不影响Sub外的obj变量。

2月25日 更新

问:读这本书要求有哪些基础

我主要是针对大学低年级学生的知识结构来组织材料的,对读者知识水平的最低要求是高中毕业。如果是在校大学生,并且是计算机及相关专业的,则最合适不过。书中涉及到了一些数学知识,超过了高中数学的范畴,跳过就行了,不影响书的学习。

问:书的定价是否过高?

许多经济不宽裕的读者来邮件抱怨书价过高,但书价是由出版社定的,作者无能为力。一名山东的读者来邮件说他省下了一星期的早餐买下了这本书,我很感动,但身体是革命的本钱,还是要注意保重健康的。学习软件开发是需要有一定的物质保障的,如果您没有上机的机会,那么,这本书所介绍的许多东西是难以掌握的。在写作时,我是假设读者能有一台用于开发实践的电脑的,如果能上网就更好了。如果个人经济条件不具备,我想还是从现实出发,先考虑如何立足自己的实际,把生活过好来,学习软件技术未免有点脱离现实了。

问:为何不用C#作例子?

主要原因就是我一直使用VB.NET开发,因此,积累的代码实例是VB.NET的,实在没有时间将其转化为C#。而且本书主要强调的是编程的思想、方法与相关的计算机理论,语言不是重点,读者可以按照本书介绍的次序去自学C#,一样是没问题的。

问:哪儿有卖这本书?

主要是大中城市的科技书店,小城市与县城书店恐怕不会进这本书,这些地方的读者可以通过网上书店订购,或者直接联系电子工业出版社博文视点公司看看能不能邮购。

问:老师能不能指导我学习软件技术?

很多读者要求我能指点指点。如果您在北京,我每个学期都在北京理工大学开设.NET选修课,可以直接到学校来听课(开放的)。外地读者如果有困惑,可以发邮件,问得多的问题我统一在这个BLOG上回复,另外,我也只是半桶水,说的话仅是个人观点,很害怕“误人子弟”,如果观点有错误,也请大家原谅。由于收到的邮件较多,可能不一定回复,在此也敬请读者谅解。

问:买到你的书了,感觉前几章有些凌乱,把人的脑子搞的乱乱的,有东一鎯头西一棒子的感觉,并不是围绕着一个例子从头到尾的叫,让人很别扭呀,不好意思,我有话直说啦.

请回头再仔细看看《自序》中对全书结构的说明。软件本就是一个“集成”的产物,一个程序其实是多种技术的组合,各种具体的知识点相当于七巧板中的七个构造块,并无主从关系,而程序本身就相当于用七巧板拼出的图案,整个关键在于七巧板模块间组合的方式。所以我才采用这样的组织方式写书。



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=609718


这篇关于《编程的奥秘》读者问答(时时更新)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/618520

相关文章

零基础STM32单片机编程入门(一)初识STM32单片机

文章目录 一.概要二.单片机型号命名规则三.STM32F103系统架构四.STM32F103C8T6单片机启动流程五.STM32F103C8T6单片机主要外设资源六.编程过程中芯片数据手册的作用1.单片机外设资源情况2.STM32单片机内部框图3.STM32单片机管脚图4.STM32单片机每个管脚可配功能5.单片机功耗数据6.FALSH编程时间,擦写次数7.I/O高低电平电压表格8.外设接口

16.Spring前世今生与Spring编程思想

1.1.课程目标 1、通过对本章内容的学习,可以掌握Spring的基本架构及各子模块之间的依赖关系。 2、 了解Spring的发展历史,启发思维。 3、 对 Spring形成一个整体的认识,为之后的深入学习做铺垫。 4、 通过对本章内容的学习,可以了解Spring版本升级的规律,从而应用到自己的系统升级版本命名。 5、Spring编程思想总结。 1.2.内容定位 Spring使用经验

探索蓝牙协议的奥秘:用ESP32实现高质量蓝牙音频传输

蓝牙(Bluetooth)是一种短距离无线通信技术,广泛应用于各种电子设备之间的数据传输。自1994年由爱立信公司首次提出以来,蓝牙技术已经经历了多个版本的更新和改进。本文将详细介绍蓝牙协议,并通过一个具体的项目——使用ESP32实现蓝牙音频传输,来展示蓝牙协议的实际应用及其优点。 蓝牙协议概述 蓝牙协议栈 蓝牙协议栈是蓝牙技术的核心,定义了蓝牙设备之间如何进行通信。蓝牙协议

Linux系统稳定性的奥秘:探究其背后的机制与哲学

在计算机操作系统的世界里,Linux以其卓越的稳定性和可靠性著称,成为服务器、嵌入式系统乃至个人电脑用户的首选。那么,是什么造就了Linux如此之高的稳定性呢?本文将深入解析Linux系统稳定性的几个关键因素,揭示其背后的技术哲学与实践。 1. 开源协作的力量Linux是一个开源项目,意味着任何人都可以查看、修改和贡献其源代码。这种开放性吸引了全球成千上万的开发者参与到内核的维护与优化中,形成了

IPython小白教程:提升你的Python交互式编程技巧,通俗易懂!

IPython是一个增强的Python交互式shell,它提供了丰富的功能和便捷的交互方式,使得Python开发和数据分析工作更加高效。本文将详细介绍IPython的基本概念、使用方法、主要作用以及注意事项。 一、IPython简介 1. IPython的起源 IPython由Fernando Pérez于2001年创建,旨在提供一个更高效的Python交互式编程环境。 2. IPyt

从《深入设计模式》一书中学到的编程智慧

软件设计原则   优秀设计的特征   在开始学习实际的模式前,让我们来看看软件架构的设计过程,了解一下需要达成目标与需要尽量避免的陷阱。 代码复用 无论是开发何种软件产品,成本和时间都最重要的两个维度。较短的开发时间意味着可比竞争对手更早进入市场; 较低的开发成本意味着能够留出更多营销资金,因此能更广泛地覆盖潜在客户。 代码复用是减少开发成本时最常用的方式之一。其意图

个人博客文章目录索引(持续更新中...)

文章目录 一、Java基础二、Java相关三、MySql基础四、Mybatis基础及源码五、MybatisPlus基础六、Spring基础及源码七、Tomcat源码八、SpringMVC基础及源码   随着文章数量多起来,每次着急翻找半天,而是新申请的域名下来了,决定整理下最近几年的文章目录索引。(红色标记为常检索文章) 一、Java基础 1、Java基础(一):语言概述2、J

Java并发编程—阻塞队列源码分析

在前面几篇文章中,我们讨论了同步容器(Hashtable、Vector),也讨论了并发容器(ConcurrentHashMap、CopyOnWriteArrayList),这些工具都为我们编写多线程程序提供了很大的方便。今天我们来讨论另外一类容器:阻塞队列。   在前面我们接触的队列都是非阻塞队列,比如PriorityQueue、LinkedList(LinkedList是双向链表,它实现了D

剑指offer—编程题7(用两个栈实现一个队列)

题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail 和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。 代码如下: [java]  view plain copy print ? public class Test07 {       /**       * 用两个栈模拟的队列       *