跳到主要内容

.NET Framework 的容器

· 阅读需 5 分钟

自从我发现了 STL(Standard Template Library),它就成了我编写 C++ 程序时的标配。STL 提供的容器和算法极大地简化了开发工作,提高了代码复用性和可维护性。
最近,我开始研究 C# 中的泛型和标准容器,试图了解它们在实现 STL 类似功能时的表现。本篇文章总结了 C# 的标准容器,以及它们的特点和用法。研究的环境是 Visual C# 2005。

C# 的容器分类

在 C# 中,容器大致可以分为两类:数组(Array)集合(Collection)

  1. Array 类
    System.Array 类是 C# 中提供的一种基本容器,可以看作是 STL 中 vector 的类似实现。它提供了数组操作的基础功能,如查找和排序。
    特点

    • 不需要通过专门的类声明变量。直接使用元素类型加中括号即可声明数组,例如:
      int[] myIntArray = new int[5] { 1, 2, 3, 4, 5 };
    • 声明方式直观,但灵活性稍逊于泛型集合。
  2. 集合(Collections)
    集合类在 C# 中主要分布在以下两个命名空间中:

    • System.Collections(C# 1.0)
      该命名空间包含了一些非泛型集合类,如:

      • ArrayList
      • BitArray
      • Hashtable
      • Queue
      • SortedList
      • Stack
        这些容器为早期的 C# 提供了数据存储和操作的基本工具,但由于它们不支持类型安全,使用时需要格外注意类型转换问题。
    • System.Collections.Generic(C# 2.0 引入)
      C# 2.0 引入泛型编程后,该命名空间新增了泛型集合类,极大地提升了代码的类型安全性和性能。主要容器包括:

      • Dictionary:键值对集合,类似于 STL 中的 mapmultimap
      • LinkedList:双向链表实现,用于插入和删除频繁的场景。
      • List:类似于 STL 中的 vector,是一个动态数组。
      • Queue:先进先出(FIFO)集合,与 STL 中的 queue 功能类似。
      • SortedDictionarySortedList:提供有序存储功能。
      • Stack:后进先出(LIFO)集合,与 STL 中的 stack 类似。

与 STL 的对比

C# 和 C++ STL 提供的容器种类有一定相似性,但也存在一些显著差异:

C# 容器STL 容器功能描述
Arrayvector动态数组,支持随机访问。
Dictionarymap/multimap键值对集合,支持快速查找。
List / SortedListlist单链表/有序列表。
Queuequeue先进先出的队列结构。
Stackstack后进先出的栈结构。
BitArraybitset位操作集合。

虽然两者在功能上有很多重叠,但 C# 的集合通过泛型和命名空间分类,实现了更好的类型安全性和模块化。

主要容器简介

  1. Array Array 提供基础数组功能。声明简单,功能全面,例如:

    int[] numbers = new int[] { 1, 2, 3, 4, 5 };
    Array.Sort(numbers);
    Array.Reverse(numbers);

    它类似于 STL 的 vector,但无法动态扩展长度。

  2. Dictionary Dictionary 是一种键值对集合,常用于快速查找和映射。例如:

    Dictionary<string, int> nameToAge = new Dictionary<string, int>();
    nameToAge.Add("Alice", 30);
    nameToAge.Add("Bob", 25);
  3. List List 是一个动态数组,支持快速随机访问和灵活的扩展。例如:

    List<int> numbers = new List<int> { 1, 2, 3 };
    numbers.Add(4);
    numbers.RemoveAt(2);
  4. Queue 先进先出的集合结构:

    Queue<string> tasks = new Queue<string>();
    tasks.Enqueue("Task 1");
    tasks.Enqueue("Task 2");
    string nextTask = tasks.Dequeue();
  5. Stack 后进先出的集合结构:

    Stack<string> history = new Stack<string>();
    history.Push("Page 1");
    history.Push("Page 2");
    string lastVisited = history.Pop();

总结

C# 提供的容器丰富多样,尤其是泛型容器在性能和类型安全性上远胜于 C# 1.0 中的非泛型集合。虽然它们与 STL 的容器设计思路有所不同,但在功能实现上,C# 集合为开发者提供了相当强大的工具。无论是选择 Array 还是泛型集合,开发者都能根据需求灵活使用。

查看或添加留言

我一直拖着没做的两件事

· 阅读需 3 分钟

昨天,在我的硬盘里翻找资料时,我偶然发现了从弟弟那里拷贝来的一套有声教材《激发个人潜能》(安东尼·罗宾)。我带着好奇,把第一课放进 MP3 播放器里,边听边琢磨。作者安东尼·罗宾的自信让人印象深刻,他声称听完这套课程后,听众们将踏上成功之路,甚至可能成为百万富翁。

这就是所谓的“成功学”啊!我可不那么幼稚,毕竟成功之路不会这么简单。但是成功是是需要学习的 :) 我还真没读过这类的书或上过这一类的课。而我也确实在这方面有所欠缺,学一学应该对我有好处。而且,就算内容真的都是胡编乱造,练习一下英语听力也是好的。因此,我决定用一个月的时间把这套课程听完,说不定能从中学到些什么。

第一课结束后,安老师还布置了课后作业:列出两件一直拖延没做的事情,并立即行动。我这个拖延症患者没做的事太多了,写出一两百件也不在话下。但这次,我决定正视这个问题,先完成两件对我来说至关重要却一直被拖延的事情:

  1. 完成毕业论文。其实这一年里陆陆续续一直再写,但进度太慢,再拖下去,就没法毕业了。
  2. 拔掉智齿。这件事也已经拖了一年半,实在该解决了。
查看或添加留言

信号调理模块的功能

· 阅读需 11 分钟

一. 虚拟仪器系统和信号调理模块

虚拟仪器(Virtual Instrument)是当前测试技术与仪器制造领域广泛关注的热点话题。虚拟仪器系统是一种基于计算机的自动化仪器系统,是现代计算机技术与传统仪器技术完美结合的产物。通过将计算机强大的图形界面和数据处理能力与仪器模块相结合,虚拟仪器能够实现测量数据的采集、分析和显示。

图 1 展示了一个典型的虚拟仪器测试系统,它通常由以下三个主要部分组成:

  1. 混合总线测量仪器及数据采集模块。
  2. 专用转接及信号调理模块。
  3. 被测对象。

信号调理模块作为连接前端传感器和后端数据采集设备的中间环节,其作用不可忽视。

二. 信号调理模块的功能

信号调理在大多数数据采集和控制系统中起着至关重要的作用。典型系统通常配备信号调理硬件,用于将原始信号或传感器输出接口到数据采集板或模块。信号调理通过放大、隔离、滤波、多路转换以及直接调理变送器等功能,大幅提升了数据采集系统的可靠性和性能。

2.1 功能概述

信号调理模块的主要功能包括:

  1. 传感器驱动

包括为无源传感器提供所需的电压源或电流源,为有源传感器提供其运转所需的特殊电路结构。下表列出了几种不同类型传感器对信号调理模块的要求:

传感器类型信号调理模块功能
热电偶模拟低压输入
热敏电阻模拟输入
加速度计频率至电压转换
LVDT, RVDT电阻、多路复用器、矩阵变换电路
应变片电阻、模拟电压输出、模拟电流输出
  1. 信号放大

为了提高模拟信号转换成数字信号时的精度,我们希望输入的模拟信号的最大值刚好等于A/D转换设备输入范围。大多数传感器的输出范围在mV级,而A/D转换设备输入范围为Volt级。因此我们需要使用信号调理模块对传感器的信号放大。下表列出了信号调理模块对信号放大倍数与信噪比的关系

方案信号幅值调理模块放大倍数噪声幅值采集模块放大倍数输出信号幅值信噪比
仅数据采集模块放大0.01 V0.001 V×1001.1 V10
数据采集与调理模块放大0.01 V×100.001 V×101.01 V100
仅信号调理模块放大0.01 V×1000.001 V1.001 V1000
  1. 信号隔离

在测量高电压信号时,隔离电路可以保护你的后端设备被意外的高电压输入损坏。常用的有光隔离和磁隔离。隔离放大电路的缺点是有可能引入噪声。

  1. 信号滤波

模拟信号在数字化前必须进行低通滤波,以消除噪声和防止混叠现象。同时也可以使用信号调理模块滤除50-60Hz的工频噪声。

  1. 扩展通道数

有些信号调理模块具有多路转换器或矩阵变换电路的功能,可以把通道信号通道扩展至上千路。

  1. 其他功能

信号调理模块还可以实现信号衰减、采样同步、频率-电压的转换等功能。

三. 常用信号调理模块

目前常用的信号调理模块包括 NI(National Instruments)公司的 SCXI 系列模块。

3.1 SCXI 系统简介

SCXI(Signal Conditioning eXtensions for Instrumentation) 系统是一个多用途、高性能的信号调理平台。适用于通道超过一定数量,封装条件恶劣、并且对信号调理的要求很高的应用系统。SCXI可以用作插卡式数据采集板、VXI模块或PXI模块的调理前端,还可以将它做为完整的远程数据采集系统。通过SCXI系统强大的多路能力,SCXI系统可以将多达3072路信号接入到一块数据采集板上。对于多通道、缓变的数据采集系统,如温度监测系统,SCXI是一种高可靠性的选择。

以下为 SCXI 系统的主要功能:

功能类别支持信号
模拟输入热电偶、热电阻(RTD)、应变片、毫伏源、电压源(最高 250 Vrms)、电流源等
模拟输出电压输出、电流输出
数字 I/O光隔离输入/输出

SCXI 系统支持多达 12 个调理机箱,每个机箱可容纳 4 至 12 个模块,满足大规模、多样化数据采集需求。

    SCXI多通道信号调理系统可以适用于以ISA、PCMCIA、PCI、PXI、VXI等为采集总线的计算机系统。您可以将SCXI做为数据采集前端,或通过并行接口与采集设备组成外挂式数据采集系统。一个SCXI系统最多可以接入十二个调理机箱,每个调理机箱中可以插入最多四个(SCXI-1000)或十二个(SCXI-1001)调理模块。各种传感器信号通过接线端子或前端接入到调理模块,经调理模块调理后的信号,则通过SCXI系统总线送入相应的数据采集设备。

3.2 另外一类较为常用的信号调理系统是SCC系统

SCC是适用于低通道应用的便携式信号调理平台。不象SCXI一个模块同时处理一组信号,平台为每一个信号提供单独的模块。SCC平台还提供了切换开关、LED,以及BNC和LEMO等常用的连接端子。无论是SCXI,还是SCC平台都有用于测量、激励、隔离和过滤的模块。下图是SCC系统的展示图。

四. 信号调理系统实例

以下通过一个应用实例,介绍如何在测试系统中选择信号调理模块并搭建信号调理系统:

  1. 系统需求
    对8路温度信号进行采集,并通过温度测量软件进行转换和分析。测量结果需在显示器上显示,并存储至硬盘供后续分析处理。

  2. 信号调理模块选型
    选用 SCXI-1102B 模块。该模块具备32个差分输入通道,能够调理多种输入信号,包括热电偶信号、毫伏信号、伏信号以及420mA和020mA电流信号。每个通道可独立设置放大倍数(1倍或100倍),支持200Hz低通滤波,并具有高达333kSa/s的扫描速率。

  3. 数据采集模块选型
    选用 PXI-6070E 数据采集模块。这是一款12位多功能数据采集卡,具有16路单端输入或8路差分输入通道,最高采样速率为1.25MSa/s。

  4. 计算机配置
    配备 PXI-1010 PXI机箱及其控制器,并外接显示器。PXI-1010是混合式PXI机箱,可同时插入PXI零槽控制器、7个PXI仪器模块和4个SCXI信号调理模块。

  5. 功能实现
    8路温度信号首先通过信号调理模块 SCXI-1102B 进行处理,随后经SCXI背板模拟总线传输至数据采集模块 PXI-6070E 进行A/D转换。转换后的数据通过系统数据总线传递至分析软件,实现信号分析、显示和存储功能。

通过上述配置,该系统能够高效完成温度信号采集、处理及后续分析任务。

查看或添加留言

我的人工荨麻疹经历

· 阅读需 17 分钟

2005年9月22日

今年四月,我第一次注意到自己的身体出现了异样。当时我身在美国德州,这里气候干燥炎热,但自然环境十分优美。我所在的奥斯汀地区森林覆盖率极高,春季时漫山遍野繁花盛开,空气中弥漫着浓烈的花香与飘散的花粉。然而,美丽的景色背后也隐藏着“杀手”——花粉过敏,这里许多居民对此深受其害。

一天晚上,我像往常一样洗完澡,正准备躺下休息。无意间摸到自己的后背,发现皮肤竟然不再光滑,而是起了一道道明显的突起。起初,我并没有多想,归因于自己洗澡时太过用力——毕竟,我一向习惯用粗糙的搓澡巾狠狠地搓洗。但不久后,情况变得更加糟糕:不仅是后背,连手臂上被挠过的地方也会迅速出现红肿的条纹。我隐约感到不安,猜测这可能是花粉过敏的表现。

然而,在美国看病昂贵,我一时舍不得去医院,再加上症状并未严重到妨碍生活,我决定暂且忍耐,期待回到上海后脱离花粉环境,症状自然会消失。

两个月后,我回到上海。可惜事与愿违,不仅症状没有减轻,甚至变得更加严重。回到上海后又过了三个月,我终于感到事情不妙,急忙上网查找资料。经过一番阅读,我初步判断自己患上了一种过敏引起的人工荨麻疹(俗称皮肤划痕症)。然而,令我感到忧虑的是,这种疾病即便过敏源消失,也未必会自行康复。如果拖延不治,甚至可能导致高敏体质,未来治疗更加棘手。

终于,我鼓起勇气前往医院。医生的诊断与我的猜测不谋而合 - 人工荨麻疹。这种疾病是皮肤受到轻微刺激后过敏反应过度所致。医生为我开了盐酸西替利嗪,这是第二代抗组胺药物,与我过去服用的扑尔敏相比,它的优势显而易见:几乎无法透过血脑屏障,因此不会引起嗜睡等副作用。

从那天起,我每晚服用一片盐酸西替利嗪。初次用药后效果非常明显,第二天我故意用手指划过胳膊,发现皮肤虽然会留下浅浅的红色印记,但不再隆起。这让我稍稍松了一口气。

遗憾的是,人工荨麻疹的发病机制尚未被完全研究清楚,医学界也没有找到特效药。目前的治疗主要依赖抗组胺药物,部分患者需要长期服药,甚至一年以上。幸运的是,盐酸西替利嗪被认为副作用极低,长期服用相对安全,这让我稍感宽慰。

现在,服药已经近两个月了,症状虽有所减轻,但离康复还很遥远。我发现,身体状况的好坏与过敏反应密切相关。休息充分时,症状明显减轻;而熬夜或疲惫时,过敏反应则加剧。因此,充足的睡眠和适当的锻炼成为我日常生活中不可或缺的一部分。与此同时,我还调整了日常习惯,比如放弃了粗糙的搓澡巾,改用温和的儿童型沐浴露,尽量减少皮肤受到的刺激。

虽然前路漫长,但我相信,只要坚持科学治疗和健康的生活方式,总有一天能战胜这可恼的疾病。希望那一天不会太遥远 :)

2005年11月2日

如今,过敏似乎成了越来越常见的问题。我的周围就有好几个人不同程度地出现了过敏症状。奇怪的是,他们都无法确切找到自己的过敏原。也许是环境污染日益加剧的缘故,稍微体质差一点的人便难以承受。

前几天,一位网友因为看了我的博客,把我误当成了医生。他希望能从我这里获得治疗建议,可惜我也只是个病人,没能帮上什么忙。他的过敏症状比我还严重,真心希望他能早日康复。

至于我,服药至今已有三个多月,病情依然没有好转。看来距离痊愈还有很长的路要走。医生说,过敏期间有许多饮食禁忌,比如不能吃海鲜、蘑菇和竹笋,但偏偏这些都是我的最爱。让我忌口,还不如让我过敏呢!馋得发慌,我该怎么办啊?

2006年1月2日

转眼间,病情持续了近一年,我仍然没有康复的迹象。:( 我开始思考,究竟怎样才能增强免疫力?

我平时独自在上海生活,前些日子趁着休假回老家小住了几日。有一天,我和老爸靠在沙发上看电视。节目中,一位农妇自称拥有特异功能,说有时睡醒后,肚皮上会浮现出文字,她认为这是上天的启示。我一看就乐了,转头对老爸说:“这特异功能我也有!”老爸一脸不信。于是我走进卧室,在肚皮上随手画了几下,过了一会儿走出来,只见肚皮上赫然凸起一个大字:“饿”。

2006年3月17日

从最初发现症状到现在,整整一年过去了。遗憾的是,病情毫无好转。最近我又回到了德州,倒时差的过程中,反而觉得症状更加严重,可能是因为疲劳或者水土不服。好在时差调整过来之后,情况稍微有所缓解。

这一年来,我一直在服用抗过敏药物(主要是盐酸西替利嗪)。尽管药物暂时能控制症状,但我对长期服药的副作用非常担忧。

我计划这次回上海后到华山医院看看。据说那里的皮肤科在国内口碑不错。我真的不想这样拖下去了,尽管听说这类疾病没有特效药,但总要试试,哪怕只是碰碰运气。

总结这一年的经验,我认为多睡觉、补充维生素和钙,少吃海鲜确实可以显著减轻过敏反应。虽然这些方法未必治愈,但起码能让症状缓和一些。

2006年5月25日

今天,我终于去了上海的华山医院。经过漫长的等待和花费了不少人民币,我见到了一位据说很有经验的皮肤科医生。可他的诊断让我感到非常失望。

他说,我的情况属于典型的过敏体质,而这种体质几乎无法改变。既然服药还能控制症状,就继续吃药吧。这番话让我心灰意冷,忍不住感到难过。:'(

更糟的是,为了看病,我早早起床,结果折腾了一天,感觉过敏症状比平时更严重了,真是气不打一处来。

看来,从今往后,我只能靠自己小心应对了。少吃刺激性的食物,多锻炼身体,保持生活规律 - 或许这是唯一的出路。

2006年8月12日

自从上次医生告诉我这是“难以治愈的病症”,又过了两个月。这段时间,我的状况反而有了明显的改善。现在我已经停止服药,瘙痒感基本消失了。以前轻轻一碰皮肤就发红、隆起的情况,现在敏感度降低了许多。尽管还没完全康复,但我想分享一下这两个月来我做的努力,也许对其他患者有所启发。

在这两个月里,我做了以下几件事:

  • 搬家,改善居住环境。我原来住的地方条件非常差,相当于住在别人家的自行车棚里,潮湿、不通风、灰尘多,蚊虫也特别多。我就是搬到那里后得了人工荨麻疹。后来,我换了一个干净整洁的住处,通风良好,环境清爽,我认为这是病情改善的重要原因之一。
  • 加强体育锻炼。我开始规律性地运动,包括跑步、游泳和打球等,每周至少锻炼三次。运动不仅让我身体更强壮,还让我感觉精神状态更好了。
  • 饮食调整。我彻底戒掉了海鲜和巧克力等食物。几个月前,我吃了一次海鲜,结果手臂上立刻出现几个红斑,持续了两三天才消退。至于巧克力,我小时候曾对它过敏,所以干脆不碰了。另外,我连可乐、咖啡这些刺激性的饮品也一并戒了。
  • 注射卡介苗。卡介苗是一种去毒的肺结核菌疫苗,据说可以增强免疫力。我在一家中医院尝试了穴位注射的疗法,在腿上的几个穴位注射了三次。虽然不确定这个方法效果如何,但我觉得免疫力确实有提升。

2006年9月26日

以下是我写给一位病友的留言:

我现在也没有完全治愈,甚至都没做过过敏原测试。但我想告诉你,持续的体育锻炼可能是提升免疫力、改善病情的唯一有效方法。这需要多久见效因人而异,但至少需要半年甚至一年以上。只要坚持下去,一定会有所帮助。

也许这番话听起来让你有些失望,但作为一名患人工荨麻疹多年的“老病号”,我深深理解你的痛苦,也能体会你急于摆脱病痛的心情。我自己也研究这个病很久了。人工荨麻疹的确切发病原因至今未明,更没有特效药,所以治愈需要时间和不懈的努力。

我想提醒你,现在这个阶段,调整好自己的心态是最重要的。比人工荨麻疹更痛苦的疾病还有很多,与那些患者相比,我们其实算是幸运的了。不要让病痛吞噬了生活中的快乐,积极面对才是最好的良药。

顺便分享一个发现:得人工荨麻疹的,好像都是帅哥美女!也许是上天的小考验,让我们以更好的状态迎接更美好的未来。

2008年8月6日

后来我再没有服用任何药物,而是选择通过加强锻炼和注意休息来调节身体状态。现在,症状已经缓解了很多,饮食方面也不再忌口。只有在偶尔休息不好的时候,才会出现轻微的复发。这种改变让我更加体会到规律作息和良好生活习惯的重要性。

2009年2月16日

最近网上热议镍铬合金烤瓷牙可能引发肾脏疾病的风险,这引起了我的注意。我还了解到,补牙用的银汞合金可能会释放汞离子,导致中毒现象。甚至有文献记录显示,银汞填充剂可能与荨麻疹的发生有关。

翻看自己的博客,我发现得人工荨麻疹的时间点恰好是在我第一次补牙之后。这让我不得不怀疑,是否银汞填充剂可能是过敏的触发因素之一。我计划下次去医院时,查一查尿汞含量,并检测自己是否对银汞填充剂过敏,希望能找到确切答案。

2021年11月7日

(希望这是最后一次更新)

我的人工荨麻疹从2009年开始逐渐好转,一年左右彻底痊愈。到现在为止,再也没有复发过。回头想想,最可能的过敏原应该是我曾租住的那间房子的装修材料。虽然具体是哪种材料不好确认,但可以猜测,出租房大概使用了一些劣质建材。我在搬进那间出租屋不久后发病,搬离后症状就开始缓解。这一经历让我更加意识到居住环境对健康的深远影响。

结合我的经验,给大家一些忠告:

  • 别轻信偏方和土方。任何偏方和土方都不靠谱。对于缓解瘙痒,抗组胺类药物(如左旋盐酸西替利嗪等)是最有效的选择。
  • 根治的唯一方法是去除过敏原。重要的话说三遍:去除过敏原、去除过敏原!过敏原有可能是任何物质,有时候确实不太容易找到。这时候,可以尝试彻底改变环境,比如搬家,甚至换一个城市居住。

愿每一位患者都能找到适合自己的治疗方法,早日恢复健康!

查看或添加留言

《世界大战》的 bug

· 阅读需 7 分钟

看完《世界大战》,不禁想聊聊这个故事里一些让人挠头的逻辑漏洞。虽说电影是用来娱乐的,太较真似乎有点不合时宜,但对于程序员来说,“挑 bug”可是天性使然,尤其面对这样的科幻故事。

个人觉得,故事最大的槽点,莫过于外星人的战争机器居然是在地球上埋藏了百万年之久。导演似乎想规避传统的“飞船从天而降”的俗套桥段,但这种做法却引发了更多的逻辑问题。假设这些杀戮机器是在100万年前埋下的,我们不妨用程序员的思维来推理一下外星人的目的:

  • 如果目的是政府地球,那么何必等待?100 万年前,外星人能埋藏武器,说明已经征服地球了。为什么又走了?
  • 如果是为了娱乐,外星人难道 100 万年毫无改进的?假设外星人将地球当成“狩猎场”,他们为何要使用 100 万年前的技术?举个例子,200 年前你的祖先或许爱打猎,用的是长矛和弓箭;200 年后,你也想体验一把打猎的乐趣,你是进山去挖祖宗埋下的长矛来用,还是直接再买把猎枪?
  • 微生物漏洞:百万年前的外星人不生病吗?电影的结局里,外星人最终死于地球微生物的感染。那么问题来了:既然这些微生物对外星人致命,为何百万年前他们埋机器时毫发无损?如果当时确实不小心感染过,难道他们不会吸取教训?

另一逻辑不通的地方是,外星人因为地球上的微生物而全军覆没。这一结局看似有合理性,但细究之下,仍有许多逻辑不通之处:首先,人类都知道从月球返回地球时要进行消毒,以防止外来微生物感染地球生态。外星人文明既然比人类先进得多,怎会忽视防护措施?其次微生物对于生存环境的要求极其苛刻,许多病毒只能感染特定的物种。地球上的微生物要适应外星人的生理结构,简直难如登天。

总之,这个结局太马虎了,把本来应该更先进的外星人当弱智,显得过于敷衍。

如果让我来改写,我会这样设定:

  • 人类抓获了一只生病的外星人,从中发现外星人的免疫系统存在弱点。
  • 科学家们受到启发,研发出一种针对外星人的致命病毒。这种病毒以人类为中间宿主,却对人类无害。
  • 病毒被注射到所有人类体内。当外星人继续捕猎人类,抽取他们的血液时,病毒开始传播,逐步感染外星人族群。
  • 最终,人类用这种病毒成功击退了外星人,捍卫了地球。

虽然这仍算不上是特别创新的结局,但至少比微生物简简单单直接灭了外星人更有逻辑,剧情也显得精致了些。

尽管电影《世界大战》存在不少逻辑漏洞,但不可否认它在视觉效果和紧张氛围上依然值得一看。而挑 bug 的乐趣,也让我在吐槽中得到了额外的乐趣。


此外,这部电影的开场没多久就让我感到震撼。震撼的不是它逼真的特效,而是一个让我头皮发麻的巧合 - 电影中的某一段情节,竟然和几个月前我做的一个梦一模一样。那场梦极其清晰,以至于我当时特意把它记录在了博客里

看完电影后,我忍不住联想:或许人类真的有某种“心灵感应”的能力?也许在我做梦的那个夜晚,有人在紧张兮兮地看这部电影,还发出了强烈的脑电波,而我恰巧接收到了这些信号。然而,当我查了电影的上映日期后,发现那时候影片根本还没有放映!那么,这股“脑电波”会不会来自导演呢?

《我昨晚的梦》

我昨晚梦见外星人入侵地球了。 开始看见一架地球的飞机被击落,坠毁在地上。然后大家就拼命逃跑。我和家人躲到下水道里。我偷偷地往外看,看见外星的的机器人在到处搜捕地球人。

我做的梦有时候像看电影,而且效果更逼真。大概是好莱坞大片看多了。

查看或添加留言

What’s a Healthy Family?

· 阅读需 2 分钟

The concept of a healthy family varies greatly across cultures and time periods. For example, in traditional Chinese culture, a healthy family was often seen as a large, extended one. An ideal family could include dozens, sometimes even hundreds of members, spanning at least four generations. However, few modern individuals would find such a family structure manageable or desirable today.

Despite cultural differences, there are universal traits that define a healthy family. To identify these traits, it’s helpful to reflect on why humans live in family units in the first place. Here are two fundamental reasons:

  1. Survival:
    As individuals, our strength is limited. Alone, it’s challenging to protect ourselves or secure sufficient resources. In contrast, a family, as a group, is much stronger. Members of a healthy family respect and support one another, working together toward shared goals. Survival is only the starting point, though. Beyond that, we seek a better life. A healthy family creates a nurturing environment for personal growth and collective achievement, enabling its members to reach greater heights together.

  2. Procreation and Continuity:
    Our parents brought us into the world and raised us, allowing us to enjoy the benefits of life. In return, we have a responsibility to continue the cycle by having and raising children. A healthy family, therefore, often includes the presence of children, as they represent the continuation of the family and its values.

A healthy family is harmonious, supportive, and growth-oriented. Every member feels valued and happy. However, this is not enough on its own. A truly healthy family also fulfills its responsibilities to society, earning the respect and admiration of others.

查看或添加留言

Introduce My Hometown

· 阅读需 5 分钟

I lived in a small town in the northeast of Inner Mongolia province, called Jagedaqi (加格达奇), before I started elementary school. It is located at the foot of the Xing’an Mountains. Although I spent many years there, I was too young to explore much of the town. I could barely remember what it looked like until one summer a few years ago when I had the chance to visit again.

On the train ride to Jagedaqi, the view from the window was filled with endless meadows. Occasionally, I saw boys riding horses. Just a few hundred meters away, they were galloping, shouting, and chasing one another for fun. I thought to myself, "This must be every boy’s dream." Riding a horse must feel like flying—on the boundless meadow, nothing holds them back. They can embrace the speed and freedom of horseback riding. City boys, by contrast, often seek thrills by speeding in cars—a dangerous alternative.

Another striking feature of the meadow was the river. Rivers in that plain never flow in straight lines; they meander endlessly, marking their courses with winding silver streaks across the landscape. At dusk, when the sun sank below the horizon, millions of golden light spots twinkled on the meadow, resembling a magnificent starry sky.

As the train neared the mountainous area, the scenery changed dramatically. Small hills began to appear. Even upon reaching the town, as it lies at the foot of the Xing’an Mountains, I only saw the smaller hills. Climbing one of them, I discovered that the town was nestled in a basin surrounded by these hills. To the north, I glimpsed enormous mountains in the distance, but they were far beyond my reach on this trip.

For about seven months of the year, snow blankets the Xing’an Mountains. I adore the graceful dance of snowflakes falling all day and night. After a snowfall, the world becomes brilliantly white—every mountain and meadow painted in that singular color. The silence is profound, with every sound muffled. Walking on the snow-covered ground, the only noise you hear is the crunch of your own footsteps.

As beautiful as snow is, winters here are tough. First, food was a constant worry. Winter offered few choices. We Chinese distinguish between staple foods, vegetables, meats, and fish. Before I became a teenager, corn was our main staple. Later, rice and wheat replaced corn, but there was a time when all we had was corn. I reached my limit during that period and swore I’d never eat corn again once I left. My cousins in Wuxi love corn, and despite my explanations, they couldn’t understand why I hated such a "delicious" food.

Vegetables were stored in the fall. Only Chinese cabbage, potatoes, and radishes could last through the winter. Every autumn, my family bought 300 to 500 pounds of cabbage and a few pounds of potatoes and radishes to store in our cellar. Like humans, animals such as squirrels, ants, and bees also stockpiled food to survive the freezing days. Thankfully, things are much better now. Thanks to the market economy and modern transportation, agricultural products from the south reach the north even in winter, providing us with more choices.

Winter also posed challenges for transportation. Snow-covered roads became dangerously slippery, forcing bus services to shut down. When the wind was too strong to ride bicycles, we had to walk to school or work.

Snowstorms were particularly perilous. Most residents of Qiqihar remember April 29, 1984, when a devastating snowstorm struck. That morning, many living in single-story houses found themselves trapped inside—unable to open their doors because the snow outside was over a meter deep.

A friend once shared his experience from that day. He was only eight years old. After school, he decided to walk home, but the snow had already buried the ditches beside the road. He accidentally fell into one, his entire body submerged in snow. Struggling to climb out, he remained unnoticed because few people were outdoors. His father, alarmed when he didn’t see him on the way home, returned to the school with his teacher to search for him. They eventually found him, numb with cold but alive. Fortunately, he recovered fully.

Not everyone found the storm frightening. One of my uncles was traveling home from another city by train. That morning, the train stopped miles away from the city center due to the storm. While most passengers stayed on board awaiting rescue, some young men, including my uncle, saw it as an opportunity to prove their strength. They jumped off the train and spent the entire day walking home through the snow.

All these stories about the storm were told to me by others—I have no memory of it myself. When I asked my father why I couldn’t recall anything, he laughed and said, "Oh, you were very happy that day. Classes were canceled because of the storm, and you had a great time playing at home with the neighbor boys."

And so, the conclusion is this: People tend to remember their hardships but forget their joys.

查看或添加留言

Insects

· 阅读需 4 分钟

My favorite TV channel is the Shanghai Documentary Channel because I can always enjoy watching the graceful creatures it features. Today, I'd like to introduce one type of creature: insects.

First, let’s think about what an insect is. Is a butterfly an insect? Is a spider an insect?

nsects belong to the Arthropoda phylum. Therefore, an insect must have all the characteristics of an arthropod. An arthropod has the following features: First, its body is divided into several segments. Second, it has legs that are also segmented. Now we know neither the earthworm nor the snail is an arthropod because they lack legs. Are humans arthropods? We have legs, but no! An arthropod has an exoskeleton, meaning their bones are on the outside of their bodies, whereas our bones are inside. Let's count how many arthropods we know: shrimps, crabs, spiders, butterflies, bees, ants—all of these are arthropods. But only some of them are insects.

So, what sets insects apart?

An insect’s body has three parts: the head, the thorax, and the abdomen. The head is the sensory center, equipped with a pair of antennae and eyes. Some insects have one or two pairs of eyes, while others have thousands of eyes. Another function of the head is to consume food. The thorax is the locomotive center of an insect, with three pairs of legs attached. The abdomen is responsible for reproduction and metabolism. Metabolism involves absorbing food and excreting waste from the body.

From this, we know a spider is not an insect because it has four pairs of legs. However, butterflies, bees, ants, dragonflies, and mosquitoes are insects. Have you ever observed caterpillars? Some have thousands of legs, while others don’t have any. Yet they are still considered insects because these characteristics describe the imago, a mature insect. Caterpillars are only larvae and will metamorphose into butterflies eventually.

Do you know how many species of insects exist on Earth? Some believe there are more than 10 million species. Considering only the discovered species, if all species of creatures on Earth were represented in one pie, about 1 million species, three-fourths of the pie would be occupied by insects. One-third of these insects are beetles. One-sixth are butterflies, another sixth are bees and ants, another sixth are flies and mosquitoes, and the remaining sixth are other insects.

You may be curious why there are so many kinds of insects. I know some of the reasons:

  1. For hundreds of millions of years, insects were the only creatures on Earth that could fly until birds emerged. They could easily migrate to other habitats or escape their enemies with the help of their wings. Insects exploit every possible niche once they arrive on Earth.

  2. The size of an insect is usually tiny. The largest insect is about the size of an egg. For the smallest ones, 10 million of them together weigh about as much as one egg. This means an insect requires only a minimal amount of food to survive. For example, a cockroach can live for two months without eating anything. Additionally, they can hide almost anywhere.

  3. Almost anything can be food for insects. A cockroach can live its entire life inside a television set by eating the wax on the circuit board.

  4. Insects have an incredible reproductive capability. On average, an insect can lay hundreds of eggs at a time, and some can lay millions of eggs.

  5. The first insects appeared 350 million years ago. Over this vast period, insects have adapted perfectly to the world. They have evolved various capabilities to protect themselves, some of which are hard to imagine. For example, some insects can live in deserts where temperatures exceed 50°C (122°F), while others can survive in environments as cold as -50°C (-58°F). Some flies can live in pure salt, pure oil, or even pure carbon dioxide.

Insects are truly remarkable creatures. Their diversity, adaptability, and resilience have allowed them to thrive for millions of years. Whether you’re fascinated by their biology, their role in ecosystems, or simply their beauty, there’s no denying that insects are an essential part of our world. Next time you see a butterfly, a beetle, or even a humble ant, take a moment to appreciate the incredible complexity of these tiny wonders.

查看或添加留言

DLL的导入库中是什么信息

· 阅读需 3 分钟

当我们在项目中使用DLL时,链接器需要查找DLL输出的变量、函数或C++类等符号信息,并自动生成一个对应的.lib文件。这个.lib文件被称为导入库,它包含了DLL输出的符号列表。如果一个可执行模块需要引用DLL中的符号(使用GetProcAddress除外),则必须链接该导入库。

导入库中包含的信息

实际上,导入库中并不包含符号的相对虚拟地址(RVA)。它仅仅是一些符号以及与其相关的元数据,例如该库对应的DLL的名称等。(这是我当前的理解,欢迎探讨)。

应用程序如何调用DLL中的函数

当一个应用程序通过导入库调用DLL中的函数时,这个过程是在进程的主线程开始运行之前由加载器完成的。

加载器按照可执行文件的输入节中指定的DLL名称,通过Windows的搜索路径找到并加载对应的DLL。加载成功后,DLL被映射到进程的地址空间中,此时,加载器根据DLL的实际加载地址和符号信息,将每个输入节中的符号地址填入可执行模块的输入节中,完成动态链接。

这一过程解释了为什么可以使用lib命令通过.def文件生成导入库。

使用def文件生成lib文件的示例

以下是一个完整的操作流程:

1. 创建一个.def文件

LIBRARY
xujian.dll
EXPORTS
xujian

2. 使用lib命令生成.lib文件

运行以下命令生成导入库:

lib /def:XX.def /machine:i386 /out:XX.lib

3. 编写一个测试程序

在工程文件中加入生成的XX.lib后,编写如下代码:

extern "C" void xujian();

int main()
{
xujian();
return 0;
}

编译和链接后,程序应该可以正常运行。

查看或添加留言