- LuckySXyd
-
u2022 随着 2022 年 3 月 15 日 go 1.18 正式发布,新版本除了对性能的提升之外,还引入了很多新功能,其中就有 go 期盼已久的功能泛型(Generics),同时还引入的多模块工作区(Workspaces)和模糊测试(Fuzzing)。
u2022 关于泛型网上已经有很多介绍的教程了,这里我介绍一个实用的功能,多模块工作区的使用方法和教程。
u2022 Go 多模块工作区能够使开发者能够更容易地同时处理多个模块的工作,如:
u2022 多模块工作区
u2022 开发流程演示
u2022 总结
u2022 参考文献
u2022 go 使用的是多模块工作区,可以让开发者更容易同时处理多个模块的开发。在 Go 1.17 之前,只能使用 go.mod replace 指令来实现,如果你正巧是同时进行多个模块的开发,使用它可能是很痛苦的。每次当你想要提交代码的时候,都不得不删除掉 go.mod 中的 replace 才能使模块稳定的发布版本。 u2022在使用 go 1.18 多模块工作区功能的时候,就使用这项工作变得简单容易处理。下面我来介绍怎么使用这一功能。u2022 Go 多模块工作区文档、代码示例[5]
u2022 首先 我们需要 go 1.18 或更高版本 go 安装[6]
u2022 通常情况下,建议不要提交 go.work 文件到 git 上,因为它主要用于本地代码开发。
u2022 推荐在: $GOPATH 路径下执行,生成 go.work 文件
u2022 go work init 初始化工作区文件,用于生成 go.work 工作区文件
u2022 go work use 添加新的模块到工作区
u2022 go work edit 用于编辑 go.work 文件
u2022 go work sync 将工作区的构建列表同步到工作区的模块
u2022 go env GOWORK
u2022 文件结构和 go.mod 文件结构类似,支持 Go 版本号、指定工作区和需要替换的仓库 u2022文件结构示例:
u2022 可以使用 go work use hello 添加模块,也可以手动修改 go.work 工作区添加新的模块 u2022在工作区中添加了模块路径,编译的时候会自动使用 use 中的本地代码进行代码编译,和 replaces 功能类似。
u2022 replaces 命令与 go.mod 指令相同,用于替换项目中依赖的仓库地址 u2022需要注意的是 replaces 和 use 不能同时指定相同的本地路径
u2022 错误示例
u2022 在同时使用 go.work 和 go.mod replace 功能的的时候分别指定不同的代码仓库路径, go.work 优先级高于 go.mod 中定义
u2022 在代码构建时候使用的是 go.work 指定的 example1 仓库的代码, go.work 优先级别更高
u2022 在 Go 1.18 go run 和 go build 都会默认使用工作区功能 u2022 GOWORK 也可以指定配置 go.work 文件位置
u2022 Go 全局变量 GOWORK 设置 off 则可以禁用工作区功能
u2022 演示如何使用多模块工作区功能。在现在微服务盛行的年代,一个人会维护多个代码仓库,很多的时候是多个仓库进行同时开发
u2022 假设我们现在进行 hello 仓库开发,实现的功能是,实现将输入的字符串反转并输出,字符串反转功能依赖于 github.com/link1st/example (下文统称 example )公共仓库实现
u2022 新建 hello 项目
u2022 main.go 代码
u2022 运行代码 go run main.go -str "hello world" 或 go run github.com/link1st/link1st/workspaces/hello -str "hello world" 可以看到输出了 hello world 反转以后的字符串
u2022 到这里,最初的功能已经完成,但是后续需求变动,不仅需要输出反转以后的字符串,还需要将字符串大写
u2022 我们则需要去 example 仓库中添加开发 将字符串大写的功能
u2022 vim example/stringutil/to_upper.go 代码如下
u2022 由于代码还在本地调试,未提交 git 仓库中,这个时候就需要用到 Go 多模块工作区的功能了。
u2022 进入项目根目录,初始化我们现在正在开发的模块
u2022 文件结构如下
u2022 回到 hello 项目, vim main.go 将字符串大写的功能添加上。
u2022 运行代码
u2022 到这里,演示的代码已经全部完成
u2022 使用 Go 多模块工作区的功能,可以让我们轻松在多个模块之间切换工作,更能适应现代微服务架构开发。
[1] Go 1.18 新特性多模块工作区教程: https://github.com/link1st/link1st/tree/master/workspaces
[2] Go 1.18 is released!: https://go.dev/blog/go1.18
[3] Tutorial: Getting started with multi-module workspaces: https://go.dev/doc/tutorial/workspaces
[4] go-1.18-features: https://sebastian-holstein.de/post/2021-11-08-go-1.18-features/
golang 包中的全局变量 在引用包的文件中是同一个值吗
在C语言中引用外部变量,一般使用extern关键字。举个例子如下://1.c 中定义一个变量g_aint g_a = 100;//2.c 中定义一个函数输出g_a#include <stdio.h>extern int g_a; //这里需要用extern说明g_a是一个外部全局变量void f() { printf("%d ", g_a);}//3.c main函数中调用f()void f(); //声明函数f()int main(){ f();}2023-06-09 13:23:372
Golang 公共变量包——expvar
expvar 包是 Golang 官方提供的公共变量包,它可以辅助调试全局变量。支持一些常见的类型: float64 、 int64 、 Map 、 String 。如果我们的程序要用到上面提的四种类型(其中,Map 类型要求 Key 是字符串)。可以考虑使用这个包。 这些基础的功能就不多说了,大家可以直接看官方的 文档 。 看源码的时候发现一个非常有意思的调试接口, /debug/vars 会把所有注册的变量打印到接口里面。这个接口很有情怀。 感觉这个包还是针对简单变量,比如整形、字符串这种比较好用。 看到就写了,并没有什么沉淀,写得挺乱的。这个包很简单,但是里面还是有些可以借鉴的编码和设计。新版本的 Golang 已经能解析整形为 Key 的哈希表了,这个包啥时候能跟上支持一下?2023-06-09 13:23:501
go 怎么写入conf配置文件
2023-06-09 13:23:571
go语言入门(闭包问题),这个变量怎么传递进去的?
函数AddUpper会返回一个函数(即函数AddUpper的返回类型是一个函数),当调用这个返回的函数时,需要向它传递一个int变量作为参数,同时,这个函数也会返回一个int类型的值,这个值等于AddUpper的局部变量n先加上x,再返回n。 所以,当执行f:=AddUpper()时,实际上就是将调用AddUpper()后的返回值赋给了f。而前面说了,AddUpper是会返回一个函数的(AddUpper返回的函数的原型是通过func(int) int来限定的)。所以,f实际上就是一个函数,它的签名就是func(int) int,即调用f时需要传递一个int类型的参数,同时f也会返回一个整数。当调用f(1)时,会执行以下代码:n=n+xreturn n而n是外围函数AddUpper的局部变量,初始值是10,x就是你调用f(1)时传入的参数1。所以,执行n=n+x后,n变成了11,然后返回n(11)。所以,f(1)的结果就是11。当接着调用f(2)时,执行的代码还是一样的,都是:n=n+xreturn n只不过n现在是11(因为调用f(1)时,改变了n,从10变成了11),而x是2。所以,f(2)的结果就是13,同时,调用f(2)后n也成了13。2023-06-09 13:24:042
golang怎么在方法里面改变传递到方法的数组参数
将数组参数作为指针传递即可:第一种方法是传递指针arr := []int{1,2,3}调用方法:foo(&arr)函数定义:func foo(arr *[]int) { /*...*/}第二种方法是用函数的返回值func foo(arr []int) []int {/*修改数组后再返回此数组*/}调用:arr = foo(arr)2023-06-09 13:24:132
(十一)golang 内存分析
编写过C语言程序的肯定知道通过malloc()方法动态申请内存,其中内存分配器使用的是glibc提供的ptmalloc2。 除了glibc,业界比较出名的内存分配器有Google的tcmalloc和Facebook的jemalloc。二者在避免内存碎片和性能上均比glic有比较大的优势,在多线程环境中效果更明显。 Golang中也实现了内存分配器,原理与tcmalloc类似,简单的说就是维护一块大的全局内存,每个线程(Golang中为P)维护一块小的私有内存,私有内存不足再从全局申请。另外,内存分配与GC(垃圾回收)关系密切,所以了解GC前有必要了解内存分配的原理。 为了方便自主管理内存,做法便是先向系统申请一块内存,然后将内存切割成小块,通过一定的内存分配算法管理内存。 以64位系统为例,Golang程序启动时会向系统申请的内存如下图所示: 预申请的内存划分为spans、bitmap、arena三部分。其中arena即为所谓的堆区,应用中需要的内存从这里分配。其中spans和bitmap是为了管理arena区而存在的。 arena的大小为512G,为了方便管理把arena区域划分成一个个的page,每个page为8KB,一共有512GB/8KB个页; spans区域存放span的指针,每个指针对应一个page,所以span区域的大小为(512GB/8KB)乘以指针大小8byte = 512M bitmap区域大小也是通过arena计算出来,不过主要用于GC。 span是用于管理arena页的关键数据结构,每个span中包含1个或多个连续页,为了满足小对象分配,span中的一页会划分更小的粒度,而对于大对象比如超过页大小,则通过多页实现。 根据对象大小,划分了一系列class,每个class都代表一个固定大小的对象,以及每个span的大小。如下表所示: 上表中每列含义如下: class: class ID,每个span结构中都有一个class ID, 表示该span可处理的对象类型 bytes/obj:该class代表对象的字节数 bytes/span:每个span占用堆的字节数,也即页数乘以页大小 objects: 每个span可分配的对象个数,也即(bytes/spans)/(bytes/obj)waste bytes: 每个span产生的内存碎片,也即(bytes/spans)%(bytes/obj)上表可见最大的对象是32K大小,超过32K大小的由特殊的class表示,该class ID为0,每个class只包含一个对象。 span是内存管理的基本单位,每个span用于管理特定的class对象, 跟据对象大小,span将一个或多个页拆分成多个块进行管理。src/runtime/mheap.go:mspan定义了其数据结构: 以class 10为例,span和管理的内存如下图所示: spanclass为10,参照class表可得出npages=1,nelems=56,elemsize为144。其中startAddr是在span初始化时就指定了某个页的地址。allocBits指向一个位图,每位代表一个块是否被分配,本例中有两个块已经被分配,其allocCount也为2。next和prev用于将多个span链接起来,这有利于管理多个span,接下来会进行说明。 有了管理内存的基本单位span,还要有个数据结构来管理span,这个数据结构叫mcentral,各线程需要内存时从mcentral管理的span中申请内存,为了避免多线程申请内存时不断的加锁,Golang为每个线程分配了span的缓存,这个缓存即是cache。src/runtime/mcache.go:mcache定义了cache的数据结构 alloc为mspan的指针数组,数组大小为class总数的2倍。数组中每个元素代表了一种class类型的span列表,每种class类型都有两组span列表,第一组列表中所表示的对象中包含了指针,第二组列表中所表示的对象不含有指针,这么做是为了提高GC扫描性能,对于不包含指针的span列表,没必要去扫描。根据对象是否包含指针,将对象分为noscan和scan两类,其中noscan代表没有指针,而scan则代表有指针,需要GC进行扫描。mcache和span的对应关系如下图所示: mchache在初始化时是没有任何span的,在使用过程中会动态的从central中获取并缓存下来,跟据使用情况,每种class的span个数也不相同。上图所示,class 0的span数比class1的要多,说明本线程中分配的小对象要多一些。 cache作为线程的私有资源为单个线程服务,而central则是全局资源,为多个线程服务,当某个线程内存不足时会向central申请,当某个线程释放内存时又会回收进central。src/runtime/mcentral.go:mcentral定义了central数据结构: lock: 线程间互斥锁,防止多线程读写冲突 spanclass : 每个mcentral管理着一组有相同class的span列表 nonempty: 指还有内存可用的span列表 empty: 指没有内存可用的span列表 nmalloc: 指累计分配的对象个数线程从central获取span步骤如下: 将span归还步骤如下: 从mcentral数据结构可见,每个mcentral对象只管理特定的class规格的span。事实上每种class都会对应一个mcentral,这个mcentral的集合存放于mheap数据结构中。src/runtime/mheap.go:mheap定义了heap的数据结构: lock: 互斥锁 spans: 指向spans区域,用于映射span和page的关系 bitmap:bitmap的起始地址 arena_start: arena区域首地址 arena_used: 当前arena已使用区域的最大地址 central: 每种class对应的两个mcentral 从数据结构可见,mheap管理着全部的内存,事实上Golang就是通过一个mheap类型的全局变量进行内存管理的。mheap内存管理示意图如下: 系统预分配的内存分为spans、bitmap、arean三个区域,通过mheap管理起来。接下来看内存分配过程。 针对待分配对象的大小不同有不同的分配逻辑: (0, 16B) 且不包含指针的对象: Tiny分配 (0, 16B) 包含指针的对象:正常分配 [16B, 32KB] : 正常分配 (32KB, -) : 大对象分配其中Tiny分配和大对象分配都属于内存管理的优化范畴,这里暂时仅关注一般的分配方法。 以申请size为n的内存为例,分配步骤如下: Golang内存分配是个相当复杂的过程,其中还掺杂了GC的处理,这里仅仅对其关键数据结构进行了说明,了解其原理而又不至于深陷实现细节。1、Golang程序启动时申请一大块内存并划分成spans、bitmap、arena区域 2、arena区域按页划分成一个个小块。 3、span管理一个或多个页。 4、mcentral管理多个span供线程申请使用 5、mcache作为线程私有资源,资源来源于mcentral。2023-06-09 13:24:201
Cocos Creator 中的js文件之间调用变量或类
查看js相关文档,常有关于全局变量和局部变量的描述,作用域 和c++,go,等语言的概念不太相同。js中关于全局变量的描述通常指的是,在同一个js模块文件中,可以访问。而c++,go等项目,全局变量通常指的是,整个项目可以访问。 所以容易导致理解上的偏差。在定义模块,使用export 导出变量或类后,就可以 在其他 js模块中使用了。 当然了,全局变量,在各语言项目中,应尽量避免使用。如果可以,尽量使用统一的全局模块管理。 --the end2023-06-09 13:24:261
gojs图表如何转化为json数据存储?
一个简单的流程图1.HTML<div id="myDiagram" style="width:400px; height:150px; background-color: #DAE4E4;"></div>2.$是一个全局变量,全局变量相当于一个画笔,我们先定义一个画笔工具。之后我们就可以通过 $ 符号来调用它自身的一些方法、属性、枚举对象等var $ = go.GraphObject.make;//3.有了画笔,还需要画布,于是我们需要定义一个画布用来装载一些具体内容var myDiagram =$(go.Diagram, //定义的画布"myDiagram",//要渲染的DIV 的Id 名称,1中html中的id{ initialAutoScale: go.Diagram.Uniform, contentAlignment: go.Spot.Center,//对齐方式 layout://画布里的元素布局方式 $(go.ForceDirectedLayout,{ defaultSpringLength: 30, defaultElectricalCharge: 100 }) });这个画笔可以绘制节点、链接、区域、图案、形状、文本等4.画笔绘制了一个文本对象 go.TextBlock ,并为它填充了属性 text、stroke、font、margin$(go.TextBlock,{2023-06-09 13:24:331
易语言,在计次循环里有多个循环判断,求大神指导如何可以人工停止计次循环
只能写 跳出循环()2023-06-09 13:24:513
易语言转go
你好,使用golang写动态库,再使用易语言写界面,肯定有不少人有这种想法吧;但中间有些坑,这里留下一些解决方法。一、如何编译?请先安装gcc编译器,选择32位由于易语言只支持32位dll,使用64位会出错,例如找不到此函数;必须先设置两项配置:set GOARCH=386,set CGO_ENABLED=1,用cmd;编译命令:go build -ldflags "-s -w" -buildmode=c-shared -o dlldemo.dll dlldemo.go 。二、形参与返回值在go中,除了 string 特殊外,其他int、bool,等基本类型原本怎样还是怎样;传 string 与返回值 string 都改成 *C.char 类型,其他基本类型不用改;有三个方法比较重要,C.CString 转成c字符串,C.GoString 转成go字符串 , C.free 释放内存;只要用到 C.CString 此方法,就必须记得释放内存。三、内存泄漏如果使用了 C.CString 却不使用 C.free ,内存暂用只会越来越大,最后奔溃;释放内存时,请不要重复取地址,例如 unsafe.Pointer(&xx变量) ,这样等于没释放;也可能是vc6的原因,使用 defer 在即将出栈时释放,会造成易语言得不到返回值;解决方法,声明全局变量,将结果赋值给全局变量,专门定义一个释放函数例如FreeAll() 用于释放!四、如何调用在填写dll命令时,请在填写,在库中对应命令名时,前面加个 @ ,不然会出现栈错误;每次调用返回值是文本型dll命令时,请都使用前面准备的 FreeAll() 释放内存!通过易语言的便捷,为自己的golang小项目加点gui吧,这里留下源码,给有需要的人。希望能帮到你。2023-06-09 13:24:581
ASP网页中出现错误提示: 找不到网页 您要查看的网页可能已被删除、名称已被更改,或者暂时不可用。
Admin_Culture.asp文件不存在2023-06-09 13:25:157
Golang什么时候会触发GC
Golang采用了三色标记法来进行垃圾回收,那么在什么场景下会触发这个回收动作呢? 源码主要位于文件 src/runtime/mgc.go go version 1.16 触发条件从大方面说,可分为 手动触发 和 系统触发 两种方式。手动触发一般很少用,主要由开发者通过调用 runtime.GC() 函数来实现,而对于系统自动触发是 运行时 根据一些条件判断来进行的,这也正是本文要介绍的内容。 不管哪种触发方式,底层回收机制是一样的,所以我们先看一下手动触发,根据它来找系统触发的条件。 可以看到开始执行GC的是 gcStart() 函数,它有一个 gcTrigger 参数,是一个触发条件结构体,它的结构体也很简单。 其实在Golang 内部所有的GC都是通过 gcStart() 函数,然后指定一个 gcTrigger 的参数来开始的,而手动触发指定的条件值为 gcTriggerCycle 。 gcStart 是一个很复杂的函数,有兴趣的可以看一下源码实现。 对于 kind 的值有三种,分别为 gcTriggerHeap 、 gcTriggerTime 和 gcTriggerCycle 。 运行时会通过 gcTrigger.test() 函数来决定是否需要触发GC,只要满足上面基中一个即可。 到此我们基本明白了这三种触发GC的条件,那么对于系统自动触发这种,Golang 从一个程序的开始到运行,它又是如何一步一步监控到这个条件的呢? 其实 runtime 在程序启动时,会在一个初始化函数 init() 里启用一个 forcegchelper() 函数,这个函数位于 proc.go 文件。 为了减少系统资源占用,在 forcegchelper 函数里会通过 goparkunlock() 函数主动让自己陷入休眠,以后由 sysmon() 监控线程根据条件来恢复这个gc goroutine。 可以看到 sysmon() 会在一个 for 语句里一直判断这个 gcTriggerTime 这个条件是否满足,如果满足的话,会将 forcegc.g 这个 goroutine 添加到全局队列里进行调度(这里 forcegc 是一个全局变量)。 调度器在调度循环 runtime.schedule 中还可以通过垃圾收集控制器的 runtime.gcControllerState.findRunnabledGCWorker 获取并执行用于后台标记的任务。2023-06-09 13:25:311
数据库以什么符号开头的是全局变量
释放磁盘空间并且重新运行恢复操作,按照下面的步骤收缩日志。sp_resetstatus关闭数据库的置疑标志,但是原封不动地保持数据库的其它选项。为从根本上解决这样的问题,你可以按下面的操作配置SQLSERVER2000:a.如果不需要恢复到指定的时间点,你可以将数据库的恢复模式配置为简单,这样UPDATE,DELETE,SELECT就不会记录日志,日志就不会增加的很大:USEMASTERGOALTERDATABASEDB_NAMESETRECOVERYSIMPLEb.如果你的恢复模式是全部,你一定要配置日志字段收缩:USEMASTERGOsp_dboption"","trunc.logonchkpt.",truesp_dboption"","autoshrink",truec.通过每日备份将日志收缩:BACKUPDATABASEDATABASE_NAMETOBACKUP_DEVICESBACKUPLOGDATABASE_NAMETOLOG_DEVICESORBACKUPLOGDATABASE_NAMEwithtruncate_only**检查日志的容量:DBCCSQLPERF(LOGSPACE)这时日志并没有收缩!d.每天在备份数据库完成之后,重新启动MSSQLSERVERSERVICE.USEDATABASE_NAMEgoDBCCSHRINKFILE(2,)**检查日志的容量:DBCCSQLPERF(LOGSPACE)这时日志已经收缩!e.手动快速收缩日志:/*runbelowscript,youwillshrinkyoudatabaselogfilesimmediately,inmyexperience,youneedtorunthescriptfor3or4minutesbeforestoppingitmanually*/usedbshrinkfile(2,notruncate)dbshrinkfile(2,)createtablet1(char1char(4000))godeclare@iintselect@i=0while(1=1)beginwhile(@i<100)beginINSERTINTOT1VALUES("A")SELECT@I=@I1ENDTRUNCATEtableT1BACKUPLOG withtruncate_onlyendGO2023-06-09 13:25:371
history.go和History.back的区别及应用
history.go()和History.back()的区别及应用分类: javascript < input type=button value=刷新 onclick="window.location.reload()" > < input type=button value=前进 onclick="window.history.go(1)" > < input type=button value=后退 onclick="window.history.go(-1)" > < input type=button value=前进 onclick="window.history.forward()" > < input type=button value=后退 onclick="window.history.back()" > 后退+刷新< input type=button value=后退 onclick="window.history.go(-1);window.location.reload()" > JSP 返回上一页的几种方法 1. < a href="javascript:history.back(-1)">返回上一页2. < a href="javascript:;" onClick="javascript:history.back(-1);">返回上一页3.如果是用按钮做的话就是:< input type="button" name="Submit" onclick="javascript:history.back(-1);" value="返回上一页">4.用图片做的话就是:< a href="javascript :;" onClick="javascript :history.back(-1);">< img src="图片路径" border="0" title="返回上一页">< /a>5.< a href="javascript:history.go(-1);">向上一页< /a>, 返回两个页面: history.go(-2);页面跳转:onclick="window.location.href="list.php""6.用js实现页面自动返回到上一页 几秒钟后自动返回上一页代码:(加入两个head间,3000表示3秒)< script type="text/javascript">setTimeout("history.go(-1)", 3000); < /script>< SCRIPT language=javascript>function go(){ window.history.go(-1);}setTimeout("go()",3000);< /SCRIPT>Javascript 返回上一页1. Javascript 返回上一页 history.go(-1), 返回两个页面: history.go(-2);2. history.back().3. window.history.forward()返回下一页4. window.history.go(返回第几页,也可以使用访问过的URL) JavaScript:history.go() 的妙用在Web开发中,会遇到从一页(父页)导向另一页(子页),并且要求“返回”父页的情况,在这里如果用ASP.NET提供的Response.Redirect()方法,往往不会达到理想的效果,例如:返回后,重新加载了页面,无法保存导向子页前的状态,等等,在这里我就介绍一下如何使用JavaScript中history.go()函数来实现返回功能并且保存住状态的方法。 这个函数用起来很简单,只要在页面上加一个html的input元素,例如: < input type="button" value="返回"> 然后再为这个元素添加onclick属性,如: < input type="button" value="返回" onclick="history.go(-1);"> 这样就能达到返回上一页的效果。但是,往往在实践中,并没有这么简单,当你在向服务器提交请求的时候,引起页面回发,你再用history.go(-1)这招就不灵啦,它在这里是返回你回发前的状态,go后面的参数,实际上就是标识你要返回你回发第前n次的状态,所以只要能记住回发了几次,就能用history.go(-n)准确地返回到父页了。 在Web开发中,全局变量也是存不住的,当页面回发后,全局变量的值就会丢失,取而代之的是视图状态,所以我们就只能用视图状态来记录回发的次数了。那么就封装一个视图状态属性把。 public int returnCount { get{ if(ViewState["returnCount"] == null) ViewState["returnCount"] = 0; return (int)ViewState["returnCount"]; } set { ViewState["returnCount"] = value ;} } 定义好这个后,把他放到Page_Load里面,让他每次在页面回发时减1,这样就能准确的记住回发了几次。 protected void Page_Load(object sender, EventArgs e) { returnCount--; //要放在!iIsPostBack之外,要不然就仅仅在页面第一次加载时执行一次,回发时就不执行了。 if(!IsPostBack) { } } 吼吼,到这一步还没完呢,要把我们封装的属性加到Js里面。如下: < input type="button" value="返回" onclick="history.go("< % =returnCount % >");" > 这下就完美了,管你在页面上怎么回发,只要一点这个按钮,肯定会返回到父业的。 注意: 1、如果在本页面上有Response.Redirect()到本页或者类似的情况,那么就要将returnCount作为查询字符串传递一下了,因为这东西在页面失效时就over了。 2、本文仅对非Ajax的Web系统有作用,Ajax的还没仔细研究过javascript:history.go(-1)返回上一页时,网页已过期通常出现网页过期提示都是因为之前发生表单post,对于这种请求方式,浏览器会认为返回的显示内容与提交的数据有关,除非你再次提交数据,否则无法显示。而如果改用get方式提交数据,在IE中,会默认对同一url的get操作,返回的内容相同。出现这种情况我想是因为你的a.jsp是通过之前的post操作显示出来的吧,尝试改成get。如果在详单页面中存在对于数据的更改,在返回时最好不要使用history导航的方式,浏览器是不会去服务器端拿数据的,最好是将url带过来吧,用根据url控制浏览器跳转,get方式在最后记得加上随机时间戳,不然有可能出现数据不更新的情况。解决办法:首先试试back()或go(-2),若依然不行,则取消禁用页面缓存的限制session_cache_limiter("private,must-revalidate");作用:当session_cache_limiter("private")时,用处是让表单history.go(-1)的时候,填写内容不丢失。go(-2)后再forward(1).为什么我在点击浏览器的后退按钮后,所有字段的信息都被清空了答:这是由于你在你的表单提交页面中使用了 session_start 函数。因为我们后退浏览的是缓存页,而该函数会强制当前页面不被缓存。所以出现了"警告: 网页已经过期!".这些信息,而我们不得不刷新下才能正确显示,对于一个程序人员来说有可能无所谓,但是对于一个internet网上的一个顾客来说,看到该页面,他有可能关闭该页面,而不会去查看这些信息!还有一个原因就是当一个网站流量比较大的时候,缓存是我们程序人员最好的工具,如果失去了这把工具,那么你所在的虚拟服务器必将受到考验!解决办法为,1、不使用session_start()函数。2、在你的 Session_start 函数后加入 header("Cache-control: private"); 注意在本行之前你的PHP程序不能有任何输出。还有基于session的解决方法,在session_start前加上session_cache_limiter("nocache");// 清空表单session_cache_limiter("private"); //不清空表单,只在session生效期间session_cache_limiter("public"); //不清空表单,如同没使用session一般在开发过程中,往往因为表单出错而返回页面的时候填写的信息都不见了,为了支持页面回跳,可以通过两种方法实现。第一,使用Header方法设置消息头Cache-control 引用:header("Cache-control: private, must-revalidate"); //支持页面回跳第二,使用session_cache_limiter方法 session_cache_limiter("private, must-revalidate"); //注意要写在session_start方法之前< meta http-equiv="Cache-Control" CONTENT="private,must-revalidate">2023-06-09 13:25:461
golang 读取服务器时间 延迟问题怎么解决
简单减少slave同步延案架构做优化尽量让主库DDL快速执行主库写数据安全性较高比sync_binlog=1innodb_flush_log_at_trx_commit = 1 类设置slave则需要高数据安全完全讲sync_binlog设置0或者关闭binloginnodb_flushlog设置0提高sql执行效率另外使用比主库更硬件设备作slavemysql-5.6.3已经支持线程主复制原理丁奇类似丁奇表做线程Oracle使用数据库(schema)单位做线程同库使用同复制线程sync_binlog=1This makes MySQL synchronize the binary log"s contents to disk each time it commits a transaction默认情况并每写入都binlog与硬盘同步操作系统或机器(仅仅MySQL服务器)崩溃能binlog语句丢 失要想防止种情况使用sync_binlog全局变量(1安全值慢)使binlog每Nbinlog写入与硬盘 同步即使sync_binlog设置1,现崩溃能表内容binlog内容间存致性使用InnoDB表MySQL服务器 处理COMMIT语句整事务写入binlog并事务提交InnoDB两操作间现崩溃重启事务InnoDB滚仍 存binlog用--innodb-safe-binlog选项增加InnoDB表内容binlog间致性(注释:MySQL 5.1需要--innodb-safe-binlog;由于引入XA事务支持该选项作废)该选项提供更程度安全使每事务 binlog(sync_binlog =1)(默认情况真)InnoDB志与硬盘同步该选项效崩溃重启滚事务MySQL服务器binlog剪切滚 InnoDB事务确保binlog反馈InnoDB表确切数据等并使服务器保持与主服务器保持同步(接收 滚语句)innodb_flush_log_at_trx_commit (管用)抱怨Innodb比MyISAM慢 100倍概忘调整值默认值1意思每事务提交或事务外指令都需要志写入(flush)硬盘费特别使用电 池供电缓存(Battery backed up cache)设2于运用特别MyISAM表转意思写入硬盘写入系统缓存志仍每秒flush硬 盘所般丢失超1-2秒更新设0更快点安全面比较差即使MySQL挂能丢失事务数据值2整操作系统 挂才能丢数据2023-06-09 13:25:531
编写一个用户登录表单,查询数据库表,用户存在显示登录成功,用户不存在显示错误用户名或密码。
太麻烦了2023-06-09 13:26:011
tkinter entry get()这个怎么用啊 我查到的都是在局部变量中得到的 怎么在全局变量中得到啊
from Tkinter import*root=Tk()def go(event): global x x=v.get()v=StringVar()e=Entry(root,textvariable=v)e.pack()e.bind("<1>",go)root.mainloop()这里面我用了全局变量global声明了一下,所以x就变成了全局变量,不信的话你可以自己运行试试。print x,我刚才才打的,楼主看看可否2023-06-09 13:26:241
一个按钮要实现两个goandplay 可以吗?
1楼的应该先声明变量f并赋值为12023-06-09 13:26:363
关于sqlserver的T-SQL语句的变量作用域的疑问?
T-SQL是什么呢2023-06-09 13:26:466
python之为什么类中函数的变量声明要加self
lass A:def go(self):self.one= "sdf"def go1(self):print self.onea = A()a.go()a.go1()sdf ==加了self,以后,这个变量就变成了全局变量,在类中的其他函数中也可以调用。2023-06-09 13:27:091
JAVA中类中的实例方法可以操作类变量(static变量)吗?类方法(static方法)可以操作实例变量吗?
实例方法可以操作类变量(static变量),也叫类的静态变量。static方法不能操作实例变量。原因很简单,实例变量(或实例方法)是要有类的实例才能访问的,即先要new一个对象,才能访问。而static方法或变量,不需要创建对象,直接通过类名访问,所以它不能访问实例变量。2023-06-09 13:27:192
java 同一个类中的方法如何调用另一个方法体中的变量?(未实例话之前)
局部变量,没法调用。2023-06-09 13:27:285
vfp提示变量找不到
go findrecordno表示把程序的执行转移到 findrecordno这个函数或者过程,他不是个变量。所以,即使你定义为变量了,还是错误的。他是个过程或者函数,也有可能是一个标号。这要看你自己的程序了。2023-06-09 13:27:472
请问一下 构造函数存放的内存地址在哪?
预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 3、全局区(静态区)(static)— 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。 4、文字常量区 — 常量字符串就是放在这里的,程序结束后由系统释放 。 5、程序代码区 — 存放函数体的二进制代码。 例如程序 int a = 0; 全局初始化区 char *p1; 全局未初始化区 main() { int b; 栈 char s[] = "abc"; 栈 char *p2; 栈 char *p3 = "123456"; 123456在常量区,p3在栈上。 static int c =0; 全局(静态)初始化区 p1 = (char *)malloc(10); p2 = (char *)malloc(20); } 分配得来得10和20字节的区域就在堆区。 strcpy(p1, "123456"); 123456放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。所以 你的 new A();是被分到了堆区,具体地址有操作系统分配void Go(){} 的二进制代码是放在程序代码区2023-06-09 13:27:581
怎样从数据库中访问wincc的变量
一、声名全局变量在全局脚本中声明全局变量,如下:Public gocn2、建立连接,如下:Set gocn = CreateObject("ADODB.Connection")gocn.open "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=GJS_SY;Data Source=LGL"3、执行代码。例如插入一条记录:gocn.Execute "insert into TB_FJ_DATA(LSH,GKH,T_time) VALUES("1",99,GETDATE( ))"2023-06-09 13:28:051
VFP试题解答
我的解释在你原句的〔 && Fox_Layman 解释:〕之后。我的答案在每题的后面,原因又在答案的后面。三、阅读程序题1、执行下列程序,当输入A时,写出显示的结果。 ____________Clear && Fox_Layman 解释:清屏Wait "请输入一个字符:" to A && Fox_Layman 解释:Wait,为VFP命令,其作用是:显示信息并暂停 Visual FoxPro 的执行,按任意键或单击鼠标后继续执行。在这里的作用是等待输入,再将键盘输入或鼠标点击后的结果赋值给变量 A。Do Case && Fox_Layman 解释:Do Case ... Endcase 是多路分支语句,是命令集合。作用是若条件满足其中的某一项(某一Case,且排名分先后),即执行该项(Case)下的表达式。 Case Islower(A) && 判别字串A是否以小写开头 && Fox_Layman 解释:有解释了...(Case 1) ?"Lower" && Fox_Layman 解释:输出结果〔Lower〕在屏幕上。 Case Isupper(A) && 判别字串A是否以大写开头 && Fox_Layman 解释:有解释了...(Case 2) ?"Upper" && Fox_Layman 解释:输出结果〔Upper〕在屏幕上。 Case A>="0" And A<="9" && Fox_Layman 解释:判断是否是数字零到九。(Case 3) ?"Digit" && Fox_Layman 解释:输出结果〔Digit〕在屏幕上。 OtherWise && Fox_Layman 解释:若以上条件都不能满号时,或曰以上各种条件以外的情况时,则...(Case 4) ?"Other" && Fox_Layman 解释:输出结果〔Other〕在屏幕上。EndCase && Fox_Layman 解释:多路分支语句结束。*** 本题结果:(屏显)Upper。因为题目有〔当输入A时〕,满足条件(Case 2)。2、执行下列程序,写出显示的结果。 ______________Dimension A(20) && Fox_Layman 解释:声明一个一维数组,并命名该数组名为:A,且指定其行数为:20。Store 1 To A(1), A(2) && Fox_Layman 解释:将数字型数字 1 赋值给第一及第二个元素。For I=3 To 20 && Fox_Layman 解释:循环,范围是从 3 到 20。 A(I)=A(I-1)+A(I-2) && Fox_Layman 解释:将前一个元素(I-1)的值,加上前面的前面的那个元素(I-2)的值,赋给当前元素。即:前两个元素之和等於当前元素。Endfor && Fox_Layman 解释:循环结束。? A(10) && Fox_Layman 解释:将第十个元素的值输出到屏幕。*** 本题结果:(屏显)55。因为:*** 第一个元素的值是:1,由语句〔Store 1 To A(1), A(2)〕产生;*** 第二个元素的值是:1,由语句〔Store 1 To A(1), A(2)〕产生;*** 第三个元素的值是:2,由语句〔A(I)=A(I-1)+A(I-2)〕产生;*** 第四个元素的值是:3,由语句〔A(I)=A(I-1)+A(I-2)〕产生;*** 第五个元素的值是:5,由语句〔A(I)=A(I-1)+A(I-2)〕产生;*** 第六个元素的值是:8,由语句〔A(I)=A(I-1)+A(I-2)〕产生;*** 第七个元素的值是:13,由语句〔A(I)=A(I-1)+A(I-2)〕产生;*** 第八个元素的值是:21,由语句〔A(I)=A(I-1)+A(I-2)〕产生;*** 第九个元素的值是:34,由语句〔A(I)=A(I-1)+A(I-2)〕产生;*** 第十个元素的值是:55,由语句〔A(I)=A(I-1)+A(I-2)〕产生;*** 所以屏显的内容是:55。*** 看出来了没?这是一串斐波那契数列。3、执行下列程序,写出显示的结果。Store 10 To X, Y && Fox_Layman 解释:将数字型数字 10 分别赋值给变量 X 和 Y。Do While .T. && Fox_Layman 解释:循环,条件是循环成立(为真),则一直循环下去。 X=X+1 && Fox_Layman 解释:将变量 X 加 1 之后再赋值给 X。 Do Case && Fox_Layman 解释:Do Case ... Endcase 是多路分支语句,是命令集合。作用参见我在第一题中的解释。 Case Int(X/3)=X/3 && Fox_Layman 解释:变量 X 除以 3 之后取整数的值,等於变量 X 除以 3 之后的值。(Case 1) Loop && Fox_Layman 解释:若条件成立,则跳回到〔Do While .T.〕子句,而不去执行〔Loop〕到〔Enddo〕之间的任何语句。 Case X>=20 && Fox_Layman 解释:变量 X 大於等於 20 时。(Case 2) Exit && Fox_Layman 解释:若条件成立,则跳出本循环。 Otherwise && Fox_Layman 解释:若以上条件都不能满号时,或曰以上各种条件以外的情况时,则...(Case 3) Y=Y+X && Fox_Layman 解释:将变量 Y 与变量 X 之和赋值给变量 X。 EndCase && Fox_Layman 解释:多路分支语句结束。Enddo && Fox_Layman 解释:循环结束。?X, Y && Fox_Layman 解释:屏显变量 X 及变量 Y。(注意,要用半角的逗号哟,你在这里用的是全角的逗号)*** 本题结果:(屏显) 20 100。因为:*** 变量 X 及变量 Y 的初始值皆为 10,由语句〔Store 10 To X, Y〕产生;*** 第一次循环时:变量 X 的值为 11,由语句〔X=X+1〕产生;变量 Y 的值为 11+10=21,由语句〔Y=Y+X〕产生,是因为不满足条件(Case 1)或(Case 2),那就只能是(Case 3);*** 第二次循环时:变量 X 的值为 12,由语句〔X=X+1〕产生;变量 Y 的值仍为 21,因为条件(Case 1)得到了满足,〔Loop〕到〔Enddo〕之间的语句没有被执行;*** 第三次循环时:变量 X 的值为 13,由语句〔X=X+1〕产生;变量 Y 的值为 13+21=34,由语句〔Y=Y+X〕产生,是因为不满足条件(Case 1)或(Case 2),那就只能是(Case 3);*** 第四次循环时:变量 X 的值为 14,由语句〔X=X+1〕产生;变量 Y 的值为 14+33=48,由语句〔Y=Y+X〕产生,是因为不满足条件(Case 1)或(Case 2),那就只能是(Case 3);*** 第五次循环时:变量 X 的值为 15,由语句〔X=X+1〕产生;变量 Y 的值仍为 48,因为条件(Case 1)得到了满足,〔Loop〕到〔Enddo〕之间的语句没有被执行;*** 第六次循环时:变量 X 的值为 16,由语句〔X=X+1〕产生;变量 Y 的值为 16+48=64,由语句〔Y=Y+X〕产生,是因为不满足条件(Case 1)或(Case 2),那就只能是(Case 3);*** 第七次循环时:变量 X 的值为 17,由语句〔X=X+1〕产生;变量 Y 的值为 17+64=81,由语句〔Y=Y+X〕产生,是因为不满足条件(Case 1)或(Case 2),那就只能是(Case 3);*** 第八次循环时:变量 X 的值为 18,由语句〔X=X+1〕产生;变量 Y 的值仍为 81,因为条件(Case 1)得到了满足,〔Loop〕到〔Enddo〕之间的语句没有被执行;*** 第九次循环时:变量 X 的值为 19,由语句〔X=X+1〕产生;变量 Y 的值为 19+81=100,由语句〔Y=Y+X〕产生,是因为不满足条件(Case 1)或(Case 2),那就只能是(Case 3);*** 第十次循环时:变量 X 的值为 20,由语句〔X=X+1〕产生;变量 Y 的值仍为 100,因为条件(Case 2)得到了满足,循环已退出。*** 所以屏幕显示的结果是:20, 100。4、执行下列程序,写出显示的结果。Store 0 to X,Y && Fox_Layman 解释:将数字型数字 0 分别赋值给变量 X 和 Y。Do Sub1 && Fox_Layman 解释:调用一个名叫〔Sub1〕的过程。? X,Y,Z && Fox_Layman 解释:屏显变量 X, Y, Z 的值。Procedure Sub1 && Fox_Layman 解释:定义一个名叫〔Sub1〕的过程。Private X && Fox_Layman 解释:声明变量 X 为私有变量。Local Y && Fox_Layman 解释:声明变量 Y 为局部变量。Public Z && Fox_Layman 解释:声明变量 Z 为全局变量。X=1 && Fox_Layman 解释:将 1 赋给变量 X。Y=2 && Fox_Layman 解释:将 2 赋给变量 Y。Z=3 && Fox_Layman 解释:将 3 赋给变量 Z。? X,Y,Z && Fox_Layman 解释:屏显变量 X, Y, Z 的值。Return && Fox_Layman 解释:返回*** 本题结果:*** (第一行屏显) 1 2 3*** (第二行屏显) 0 0 3*** 因为:*** 第一行屏显时,显示的内容为变量 X, Y, Z 在过程 Sub1 中的值,由语句 〔X=1〕、〔Y=2〕和〔Z=3〕得出;*** 第二行屏显时,显示的内容为变量 X, Y, Z 在过程 Sub1 后的值,*** 即: 变量 X 私有变量,它是在调用过程中,把原有的值〔0(零)〕藏了起来,用当前的值〔1〕来参与运行,过程调用完成后,该变量的值又还原成来的值〔0(零)〕,该类型变量的特点是;上下层过程皆不能调用当前值;*** 变量 Y 局部变量,它是在调用过程中,把原有的值〔0(零)〕藏了起来,用当前的值〔2〕来参与运行,过程调用完成后,该变量的值又还原成来的值〔0(零)〕,该类型变量的特点是;上层过程不能调用当前值,但下层过程可以调用当前值;5、当输入数据80时,写出程序的输出结果。 ________________ Clear && Fox_Layman 解释:清屏Store 0 To X,Y && Fox_Layman 解释:将数字型数字 0 分别赋值给变量 X 和 Y。Do While X<10 && Fox_Layman 解释:循环,若条件〔X<10〕成立(为真),则一直循环下去。If Mod(X,5)=0 && Fox_Layman 解释:逻辑表达式,若变量 X 除 5 的余数为〔0(零)〕,即能整除,则...Y=Y+X && Fox_Layman 解释:将变量 Y 与变量 X 之和赋值给变量 X。Endif && Fox_Layman 解释:逻辑表达式结束。X=X+1 && Fox_Layman 解释:将变量 X 加 1 之后再赋值给 X。Enddo && Fox_Layman 解释:循环结束。? X,Y && Fox_Layman 解释:屏显变量 X, Y 的值。*** 本题结果:(屏显) 10 5。因为:*** 变量 X 及变量 Y 的初始值皆为 0,由语句〔Store 0 To X, Y〕产生;*** 第一次循环时:变量 X 的值为 1,由语句〔X=X+1〕产生;变量 Y 的值为〔0(零)〕,因为不能满足逻辑表达式〔If Mod(X,5)=0〕;*** 第二次循环时:变量 X 的值为 2,由语句〔X=X+1〕产生;变量 Y 的值为〔0(零)〕,因为不能满足逻辑表达式〔If Mod(X,5)=0〕;*** 第三次循环时:变量 X 的值为 3,由语句〔X=X+1〕产生;变量 Y 的值为〔0(零)〕,因为不能满足逻辑表达式〔If Mod(X,5)=0〕;*** 第四次循环时:变量 X 的值为 4,由语句〔X=X+1〕产生;变量 Y 的值为〔0(零)〕,因为不能满足逻辑表达式〔If Mod(X,5)=0〕;*** 第五次循环时:变量 X 的值为 5,由语句〔X=X+1〕产生;变量 Y 的值为〔0+5=5〕,由语句〔Y=Y+X〕产生,因为能够满足逻辑表达式〔If Mod(X,5)=0〕;*** 第六次循环时:变量 X 的值为 6,由语句〔X=X+1〕产生;变量 Y 的值仍为〔5〕,因为不能满足逻辑表达式〔If Mod(X,5)=0〕;*** 第七次循环时:变量 X 的值为 7,由语句〔X=X+1〕产生;变量 Y 的值仍为〔5〕,因为不能满足逻辑表达式〔If Mod(X,5)=0〕;*** 第八次循环时:变量 X 的值为 8,由语句〔X=X+1〕产生;变量 Y 的值仍为〔5〕,因为不能满足逻辑表达式〔If Mod(X,5)=0〕;*** 第九次循环时:变量 X 的值为 9,由语句〔X=X+1〕产生;变量 Y 的值仍为〔5〕,因为不能满足逻辑表达式〔If Mod(X,5)=0〕;*** 第十次循环时:变量 X 的值为 10,由语句〔X=X+1〕产生;变量 Y 的值仍为〔5〕,因为循环的条件是〔X<10〕,不能满足循环的条件,故循环已退出。*** 所以屏幕显示的结果是:10, 5。*** 另注:〔当输入数据80时〕这句无法实现,因为本程序中没有可供输入的语句,所以无法实现,是不是你哪里搞错了?6、执行下列程序,写出显示的结果。 ________________i=1 && Fox_Layman 解释:将变量 i 赋值 1。DO WHILE i<10 && Fox_Layman 解释:循环,若条件〔i<10〕成立(为真),则一直循环下去。i=i+2 && Fox_Layman 解释:将变量 i 加上 2 之后再赋值给变量 i 。ENDDO && Fox_Layman 解释:循环结束。? i && Fox_Layman 解释:屏显变量 i 的值。*** 本题结果:(屏显) 11。因为:*** 第一次循环时:变量 i 的值为 1+2=3,由语句〔i=i+2〕产生;现在是 i = 3,条件〔i<10〕成立,继续循环;*** 第二次循环时:变量 X 的值为 3+2=5,由语句〔i=i+2〕产生;现在是 i = 5,条件〔i<10〕成立,继续循环;*** 第三次循环时:变量 X 的值为 5+2=7,由语句〔i=i+2〕产生;现在是 i = 7,条件〔i<10〕成立,继续循环;*** 第四次循环时:变量 X 的值为 7+2=9,由语句〔i=i+2〕产生;现在是 i = 9,条件〔i<10〕成立,继续循环;*** 第五次循环时:变量 X 的值为 9+2=11,由语句〔i=i+2〕产生;现在是 i = 11,条件〔i<10〕不成立,结束循环。7、设自由表 成绩(姓名 C 8,语文 I,数学 I,英语 I),窗体如下图所示:命令按钮“确定”的单击事件代码如下:Select max(语文+数学+英语) as 最高分 from 成绩 where 姓名="张" into currsor lsbSelect lsbGo 1Thisform.text1.value=最高分(1) 表格控件要显示学生成绩表中的数据,则应设置该控件的什么属性?(2) 单击“确定”按钮后,文本框Text1中显示的内容是? 答案:没见到图,不好回答!2023-06-09 13:28:421
golang闭包原理
那你想咋这必保研里的话,根据你的需求来进行指控就可以了2023-06-09 13:28:589
数控宏程序代码#3000=1是什么意思
用户报警信息2023-06-09 13:29:187
堆排序怎么建立初始堆
.example-btn{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.example-btn:hover{color:#fff;background-color:#47a447;border-color:#398439}.example-btn:active{background-image:none}div.example{width:98%;color:#000;background-color:#f6f4f0;background-color:#d0e69c;background-color:#dcecb5;background-color:#e5eecc;margin:005px0;padding:5px;border:1pxsolid#d4d4d4;background-image:-webkit-linear-gradient(#fff,#e5eecc100px);background-image:linear-gradient(#fff,#e5eecc100px)}div.example_code{line-height:1.4em;width:98%;background-color:#fff;padding:5px;border:1pxsolid#d4d4d4;font-size:110%;font-family:Menlo,Monaco,Consolas,"AndaleMono","lucidaconsole","CourierNew",monospace;word-break:break-all;word-wrap:break-word}div.example_result{background-color:#fff;padding:4px;border:1pxsolid#d4d4d4;width:98%}div.code{width:98%;border:1pxsolid#d4d4d4;background-color:#f6f4f0;color:#444;padding:5px;margin:0}div.codediv{font-size:110%}div.codediv,div.codep,div.example_codep{font-family:"couriernew"}pre{margin:15pxauto;font:12px/20pxMenlo,Monaco,Consolas,"AndaleMono","lucidaconsole","CourierNew",monospace;white-space:pre-wrap;word-break:break-all;word-wrap:break-word;border:1pxsolid#ddd;border-left-width:4px;padding:10px15px}排序算法是《数据结构与算法》中最基本的算法之一。排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。以下是堆排序算法:堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法:大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列;小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列;堆排序的平均时间复杂度为Ο(nlogn)。1.算法步骤创建一个堆H[0??n-1];把堆首(最大值)和堆尾互换;把堆的尺寸缩小1,并调用shift_down(0),目的是把新的数组顶端数据调整到相应位置;重复步骤2,直到堆的尺寸为1。2.动图演示代码实现JavaScript实例varlen;//因为声明的多个函数都需要数据长度,所以把len设置成为全局变量functionbuildMaxHeap(arr){//建立大顶堆len=arr.length;for(vari=Math.floor(len/2);i>=0;i--){heapify(arr,i);}}functionheapify(arr,i){//堆调整varleft=2*i+1,right=2*i+2,largest=i;if(left<len&&arr[left]>arr[largest]){largest=left;}if(right<len&&arr[right]>arr[largest]){largest=right;}if(largest!=i){swap(arr,i,largest);heapify(arr,largest);}}functionswap(arr,i,j){vartemp=arr[i];arr[i]=arr[j];arr[j]=temp;}functionheapSort(arr){buildMaxHeap(arr);for(vari=arr.length-1;i>0;i--){swap(arr,0,i);len--;heapify(arr,0);}returnarr;}Python实例defbuildMaxHeap(arr):importmathforiinrange(math.floor(len(arr)/2),-1,-1):heapify(arr,i)defheapify(arr,i):left=2*i+1right=2*i+2largest=iifleft<arrLenandarr[left]>arr[largest]:largest=leftifright<arrLenandarr[right]>arr[largest]:largest=rightiflargest!=i:swap(arr,i,largest)heapify(arr,largest)defswap(arr,i,j):arr[i],arr[j]=arr[j],arr[i]defheapSort(arr):globalarrLenarrLen=len(arr)buildMaxHeap(arr)foriinrange(len(arr)-1,0,-1):swap(arr,0,i)arrLen-=1heapify(arr,0)returnarrGo实例funcheapSort(arr[]int)[]int{arrLen:=len(arr)buildMaxHeap(arr,arrLen)fori:=arrLen-1;i>=0;i--{swap(arr,0,i)arrLen-=1heapify(arr,0,arrLen)}returnarr}funcbuildMaxHeap(arr[]int,arrLenint){fori:=arrLen/2;i>=0;i--{heapify(arr,i,arrLen)}}funcheapify(arr[]int,i,arrLenint){left:=2*i+1right:=2*i+2largest:=iifleft<arrLen&&arr[left]>arr[largest]{largest=left}ifright<arrLen&&arr[right]>arr[largest]{largest=right}iflargest!=i{swap(arr,i,largest)heapify(arr,largest,arrLen)}}funcswap(arr[]int,i,jint){arr[i],arr[j]=arr[j],arr[i]}Java实例publicclassHeapSortimplementsIArraySort{@Overridepublicint[]sort(int[]sourceArray)throwsException{//对arr进行拷贝,不改变参数内容int[]arr=Arrays.copyOf(sourceArray,sourceArray.length);intlen=arr.length;buildMaxHeap(arr,len);for(inti=len-1;i>0;i--){swap(arr,0,i);len--;heapify(arr,0,len);}returnarr;}privatevoidbuildMaxHeap(int[]arr,intlen){for(inti=(int)Math.floor(len/2);i>=0;i--){heapify(arr,i,len);}}privatevoidheapify(int[]arr,inti,intlen){intleft=2*i+1;intright=2*i+2;intlargest=i;if(left<len&&arr[left]>arr[largest]){largest=left;}if(right<len&&arr[right]>arr[largest]){largest=right;}if(largest!=i){swap(arr,i,largest);heapify(arr,largest,len);}}privatevoidswap(int[]arr,inti,intj){inttemp=arr[i];arr[i]=arr[j];arr[j]=temp;}}PHP实例functionbuildMaxHeap(&$arr){global$len;for($i=floor($len/2);$i>=0;$i--){heapify($arr,$i);}}functionheapify(&$arr,$i){global$len;$left=2*$i+1;$right=2*$i+2;$largest=$i;if($left<$len&&$arr[$left]>$arr[$largest]){$largest=$left;}if($right<$len&&$arr[$right]>$arr[$largest]){$largest=$right;}if($largest!=$i){swap($arr,$i,$largest);heapify($arr,$largest);}}functionswap(&$arr,$i,$j){$temp=$arr[$i];$arr[$i]=$arr[$j];$arr[$j]=$temp;}functionheapSort($arr){global$len;$len=count($arr);buildMaxHeap($arr);for($i=count($arr)-1;$i>0;$i--){swap($arr,0,$i);$len--;heapify($arr,0);}return$arr;}C实例#include<stdio.h>#include<stdlib.h>voidswap(int*a,int*b){inttemp=*b;*b=*a;*a=temp;}voidmax_heapify(intarr[],intstart,intend){//建立父__指_和子__指_intdad=start;intson=dad*2+1;while(son<=end){//若子__指_在___才做比_if(son+1<=end&&arr[son]<arr[son+1])//先比___子__大小,__最大的son++;if(arr[dad]>arr[son])//如果父__大於子__代表_整完_,直接跳出函_return;else{//否_交_父子_容再__子__和___比_swap(&arr[dad],&arr[son]);dad=son;son=dad*2+1;}}}voidheap_sort(intarr[],intlen){inti;//初始化,i_最後一_父___始_整for(i=len/2-1;i>=0;i--)max_heapify(arr,i,len-1);//先_第一_元素和已排好元素前一位做交_,再重新_整,直到排序完_for(i=len-1;i>0;i--){swap(&arr[0],&arr[i]);max_heapify(arr,0,i-1);}}intmain(){intarr[]={3,5,3,0,8,6,1,5,8,6,2,4,9,4,7,0,1,8,9,7,3,1,2,5,9,7,4,0,2,6};intlen=(int)sizeof(arr)/sizeof(*arr);heap_sort(arr,len);inti;for(i=0;i<len;i++)printf("%d",arr[i]);printf("");return0;}C++实例#include<iostream>#include<algorithm>usingnamespacestd;voidmax_heapify(intarr[],intstart,intend){//建立父__指_和子__指_intdad=start;intson=dad*2+1;while(son<=end){//若子__指_在___才做比_if(son+1<=end&&arr[son]<arr[son+1])//先比___子__大小,__最大的son++;if(arr[dad]>arr[son])//如果父__大於子__代表_整完_,直接跳出函_return;else{//否_交_父子_容再__子__和___比_swap(arr[dad],arr[son]);dad=son;son=dad*2+1;}}}voidheap_sort(intarr[],intlen){//初始化,i_最後一_父___始_整for(inti=len/2-1;i>=0;i--)max_heapify(arr,i,len-1);//先_第一_元素和已经排好的元素前一位做交_,再_新_整(刚调整的元素之前的元素),直到排序完_for(inti=len-1;i>0;i--){swap(arr[0],arr[i]);max_heapify(arr,0,i-1);}}intmain(){intarr[]={3,5,3,0,8,6,1,5,8,6,2,4,9,4,7,0,1,8,9,7,3,1,2,5,9,7,4,0,2,6};intlen=(int)sizeof(arr)/sizeof(*arr);heap_sort(arr,len);for(inti=0;i<len;i++)cout<<arr[i]<<"";cout<<endl;return0;}参考文章:https://github.com/hustcc/JS-Sorting-Algorithm/blob/master/7.heapSort.mdhttps://zh.wikipedia.org/wiki/%E5%A0%86%E6%8E%92%E5%BA%8F以下是热心网友对堆排序算法的补充,仅供参考:热心网友提供的补充1:上方又没些C#的堆排序,艾孜尔江补充如下:///<summary>///堆排序///</summary>///<paramname="arr">待排序数组</param>staticvoidHeapSort(int[]arr){intvCount=arr.Length;int[]tempKey=newint[vCount+1];//元素索引从1开始for(inti=0;i<vCount;i++){tempKey[i+1]=arr[i];}//初始数据建堆(从含最后一个结点的子树开始构建,依次向前,形成整个二叉堆)for(inti=vCount/2;i>=1;i--){Restore(tempKey,i,vCount);}//不断输出堆顶元素、重构堆,进行排序for(inti=vCount;i>1;i--){inttemp=tempKey[i];tempKey[i]=tempKey[1];tempKey[1]=temp;Restore(tempKey,1,i-1);}//排序结果for(inti=0;i<vCount;i++){arr[i]=tempKey[i+1];}}///<summary>///二叉堆的重构(针对于已构建好的二叉堆首尾互换之后的重构)///</summary>///<paramname="arr"></param>///<paramname="rootNode">根结点j</param>///<paramname="nodeCount">结点数</param>staticvoidRestore(int[]arr,introotNode,intnodeCount){while(rootNode<=nodeCount/2)//保证根结点有子树{//找出左右儿子的最大值intm=(2*rootNode+1<=nodeCount&&arr[2*rootNode+1]>arr[2*rootNode])?2*rootNode+1:2*rootNode;if(arr[m]>arr[rootNode]){inttemp=arr[m];arr[m]=arr[rootNode];arr[rootNode]=temp;rootNode=m;}else{break;}}}热心网友提供的补充2:堆排序是不稳定的排序!既然如此,每次构建大顶堆时,在父节点、左子节点、右子节点取三者中最大者作为父节点就行。我们追寻的只是最终排序后的结果,所以可以简化其中的步骤。我将个人写的Java代码核心放在下方,有兴趣的同学可以一起讨2023-06-09 13:29:531
java中的static
有要详解,那我找资料给你吧static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。 被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。 用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象市,不生成static变量的副本,而是类的所有实例共享同一个static变量。 static变量前可以有private修饰,表示这个变量可以在类的静态代码块中,或者类的其他静态成员方法中使用(当然也可以在非静态成员方法中使用--废话),但是不能在其他类中通过类名来直接引用,这一点很重要。实际上你需要搞明白,private是访问权限限定,static表示不要实例化就可以使用,这样就容易理解多了。static前面加上其它访问权限关键字的效果也以此类推。 static修饰的成员变量和成员方法习惯上称为静态变量和静态方法,可以直接通过类名来访问,访问语法为: 类名.静态方法名(参数列表...) 类名.静态变量名 用static修饰的代码块表示静态代码块,当Java虚拟机(JVM)加载类时,就会执行该代码块(用处非常大,呵呵)。 1、static变量 按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。两者的区别是: 对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。 对于实例变量,没创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。 所以一般在需要实现以下两个功能时使用静态变量:uf06c 在对象之间共享值时uf06c 方便访问变量时2、静态方法 静态方法可以直接通过类名调用,任何的实例也都可以调用,因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。因为实例成员与特定的对象关联!这个需要去理解,想明白其中的道理,不是记忆!!! 因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。例如为了方便方法的调用,Java API中的Math类中所有的方法都是静态的,而一般类内部的static方法也是方便其它类对该方法的调用。静态方法是类内部的一类特殊方法,只有在需要时才将对应的方法声明成静态的,一个类内部的方法一般都是非静态的 3、static代码块 static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。例如: public class Test5 { private static int a; private int b; static{ Test5.a=3; System.out.println(a); Test5 t=new Test5(); t.f(); t.b=1000; System.out.println(t.b); } static{ Test5.a=4; System.out.println(a); } public static void main(String[] args) { // TODO 自动生成方法存根 } static{ Test5.a=5; System.out.println(a); } public void f(){ System.out.println("hhahhahah"); } } 运行结果: 3 hhahhahah 1000 4 5 利用静态代码块可以对一些static变量进行赋值,最后再看一眼这些例子,都一个static的main方法,这样JVM在运行main方法的时候可以直接调用而不用创建实例。 4、static和final一块用表示什么 static final用来修饰成员变量和成员方法,可简单理解为“全局常量”! 对于变量,表示一旦给值就不可修改,并且通过类名可以访问。 对于方法,表示不可覆盖,并且可以通过类名直接访问。有时你希望定义一个类成员,使它的使用完全独立于该类的任何对象。通常情况下,类成员必须通过它的类的对象访问,但是可以创建这样一个成员,它能够被它自己使用,而不必引用特定的实例。在成员的声明前面加上关键字static(静态的)就能创建这样的成员。如果一个成员被声明为static,它就能够在它的类的任何对象创建之前被访问,而不必引用任何对象。你可以将方法和变量都声明为static。static 成员的最常见的例子是main( ) 。因为在程序开始执行时必须调用main() ,所以它被声明为static。 声明为static的变量实质上就是全局变量。当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例变量共用同一个static变量。声明为static的方法有以下几条限制: u2022 它们仅能调用其他的static 方法。 u2022 它们只能访问static数据。 u2022 它们不能以任何方式引用this 或super(关键字super 与继承有关,在下一章中描述)。 如果你需要通过计算来初始化你的static变量,你可以声明一个static块,Static 块仅在该类被加载时执行一次。下面的例子显示的类有一个static方法,一些static变量,以及一个static 初始化块: // Demonstrate static variables,methods,and blocks. class UseStatic { static int a = 3; static int b; static void meth(int x) { System.out.println("x = " + x); System.out.println("a = " + a); System.out.println("b = " + b); } static { System.out.println("Static block initialized."); b = a * 4; } public static void main(String args[]) { meth(42); } } 一旦UseStatic 类被装载,所有的static语句被运行。首先,a被设置为3,接着static 块执行(打印一条消息),最后,b被初始化为a*4 或12。然后调用main(),main() 调用meth() ,把值42传递给x。3个println ( ) 语句引用两个static变量a和b,以及局部变量x 。 注意:在一个static 方法中引用任何实例变量都是非法的。 下面是该程序的输出: Static block initialized. x = 42 a = 3 b = 12 在定义它们的类的外面,static 方法和变量能独立于任何对象而被使用。这样,你只要在类的名字后面加点号运算符即可。例如,如果你希望从类外面调用一个static方法,你可以使用下面通用的格式: classname.method( ) 这里,classname 是类的名字,在该类中定义static方法。可以看到,这种格式与通过对象引用变量调用非static方法的格式类似。一个static变量可以以同样的格式来访问——类名加点号运算符。这就是Java 如何实现全局功能和全局变量的一个控制版本。 下面是一个例子。在main() 中,static方法callme() 和static 变量b在它们的类之外被访问。 class StaticDemo { static int a = 42; static int b = 99; static void callme() { System.out.println("a = " + a); } } class StaticByName { public static void main(String args[]) { StaticDemo.callme(); System.out.println("b = " + StaticDemo.b); } } 下面是该程序的输出: a = 42 b = 99 static成员是不能被其所在class创建的实例访问的。 如果不加static修饰的成员是对象成员,也就是归每个对象所有的。 加static修饰的成员是类成员,就是可以由一个类直接调用,为所有对象共有的这样可以么?2023-06-09 13:30:031
我刚开始学习汇编,我用的是masm32,我设置好环境变量后ml了一下出现一个错误
你汇编工具里没Windows.inc这个文件,或工具没找到2023-06-09 13:30:113
如何给text类型的变量赋值
对于 TEXTPTR 函数,只有 text、ntext 和 image 列有效。create procedure Manage_FAQ_Begin@userid int,@id int,@Topicid int,@State varchar(5) output,@Answer text outputasdeclare @noteptr binary(16)select @State = "add"select @noteptr = textptr(@Answer)--writetext @Answer @noteptr "1111111111111111111111111111111111111111111112222222222"go2023-06-09 13:30:232
C#调用C++动态库的时候,如果捕获C++线程里的错误
全局系统钩子的使用。为此,我开发了一个可重用的类库并创建一个相应的示例程序(见下图)。 你可能注意到另外的关于使用系统钩子的文章。本文与之类似但是有重要的差别。这篇文章将讨论在.NET中使用全局系统钩子,而其它文章仅讨论本地系统钩子。这些思想是类似的,但是实现要求是不同的。 二、 背景 如果你对Windows系统钩子的概念不熟悉,让我作一下简短的描述: u30fb一个系统钩子允许你插入一个回调函数-它拦截某些Windows消息(例如,鼠标相联系的消息)。 u30fb一个本地系统钩子是一个系统钩子-它仅在指定的消息由一个单一线程处理时被调用。 u30fb一个全局系统钩子是一个系统钩子-它当指定的消息被任何应用程序在整个系统上所处理时被调用。已有若干好文章来介绍系统钩子概念。在此,不是为了重新收集这些介绍性的信息,我只是简单地请读者参考下面有关系统钩子的一些背景资料文章。如果你对系统钩子概念很熟悉,那么你能够从本文中得到你能够得到的任何东西。 u30fb关于MSDN库中的钩子知识。 u30fbDino Esposito的《Cutting Edge-Windows Hooks in the .NET Framework》。 u30fbDon Kackman的《在C#中应用钩子》。 本文中我们要讨论的是扩展这个信息来创建一个全局系统钩子-它能被.NET类所使用。我们将用C#和一个DLL和非托管C++来开发一个类库-它们一起将完成这个目标。 三、 使用代码 在我们深入开发这个库之前,让我们快速看一下我们的目标。在本文中,我们将开发一个类库-它安装全局系统钩子并且暴露这些由钩子处理的事件,作为我们的钩子类的一个.NET事件。为了说明这个系统钩子类的用法,我们将在一个用C#编写的Windows表单应用程序中创建一个鼠标事件钩子和一个键盘事件钩子。 这些类库能用于创建任何类型的系统钩子,其中有两个预编译的钩子-MouseHook和KeyboardHook。我们也已经包含了这些类的特定版本,分别称为MouseHookExt和KeyboardHookExt。根据这些类所设置的模型,你能容易构建系统钩子-针对Win32 API中任何15种钩子事件类型中的任何一种。另外,这个完整的类库中还有一个编译的HTML帮助文件-它把这些类归档化。请确信你看了这个帮助文件-如果你决定在你的应用程序中使用这个库的话。 MouseHook类的用法和生命周期相当简单。首先,我们创建MouseHook类的一个实例。mouseHook = new MouseHook();//mouseHook是一个成员变量 接下来,我们把MouseEvent事件绑定到一个类层次的方法上。mouseHook.MouseEvent+=new MouseHook.MouseEventHandler(mouseHook_MouseEvent);// ...private void mouseHook_MouseEvent(MouseEvents mEvent, int x, int y){ string msg =string.Format("鼠标事件::(,).",mEvent.ToString(),x,y); AddText(msg);//增加消息到文本框} 为开始收到鼠标事件,简单地安装下面的钩子即可。mouseHook.InstallHook(); 为停止接收事件,只需简单地卸载这个钩子。mouseHook.UninstallHook(); 你也可以调用Dispose来卸载这个钩子。 在你的应用程序退出时,卸载这个钩子是很重要的。让系统钩子一直安装着将减慢系统中的所有的应用程序的消息处理。它甚至能够使一个或多个进程变得很不稳定。因此,请确保在你使用完钩子时一定要移去你的系统钩子。我们确定在我们的示例应用程序会移去该系统钩子-通过在Form的Dispose方法中添加一个Dispose调用。protected override void Dispose(bool disposing) { if (disposing) { if (mouseHook != null) { mouseHook.Dispose(); mouseHook = null; } // ... }} 使用该类库的情况就是如此。该类库中有两个系统钩子类并且相当容易扩充。 四、 构建库 这个库共有两个主要组件。第一部分是一个C#类库-你可以直接使用于你的应用程序中。该类库,反过来,在内部使用一个非托管的C++ DLL来直接管理系统钩子。我们将首先讨论开发该C++部分。接下来,我们将讨论怎么在C#中使用这个库来构建一个通用的钩子类。就象我们讨论C++/C#交互一样,我们将特别注意C++方法和数据类型是怎样映射到.NET方法和数据类型的。 你可能想知道为什么我们需要两个库,特别是一个非托管的C++ DLL。你还可能注意到在本文的背景一节中提到的两篇参考文章,其中并没有使用任何非托管的代码。为此,我的回答是,"对!这正是我写这篇文章的原因"。当你思考系统钩子是怎样实际地实现它们的功能时,我们需要非托管的代码是十分重要的。为了使一个全局的系统钩子能够工作,Windows把你的DLL插入到每个正在运行的进程的进程空间中。既然大多数进程不是.NET进程,所以,它们不能直接执行.NET装配集。我们需要一种非托管的代码代理- Windows可以把它插入到所有将要被钩住的进程中。 首先是提供一种机制来把一个.NET代理传递到我们的C++库。这样,我们用C++语言定义下列函数(SetUserHookCallback)和函数指针(HookProc)。int SetUserHookCallback(HookProc userProc, UINT hookID)typedef void (CALLBACK *HookProc)(int code, WPARAM w, LPARAM l) SetUserHookCallback的第二个参数是钩子类型-这个函数指针将使用它。现在,我们必须用C#来定义相应的方法和代理以使用这段代码。下面是我们怎样把它映射到C#。private static extern SetCallBackResultsSetUserHookCallback(HookProcessedHandler hookCallback, HookTypes hookType)protected delegate void HookProcessedHandler(int code, UIntPtr wparam, IntPtr lparam)public enum HookTypes { JournalRecord = 0, JournalPlayback = 1, // ... KeyboardLL = 13, MouseLL = 14}; 首先,我们使用DllImport属性导入SetUserHookCallback函数,作为我们的抽象基钩子类SystemHook的一个静态的外部的方法。为此,我们必须映射一些外部数据类型。首先,我们必须创建一个代理作为我们的函数指针。这是通过定义上面的HookProcessHandler 来实现的。我们需要一个函数,它的C++签名为(int,WPARAM,LPARAM)。在Visual Studio .NET C++编译器中,int与C#中是一样的。也就是说,在C++与C#中int就是Int32。事情并不总是这样。一些编译器把C++ int作为Int16对待。我们坚持使用Visual Studio .NET C++编译器来实现这个工程,因此,我们不必担心编译器差别所带来的另外的定义。 接下来,我们需要用C#传递WPARAM和LPARAM值。这些确实是指针,它们分别指向C++的UINT和LONG值。用C#来说,它们是指向uint和int的指针。如果你还不确定什么是WPARAM,你可以通过在C++代码中单击右键来查询它,并且选择"Go to definition"。这将会引导你到在windef.h中的定义。//从windef.h:typedef UINT_PTR WPARAM;typedef LONG_PTR LPARAM; 因此,我们选择System.UIntPtr和System.IntPtr作为我们的变量类型-它们分别相应于WPARAM和LPARAM类型,当它们使用在C#中时。现在,让我们看一下钩子基类是怎样使用这些导入的方法来传递一个回叫函数(代理)到C++中-它允许C++库直接调用你的系统钩子类的实例。首先,在构造器中,SystemHook类创建一个到私有方法InternalHookCallback的代理-它匹配HookProcessedHandler代理签名。然后,它把这个代理和它的HookType传递到C++库以使用SetUserHookCallback方法来注册该回叫函数,如上面所讨论的。下面是其代码实现:public SystemHook(HookTypes type){ _type = type; _processHandler = new HookProcessedHandler(InternalHookCallback); SetUserHookCallback(_processHandler, _type);} InternalHookCallback的实现相当简单。InternalHookCallback在用一个catch-all try/catch块包装它的同时仅传递到抽象方法HookCallback的调用。这将简化在派生类中的实现并且保护C++代码。记住,一旦一切都准备妥当,这个C++钩子就会直接调用这个方法。[MethodImpl(MethodImplOptions.NoInlining)]private void InternalHookCallback(int code, UIntPtr wparam, IntPtr lparam){try catch {}} 我们已增加了一个方法实现属性-它告诉编译器不要内联这个方法。这不是可选的。至少,在我添加try/catch之前是需要的。看起来,由于某些原因,编译器在试图内联这个方法-这将给包装它的代理带来各种麻烦。然后,C++层将回叫,而该应用程序将会崩溃。 现在,让我们看一下一个派生类是怎样用一个特定的HookType来接收和处理钩子事件。下面是虚拟的MouseHook类的HookCallback方法实现:protected override void HookCallback(int code, UIntPtr wparam, IntPtr lparam){ if (MouseEvent == null) int x = 0, y = 0; MouseEvents mEvent = (MouseEvents)wparam.ToUInt32(); switch(mEvent) { case MouseEvents.LeftButtonDown: GetMousePosition(wparam, lparam, ref x, ref y); break; // ... } MouseEvent(mEvent, new Point(x, y));} 首先,注意这个类定义一个事件MouseEvent-该类在收到一个钩子事件时激发这个事件。这个类在激发它的事件之前,把数据从WPARAM和 LPARAM类型转换成.NET中有意义的鼠标事件数据。这样可以使得类的消费者免于担心解释这些数据结构。这个类使用导入的 GetMousePosition函数-我们在C++ DLL中定义的用来转换这些值。为此,请看下面几段的讨论。 在这个方法中,我们检查是否有人在听这一个事件。如果没有,不必继续处理这一事件。然后,我们把WPARAM转换成一个MouseEvents枚举类型。我们已小心地构造了MouseEvents枚举来准确匹配它们在C ++中相应的常数。这允许我们简单地把指针的值转换成枚举类型。但是要注意,这种转换即使在WPARAM的值不匹配一个枚举值的情况下也会成功。 mEvent的值将仅是未定义的(不是null,只是不在枚举值范围之内)。为此,请详细分析System.Enum.IsDefined方法。 接下来,在确定我们收到的事件类型后,该类激活这个事件,并且通知消费者鼠标事件的类型及在该事件过程中鼠标的位置。 最后注意,有关转换WPARAM和LPARAM值:对于每个类型的事件,这些变量的值和意思是不同的。因此,在每一种钩子类型中,我们必须区别地解释这些值。我选择用C++实现这种转换,而不是尽量用C#来模仿复杂的C++结构和指针。例如,前面的类就使用了一个叫作GetMousePosition的 C++函数。下面是C++ DLL中的这个方法:bool GetMousePosition(WPARAM wparam, LPARAM lparam, int amp; x, int amp; y) { MOUSEHOOKSTRUCT * pMouseStruct = (MOUSEHOOKSTRUCT *)lparam; x = pMouseStruct->pt.x; y = pMouseStruct->pt.y; return true;} 不是尽量映射MOUSEHOOKSTRUCT结构指针到C#,我们简单地暂时把它回传到C++层以提取我们需要的值。注意,因为我们需要从这个调用中返回一些值,我们把我们的整数作为参考变量传递。这直接映射到C#中的int*。但是,我们可以重载这个行为,通过选择正确的签名来导入这个方法。private static extern bool InternalGetMousePosition(UIntPtr wparam,IntPtr lparam, ref int x, ref int y) 通过把integer参数定义为ref int,我们得到通过C++参照传递给我们的值。如果我们想要的话,我们还可以使用out int。 五、 限制 一些钩子类型并不适合实现全局钩子。我当前正在考虑解决办法-它将允许使用受限制的钩子类型。到目前为止,不要把这些类型添加回该库中,因为它们将导致应用程序的失败(经常是系统范围的灾难性失败)。下一节将集中讨论这些限制背后的原因和解决办法。HookTypes.CallWindowProcedureHookTypes.CallWindowProretHookTypes.ComputerBasedTrainingHookTypes.DebugHookTypes.ForegroundIdleHookTypes.JournalRecordHookTypes.JournalPlaybackHookTypes.GetMessageHookTypes.SystemMessageFilter 六、 两种类型的钩子 在本节中,我将尽量解释为什么一些钩子类型被限制在一定的范畴内而另外一些则不受限制。如果我使用有点偏差术语的话,请原谅我。我还没有找到任何有关这部分题目的文档,因此,我编造了我自己的词汇。另外,如果你认为我根本就不对,请告诉我好了。 当Windows调用传递到SetWindowsHookEx()的回调函数时它们会因不同类型的钩子而被区别调用。基本上有两种情况:切换执行上下文的钩子和不切换执行上下文的钩子。用另一种方式说,也就是,在放钩子的应用程序进程空间执行钩子回调函数的情况和在被钩住的应用程序进程空间执行钩子回调函数的情况。 钩子类型例如鼠标和键盘钩子都是在被Windows调用之前切换上下文的。整个过程大致如下: 1. 应用程序X拥有焦点并执行。 2. 用户按下一个键。 3. Windows从应用程序X接管上下文并把执行上下文切换到放钩子的应用程序。 4. Windows用放钩子的应用程序进程空间中的键消息参数调用钩子回调函数。 5. Windows从放钩子的应用程序接管上下文并把执行上下文切换回应用程序X。 6. Windows把消息放进应用程序X的消息排队。 7. 稍微一会儿之后,当应用程序X执行时,它从自己的消息排队中取出消息并且调用它的内部按键(或松开或按下)处理器。 8. 应用程序X继续执行... 例如CBT钩子(window创建,等等。)的钩子类型并不切换上下文。对于这些类型的钩子,过程大致如下: 1. 应用程序X拥有焦点并执行。 2. 应用程序X创建一个窗口。 3. Windows用在应用程序X进程空间中的CBT事件消息参数调用钩子回调函数。 4. 应用程序X继续执行... 这应该说明了为什么某种类型的钩子能够用这个库结构工作而一些却不能。记住,这正是该库要做的。在上面第4步和第3步之后,分别插入下列步骤: 1. Windows调用钩子回调函数。 2. 目标回调函数在非托管的DLL中执行。 3. 目标回调函数查找它的相应托管的调用代理。 4. 托管代理被以适当的参数执行。 5. 目标回调函数返回并执行相应于指定消息的钩子处理。 第三步和第四步因非切换钩子类型而注定失败。第三步将失败,因为相应的托管回调函数不会为该应用程序而设置。记住,这个DLL使用全局变量来跟踪这些托管代理并且该钩子DLL被加载到每一个进程空间。但是这个值仅在放钩子的应用程序进程空间中设置。对于另外其它情况,它们全部为null。 Tim Sylvester在他的《Other hook types》一文中指出,使用一个共享内存区段将会解决这个问题。这是真实的,但是也如Tim所指出的,那些托管代理地址对于除了放钩子的应用程序之外的任何进程是无意义的。这意味着,它们是无意义的并且不能在回调函数的执行过程中调用。那样会有麻烦的。 因此,为了把这些回调函数使用于不执行上下文切换的钩子类型,你需要某种进程间的通讯。 我已经试验过这种思想-使用非托管的DLL钩子回调函数中的进程外COM对象进行IPC。如果你能使这种方法工作,我将很高兴了解到这点。至于我的尝试,结果并不理想。基本原因是很难针对各种进程和它们的线程(CoInitialize(NULL))而正确地初始化COM单元。这是一个在你可以使用 COM对象之前的基本要求。 我不怀疑,一定有办法来解决这个问题。但是我还没有试用过它们,因为我认为它们仅有有限的用处。例如,CBT钩子可以让你取消一个窗口创建,如果你希望的话。可以想像,为使这能够工作将会发生什么。 1. 钩子回调函数开始执行。 2. 调用非托管的钩子DLL中的相应的钩子回调函数。 3. 执行必须被路由回到主钩子应用程序。 4. 该应用程序必须决定是否允许这一创建。 5. 调用必须被路由回仍旧在运行中的钩子回调函数。 6. 在非托管的钩子DLL中的钩子回调函数从主钩子应用程序接收到要采取的行动。 7. 在非托管的钩子DLL中的钩子回调函数针对CBT钩子调用采取适当的行动。 8. 完成钩子回调函数的执行。 这不是不可能的,但是不算好的。我希望这会消除在该库中的围绕被允许的和受限制的钩子类型所带来的神秘。 七、 其它 u30fb库文档:我们已经包含了有关ManagedHooks类库的比较完整的代码文档。当以"Documentation"构建配置进行编译时,这被经由Visual Studio.NET转换成标准帮助XML。最后,我们已使用NDoc来把它转换成编译的HTML帮助(CHM)。你可以看这个帮助文件,只需简单地在该方案的解决方案资源管理器中点击Hooks.chm文件或通过查找与该文相关的可下载的ZIP文件。 u30fb增强的智能感知:如果你不熟悉Visual Studio.NET怎样使用编译的XML文件(pre-NDoc output)来为参考库的工程增强智能感知,那么让我简单地介绍一下。如果你决定在你的应用程序中使用这个类库,你可以考虑复制该库的一个稳定构建版本到你想参考它的位置。同时,还要把XML文档文件 (SystemHooksManagedHooksinDebugKennedy.ManagedHooks.xml)复制到相同的位置。当你添加一个参考到该库时,Visual Studio.NET将自动地读该文件并使用它来添加智能感知文档。这是很有用的,特别是对于象这样的第三方库。 u30fb单元测试:我相信,所有的库都应有与之相应的单元测试。既然我是一家公司(主要负责针对.NET环境软件的单元测试)的合伙人和软件工程师,任何人不会对此感到惊讶。因而,你将会在名为ManagedHooksTests的解决方案中找到一个单元测试工程。为了运行该单元测试,你需要下载和安装 HarnessIt-这个下载是我们的商业单元测试软件的一个自由的试用版本。在该单元测试中,我对这给予了特殊的注意-在此处,方法的无效参数可能导致 C++内存异常的发生。尽管这个库是相当简单的,但该单元测试确实能够帮助我在一些更为微妙的情况下发现一些错误。 u30fb非托管的/托管的调试:有关混合解决方案(例如,本文的托管的和非托管的代码)最为技巧的地方之一是调试问题。如果你想单步调试该C++代码或在C++代码中设置断点,你必须启动非托管的调试。这是一个Visual Studio.NET中的工程设置。注意,你可以非常顺利地单步调试托管的和非托管的层,但是,在调试过程中,非托管的调试确实严重地减慢应用程序的装载时间和执行速度。 八、 最后警告 很明显,系统钩子相当有力量;然而,使用这种力量应该是有责任性的。在系统钩子出了问题时,它们不仅仅垮掉你的应用程序。它们可以垮掉在你的当前系统中运行的每个应用程序。但是到这种程度的可能性一般是很小的。尽管如此,在使用系统钩子时,你还是需要再三检查你的代码。 我发现了一项可以用来开发应用程序的有用的技术-它使用系统钩子来在微软的虚拟PC上安装你的喜爱的开发操作系统的一个拷贝和Visual Studio.NET。然后,你就可以在此虚拟的环境中开发你的应用程序。用这种方式,当你的钩子应用程序出现错误时,它们将仅退出你的操作系统的虚拟实例而不是你的真正的操作系统。我已经不得不重启动我的真正的OS-在这个虚拟OS由于一个钩子错误崩溃时,但是这并不经常。2023-06-09 13:30:351
protel99中可以将多个元件一起换层吗?
当然可以,但只能是同属性的器件2023-06-09 13:30:433
求教:SQL的@str是什么变量?举个例子,谢谢
2.如果把@STR的类型改成CHAR或者NCAHR都不可以,没有提示,就显示执行完成,为什么?因为 char 或者 nchar 是 固定长度的字符串, 不是 “可变长度的字符串”3.给@STR赋予值得时候,还必须是SELECT才能定义,SET不可以,而且赋予任何字符都可以执行,为什么?SET 是可以的,具体代码如下:1> declare @str nvarchar(1000), @k int2> SET @str="";3> SET @k=1;4> while(@k<=6)5> begin6> set @str = space(@k-1)7> set @str = @str + "****"8> print @str9> set @k=@k+110> end11> go**** **** **** **** **** ****1>2023-06-09 13:30:583
golang 怎么避免相互引用
在C语言中引用外部变量,一般使用extern关键字。举个例子如下://1.c 中定义一个变量g_aint g_a = 100;//2.c 中定义一个函数输出g_a#include <stdio.h>extern int g_a; //这里需要用extern说明g_a是一个外部全局变量void f() { printf("%d ", g_a);}//3.c main函数中调用f()void f(); //声明函数f()int main(){ f();}2023-06-09 13:31:191
gojs怎么获取节点的text
$(go.TextBlock,{click:function(e,obj){console.log(e.Y.$h.bb.key)}},)//加一个点击事件获取点击文本的相关属性,属性中就有你要的text2023-06-09 13:31:282
golang 根据接口判断是否有变量
在C语言中引用外部变量,一般使用extern关键字。举个例子如下: //1.c 中定义一个变量g_a int g_a = 100; //2.c 中定义一个函数输出g_a #include <stdio.h> extern int g_a; //这里需要用extern说明g_a是一个外部全局变量 void f() { printf("%d ", g_a); } //3.c main函数中调用f() void f(); //声明函数f() int main() { f(); }2023-06-09 13:31:371
如何在不同的Script文件之间共享全局变量
原型函数(由类的对象调用) testClass.prototype.walk = function(){ //只能访问:全局变量和全局函数 this.where = function(){ alert("Where can we go?"); go(); } var go = function(){ alert("go name:"+name); alert("go add(1,1):"+add(1,1)); } } </script> 下面看看如何调用: <script type="text/javascript"> //获取一个cbs类的实例 var cbs= new testClass(); //调用类的对象属性age alert("age:"+cbs.age); //获取类函数talk的实例 var talk = new testClass.talk(); //调用类函数的实例函数 talk.what(); //获取原型函数walk的实例 var walk = new cbs.walk(); //调用原型函数的实例函数 walk.where(); </script> 很2023-06-09 13:31:461
java中静态变量和静态方法分别有什么特点?
静态变量可以将静态变量理解为类变量(与对象无关),而实例变量则属于一个特定的对象。静态变量有两种情况:静态变量是基本数据类型,这种情况下在类的外部不必创建该类的实例就可以直接使用静态变量是一个引用。这种情况比较特殊,主要问题是由于静态变量是一个对象的引用,那么必须初始化这个对象之后才能将引用指向它。因此如果要把一个引用定义成static的,就必须在定义的时候就对其对象进行初始化。静态方法与类变量不同,方法(静态方法与实例方法)在内存中只有一份,无论该类有多少个实例,都共用一个方法。静态方法与实例方法的不同主要有:静态方法可以直接使用,而实例方法必须在类实例化之后通过对象来调用。在外部调用静态方法时,可以使用“类名.方法名”或者“对象名.方法名”的形式。实例方法只能使用后面这种方式。静态方法只允许访问静态成员。而实例方法中可以访问静态成员和实例成员。静态方法中不能使用this(因为this是与实例相关的)。2023-06-09 13:31:562
java中静态变量和静态方法分别有什么特点?
为什么问了两次?再贴上另一篇Thinking:Java中static用法- -Tag: Thinking:Java中s 一、static 请先看下面这段程序: public class Hello{ public static void main(String[] args){ //(1) System.out.println("Hello,world!"); //(2) } } 看过这段程序,对于大多数学过Java 的从来说,都不陌生。即使没有学过Java,而学过其它的高级语言,例如C,那你也应该能看懂这段代码的意思。它只是简单的输出“Hello,world”,一点别的用处都没有,然而,它却展示了static关键字的主要用法。 在1处,我们定义了一个静态的方法名为main,这就意味着告诉Java编译器,我这个方法不需要创建一个此类的对象即可使用。你还得你是怎么运行这个程序吗?一般,我们都是在命令行下,打入如下的命令(加下划线为手动输入):javac Hello.javajava HelloHello,world! 这就是你运行的过程,第一行用来编译Hello.java这个文件,执行完后,如果你查看当前,会发现多了一个Hello.class文件,那就是第一行产生的Java二进制字节码。第二行就是执行一个Java程序的最普遍做法。执行结果如你所料。在2中,你可能会想,为什么要这样才能输出。好,我们来分解一下这条语句。(如果没有安装Java文档,请到Sun的官方网站浏览J2SE API)首先,System是位于java.lang包中的一个核心类,如果你查看它的定义,你会发现有这样一行:public static final PrintStream out;接着在进一步,点击PrintStream这个超链接,在METHOD页面,你会看到大量定义的方法,查找println,会有这样一行:public void println(String x)。 好了,现在你应该明白为什么我们要那样调用了,out是System的一个静态变量,所以可以直接使用,而out所属的类有一个println方法。静态方法 通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法。如下所示:class Simple{ static void go(){ System.out.println("Go..."); }}public class Cal{ public static void main(String[] args){ Simple.go(); }} 调用一个静态方法就是“类名.方法名”,静态方法的使用很简单如上所示。一般来说,静态方法常常为应用程序中的其它类提供一些实用工具所用,在Java的类库中大量的静态方法正是出于此目的而定义的。静态变量 静态变量与静态方法类似。所有此类实例共享此静态变量,也就是说在类装载时,只分配一块存储空间,所有此类的对象都可以操控此块存储空间,当然对于final则另当别论了。看下面这段代码:class Value{ static int c=0; static void inc(){ c++; }}class Count{ public static void prt(String s){ System.out.println(s); } public static void main(String[] args){ Value v1,v2; v1=new Value(); v2=new Value(); prt("v1.c="+v1.c+" v2.c="+v2.c); v1.inc(); prt("v1.c="+v1.c+" v2.c="+v2.c); }} 结果如下:v1.c=0 v2.c=0v1.c=1 v2.c=1由此可以证明它们共享一块存储区。static变量有点类似于C中的全局变量的概念。值得探讨的是静态变量的初始化问题。我们修改上面的程序:class Value{ static int c=0; Value(){ c=15; } Value(int i){ c=i; } static void inc(){ c++; }}class Count{ public static void prt(String s){ System.out.println(s); } Value v=new Value(10); static Value v1,v2; static{ prt("v1.c="+v1.c+" v2.c="+v2.c); v1=new Value(27); prt("v1.c="+v1.c+" v2.c="+v2.c); v2=new Value(15); prt("v1.c="+v1.c+" v2.c="+v2.c); } public static void main(String[] args){ Count ct=new Count(); prt("ct.c="+ct.v.c); prt("v1.c="+v1.c+" v2.c="+v2.c); v1.inc(); prt("v1.c="+v1.c+" v2.c="+v2.c); prt("ct.c="+ct.v.c); }}运行结果如下:v1.c=0 v2.c=0v1.c=27 v2.c=27v1.c=15 v2.c=15ct.c=10v1.c=10 v2.c=10v1.c=11 v2.c=11ct.c=11 这个程序展示了静态初始化的各种特性。如果你初次接触Java,结果可能令你吃惊。可能会对static后加大括号感到困惑。首先要告诉你的是,static定义的变量会优先于任何其它非static变量,不论其出现的顺序如何。正如在程序中所表现的,虽然v出现在v1和v2的前面,但是结果却是v1和v2的初始化在v的前面。在static{后面跟着一段代码,这是用来进行显式的静态变量初始化,这段代码只会初始化一次,且在类被第一次装载时。如果你能读懂并理解这段代码,会帮助你对static关键字的认识。在涉及到继2023-06-09 13:32:063
什么是C语言缓冲区溢出漏洞?怎么利用?谁可以提供详细的资料
u300asmash the stack for fun and profitu300b2023-06-09 13:32:202
C++ extern 的问题
2023-06-09 13:32:292
易语言中如何清空所有全局变量和局部变量,因是繁索的计算,所以变量很多,挨着个清空相当麻烦。
连续赋值(a,变量1,变量2,变量3。。。)变量1,2,3等等必须是相同数据类型,如果为整数型,a可以为0,文本型就为“”,以此类推2023-06-09 13:32:361
matlab中函数m文件怎么看??
都有m文件了,Open 就看呗 补充一下(1) 菜单操作。从MATLAB主窗口的File菜单中选择Open命令,则屏幕出现Open对话框,在Open对话框中选中所需打开的M文件。(2) 命令操作。在MATLAB命令窗口输入命令:edit 文件名,则打开指定的M文件。 (3) 命令按钮操作。单击MATLAB主窗口工具栏上的Open File命令按钮,再从弹出的对话框中选择所需打开的M文件2023-06-09 13:32:444
ASP 中 session 的用法!
Session 对象可以使用 Session 对象存储特定用户会话所需的信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。有关使用 Session 对象的详细信息,请参阅“ASP 应用程序”部分的“管理会话”。注意 会话状态仅在支持 cookie 的浏览器中保留。语法 Session.collection|property|method集合 Contents 包含已用脚本命令添加到会话中的项目。 StaticObjects 包含通过 <OBJECT> 标记创建的并给定了会话作用域的对象。属性 CodePage 将用于符号映射的代码页。 LCID 现场标识。 SessionID 返回用户的会话验证。 Timeout 应用程序会话状态的超时时限,以分钟为单位。方法 Abandon 该方法破坏 Session 对象并释放其资源。事件 global.asa 文件中声明下列事件的脚本。Session_OnEnd Session_OnStart有关以上事件及 global.asa 文件的详细信息, 请参阅 Global.asa 参考.注释 您可以在 Session 对象中存储值。存储在 Session 对象中的信息在会话及会话作用域内有效。下列脚本演示两种类型的变量的存储方式。<% Session("username") = "Janine" Session("age") = 24 %>但是,如果您将对象存储在 Session对象中,而且您使用 VBScript 作为主脚本语言。则必须使用关键字 Set。如下列脚本所示。<% Set Session("Obj1") = Server.CreateObject("MyComponent.class1") %>然后,您就可以在后面的 Web 页上调用 MyComponent.class1 揭示的方法和属性,其调用方法如下:<% Session("Obj1").MyMethod %>也可以通过展开该对象的本地副本并使用下列脚本来调用:<% Set MyLocalObj1 = Session("Obj1") MyLocalObj1.MyObjMethod %>创建有会话作用域的对象的另一种方法是在 global.asa 文件中使用 <OBJECT> 标记。但是不能在 Session 对象中存储内建对象。例如,下面每一行都将返回错误。<% Set Session("var1") = Session Set Session("var2") = Request Set Session("var3") = Response Set Session("var4") = Server Set Session("var5") = Application %>在将对象存储到 Session 对象之前,必须了解它使用的是哪一种线程模型。只有那些标记为“Both”的对象才能存储在没有锁定单线程会话的 Session 对象中。详细信息, 请参阅“创建 ASP 组件”中的“选择线程模型”。若您将一个数组存储在 Session对象中,请不要直接更改存储在数组中的元素。例如,下列的脚本无法运行。<% Session("StoredArray")(3) = "new value" %>这是因为 Session对象是作为集合被实现的。数组元素 StoredArray(3) 未获得新的赋值。而此值将包含在 Application 对象集合中,并将覆盖此位置以前存储的任何信息。我们极力建议您在将数组存储在 Session对象中时,在检索或改变数组中的对象前获取数组的一个副本。在对数组操作时,您应再将数组全部存储在 Session 对象中,这样您所做的任何改动将被存储下来。下列的脚本对此进行演示。---file1.asp--- <% "Creating and initializing the array Dim MyArray() Redim MyArray(5) MyArray(0) = "hello" MyArray(1) = "some other string""Storing the array in the Session object Session("StoredArray") = MyArrayResponse.Redirect("file2.asp") %>---file2.asp--- <% "Retrieving the array from the Session Object "and modifying its second element LocalArray = Session("StoredArray") LocalArray(1) = " there""printing out the string "hello there" Response.Write(LocalArray(0)&LocalArray(1))"Re-storing the array in the Session object "This overwrites the values in StoredArray with the new values Session("StoredArray") = LocalArray %>相关解答:A页面需输入正确的用户名和密码后, 加条语句:session("isLogin")=true 在B页面前判断: if session("isLogin")=false then response.write "未登录" response.en end if这样就可以了登陆后设置: session("user")=用户名在B页面输入: if session("user")="" then Response.write("<script>alert("请登陆!");window.history.go(-1);</scritp>") end if2023-06-09 13:33:045
vb 跳转到不同过程中只运行其中部分,call和go to的结合?在线等!!!
你可以在call 的 过程代码中加一个条件 : if 条件 GOTO eeee: 表示在你要执行的地方做标记条件你可以随便表示,例如,设置一个全局变量a,当过程运行后a的值变为1.需要call 另外一个过程,可以在另外一个过程的第一句代码写 if a=1 goto …………2023-06-09 13:33:282
请帮忙改下VB程序,就是能让按goon时是继续上次的计时,而不是从最开始的时间计时。谢谢了!
在放一个timer n1 = Format(m Mod 60, "00.") n2 = Format((m 60) Mod 60, "00:") n3 = Format(m 3600, "00:") Label1.Caption =VAL( n3+ l(Label1.Caption 左2))& .....n2 & n1... & n0....2023-06-09 13:33:352
中学生清明节踏青作文
中学生清明节踏青作文5篇 我国的踏青习俗由来已久,传说远在先秦早已形成,每年春天,人们都要结伴到郊外游春赏景,至唐宋尤盛。下面我给大家带来中学生清明节踏青作文,希望大家能够喜欢。 中学生清明节踏青作文篇1 “清明时节雨纷纷,路上行人欲断魂。借问酒家何处有,牧童遥指杏花村。”每到清明节的时候,天空总是喜欢下雨。可能是因为清明节是祭祀先辈的日子,所以天公也变得情绪悲伤了吧。尽管天公不作美,也无法阻止我和妈妈寻找春天的迫切心情。 我和妈妈徒步前往北山,沿途经过一条小河。我高兴地朝着后面的妈妈大声喊道:“妈妈快看啊!一条小河。”妈妈微笑着用手指着河岸对我说:“瞧!小草已经悄悄地探出头来啦!”只见河水清澈见底,河面上还有一残冰。河水叮叮咚咚地流着,好像在唱着春天的赞歌。啊!原来春天在流淌的河水里。 不知不觉我和妈妈就来到了北山脚下。放眼望去,一条弯弯曲曲的小路直通山顶。踏着青石板,沿着小路向山顶攀登。妈妈用手指着小路两旁一些不知名的小树说:“宝贝!你看这些枝条已不像冬天那么干枯了,越发柔软了。枝杈上还有一些牙包,这就是春天的讯号。”我微笑着点点头,啊!原来春天就藏在树林里。 沿着小路继续向上走去。妈妈突然挺住了脚步蹲了下来,用手轻轻地拨开枯槁的落叶,一朵含苞欲放的小花呈现在我的眼前。黄色的花瓣,深绿色的叶子,红褐色的茎,在微风中摇曳着,美极了。我满心欢喜地说:“妈妈,这是什么花呀!这么漂亮?”妈妈笑眯眯地对我说:“这是春天大自然里开的最早的一种花,“冰凌花”,它不畏严寒,破冰而出,把春天的希望告诉给人们,它是春天的使者。”听了妈妈的话,我深深地点点头说:“我要做一个拥有“冰凌花”品格的人。”妈妈语重心长地拍拍我的肩膀说:“宝贝,加油!妈妈永远支持你。” 终于到达山顶了,低头俯视山下,楼房鳞次栉比,街道像一条条长龙,美丽极了,抬头仰望天空,一只只五彩的风筝在湛蓝的天空中自由自在的翱翔。啊!春天无处不在,已悄悄来到我们身边! 中学生清明节踏青作文篇2 “清明时节雨纷纷,路上行人欲断魂……”杜牧的《清明》又把我们带进了一个崭新的清明节,在节日里,大人们都为自己逝去的亲人扫墓、献花,显得失魂落魄,格外悲伤,而我们小孩子却是兴奋不已,逍遥自在。为什么?哈哈,节日可是我们小孩最喜欢的哟! 星期二的下午,天气晴朗,太阳公公似乎很喜欢这日子,微笑着向大地放射着温和的光线,云朵姐姐也在空中优雅地跳着芭蕾,不断地变化着形状呢!这么好的天气怎么能浪费了呢?当下,妈妈就决定带我和妹妹支爬附近的文峰山(笔架山)。我俩高兴及了。由于我喜欢探险,所以带了一大家堆用具,如手电筒、镊子、椎子、折叠小刀、螺丝刀、小铲子等等,差点没有把整个工具盒都带来了,走在路上“叮叮当当”地响,差点被路人看作铁匠,而妹妹,装了一大包零食,有那么一股小超市的味道。 我刚要踏上石阶,爸爸却神秘地一笑,对我说:“今天,我们要来真正体会一下爬山”,不等他说完,我和妹妹以迫不及待地奔向了没有石板路的密林,我步履为艰地往上爬,可却还是在“原地踏步”,我一急,捡了根树枝拄着就要往上爬,最后干脆手脚都用上了,双手支抓树枝,两只脚就找准时机去蹬石头,两手一拉,双脚一蹬,身体就如同电影里的快镜头一样窜了出去。忽然,一个松果以迅雷不及掩耳之势向我飞来,我一个闪身,飞扑到一边,那松果飞过去,砸在发地上,真是一波未平,一波又起,我那边刚躲过,这边又踩滑了,只觉得两耳生风,我把眼一闭,心想:完了,吾命休矣!来了个三百六十度旋转,掉在地上又向前平移了两米,与泥土来了个亲密接触,我一扭头,忽忽发现,有位少年正在祭拜我,我往下一看,原来我摔在了人家的坟墓上!惊骇得我三魂吓掉了两魂,两步一迈,脚底抺油似的冲上了大道,惊魂未定的看着捧腹大笑的爸爸,然后我们顺道而上,不一会就到了文峰塔下,我和妹妹手舞足蹈了好一会,才准备坐车回家。 夕阳包裹着落日渐去的身影,我们都意犹未尽,感概万千…… “清明时节雨纷纷”,然而,今年的清明节不知是因为祖宗的显灵,还是因为老天的赏脸,不再像往年那样细雨纷飞,清冷潮湿。春风送暖,春光明媚,人们迫不及待地带着喜悦的心情去踏青,怀着崇敬的思念去扫墓。由于我的老家在千里之外的福建,清明节无法回去祭拜祖先,于是,妈妈就带我到附近的绣衣公园踏青。 还没到公园门口,我就远远望见公园的上空有几只风筝在自由飞翔,它们同白云嬉戏,与小鸟赛飞,快乐无比,令人生羡。我连忙加快脚步来到了公园门口的小河边。只见两岸的垂柳亭亭玉立,柳树姑娘正用“风梳子”悠闲地梳理着又长又绿的辫子,她们以河为镜,翘首弄姿,风情万种。 一进公园门口,只见绿草如毡的草地上,孩子们奔跑打闹,玩耍嬉戏;大人们悄悄私语,亲切交谈;老人们挥拳舞剑,载歌载舞。他们似乎都听到了春姑娘的召唤,耐不住寂寞,不约而同来到了这里享受生意盎然的春天带给大家的无比惬意。草地边上那黄的,粉的,蓝的……彩缎似的花圃,一片片,一丛丛,正是那品种不一的鲜花在争奇斗艳。绽放的花朵,香气扑鼻,引来了勤劳的蜜蜂,招来了爱美的彩蝶。它们在花丛中穿梭忙碌,翩翩起舞,给春意正浓的公园更添了几分情趣。哦!风筝的主人原来是一群可爱的学生,他们正兴致勃勃,神情专注地收拉着风筝线,欢呼雀跃着在比赛谁的风筝飞得最高呢! 我被眼前的春光包围,被满园的春色打动。在这缅怀祖先,充满哀思的清明时节,人们将满怀的思念埋藏心底,正以积极乐观的心态面对生活,告慰西去的祖先。 中学生清明节踏青作文篇3 “淅沥沥,淅沥沥……” 第一场春雨来了,点缀着华尔兹舞步跳来了。春天踩踏着淡淡的节奏,伴随着潺潺绵绵的雨滴悄然降临并为我们捎来了一个特殊的节日——清明。“清明时节雨纷纷,路上行人欲断魂。”清明,人们自然而然的会平添几分忧伤,特别是在细雨霏霏的时节,我们更是难解忧。 可我们一家不舍得这么美好的春光,便一家去公园,寻找春的足迹。 春天的公园显得格外清爽。天湛蓝湛蓝的,像是一枚蓝宝石,刚刚被水洗过一般。周边的山是那样青,水是那样绿,如同步入“神话”的境界。小草也是刚刚苏醒过来的,总觉得刚刚渲染的绿似乎绿得出奇,青翠剔透,宛如翡翠一般。近出的小花一朵两朵,或浓或淡,或红或粉,仿佛是春姑娘不久前才涂上去的。那样的天笼罩着那样的山,那样的山围绕着那样的水,那样的水映衬着那样的花花草草。如诗如梦的境界,难道不像步入画一样的圣地吗?这里的一切都是那样诱人,一切都令人感到十分惬意! 这天,公园里似乎来了很多人,大概都是因为天气好的原因吧,还不到中午,车位都过半了。 人们都脱下了厚厚的棉袄,奔向草地间,嗅着春地气息,与春撞个满怀。我们听到的是春,看到的是春,闻到的是春,触到的是春。一个个都神采奕奕,满面红光,嘴角边也都洋溢着春的微笑。 中学生清明节踏青作文篇4 4月5日,清明节到来了。老天似乎很赏脸,清明节一改以往“雨纷纷”,变得晴朗,而路上行人呢,不再是“欲断魂”,都怀着喜悦去踏青,怀着崇敬的心情去祭奠。所以…… 车子多的非比寻常,我们等摆渡足足等了5个多小时,从凌晨6点等到中午11点多。结果外公外婆都等不及了,自己先开始扫墓,顺便“替”我们祭扫! 还好还好,总算有一家等我们一起祭扫。我在墓前鞠躬,默哀,望着墓碑上刻着的几个大字,心里就泛起了一种从未有过的悲酸。一阵风吹过把地上的焚烧尽了的灰烬卷起,吹进每个人的眼里,仿佛是在为我们掩盖眼眶中的晶莹…… 扫墓完毕,我们把那沉重的脚步换成了轻盈的步伐,踏青去喽! 其实下乡也有很多好处的!你看,这正是油菜花盛开的季节。一眼望去,金黄金黄的一大片。微风悄悄地走过,油菜花随风舞蹈。别和,浪漫的普罗旺斯的薰衣草田间比起来,别有一番风味! 无意间发现了一些满天星。那可是我的守护花朵呢!就像天上调皮的星星降临人间。故意隐藏自己的香味,隐藏自己的踪影。“呼……”深吸一口气,幽淡的花香,清新的空气,沁人心脾。这大概就是最简单的幸福! 清明节,祭奠的悲酸,踏青的欢笑…… 中学生清明节踏青作文篇5 清明节是我国的传统节日,他大约始于周代,已有两千五百多年的历史了。 清明节最开始是一个十分重要的节气,清明一到,气温升高,正是春耕春种的大好时节,所以有“清明前后,种瓜种豆”、“植树造林,莫过清明”的农谚。后来,由于清明与寒食的日子接近,而寒食是民间禁火扫墓的日子,渐渐地,寒食与清明就合二为一了。所以,清明节也是重要的祭拜祖先的节日,是祭祖和扫墓的日子。 按照旧的习俗,扫墓的时候,人们要携带酒食果品、纸钱等物品到墓地,将食物供祭在亲人墓前,再将纸钱焚化,为坟墓培上新土,折几枝嫩绿的新枝插在坟上,然后叩头行礼祭拜,最后吃掉酒食回家。 唐代诗人杜牧的诗《清明》:“清明时节雨纷纷,路上行人欲断魂,借问酒家何处有?牧童遥指杏花村。”写的就是清明节的特殊气氛。 清明节又叫踏青节。它是在每年阳历的4月5日,这正是春光明媚,草木吐绿的.时节,也正是人们春游的好时候,所以古人有清明踏青,并开展打马球、荡秋千、蹴鞠、插柳等一系列风俗体育活动的习俗。相传这是因为清明节要寒食禁火,为了防止寒食冷餐伤身,所以大家来参加一些体育活动,以锻炼身体。因此,这个节日既有祭扫祖坟生别死离的悲伤,又有踏青游玩的欢乐,是一个富有特色的节日。2023-06-09 13:24:031
清明节踏青作文
清明节踏青作文(精选15篇) 在学习、工作、生活中,大家都写过作文吧,作文根据体裁的不同可以分为记叙文、说明文、应用文、议论文。一篇什么样的作文才能称之为优秀作文呢?以下是我精心整理的清明节踏青作文,欢迎大家分享。 清明节踏青作文1 清明节即将来临,我们一家人准备去乡下踏青扫墓。这天,我起得特别早,吃完早餐就出发了。 路上,爸爸告诉我:“清明节是给已故的人扫墓的日子,是中华民族的传统节日。这一天,亲人们为了表达对他们的怀念,会准备好鞭炮和纸钱,来到墓前祭拜,希望他们能在天堂生活得幸福快乐。”原本就狭窄的乡间小路,今天显得特别拥堵,原来大多数跟我们一样也是来扫墓的。 不一会儿,我们就来到了一个墓场。这个墓场并不大,大概有三十多个墓。墓场周边是一大片一大片的农田,农田里金黄色的油菜花张开了笑脸,一眼望去,就像一片黄色的海洋。微风拂过,犹如海上掀起了金黄色的海浪。在油菜地的田埂上,还长有许多蒲公英,仿佛给黄色的花海镶上白色的花边,构成了一幅美丽的图画。 走到墓前,心情一下子沉重起来。我们将纸钱整齐地摆好,把香和鲜花插进土里,然后点燃纸钱和香。接下来我们一一给太爷爷太奶奶磕头,让他们保佑我们身体健康、平安幸福。磕完头后,爷爷开始放鞭炮。我害怕那声响,所以立马跑开摘蒲公英去了。 返程时,老天爷好像知道人们的心情似的,伤心的哭起来。豆大的雨点嘀嗒嘀嗒地落在屋檐上,这让我想起了唐代诗人杜牧的那首诗“清明节时雨纷纷,路上行人欲断魂……”这不正是扫墓人的心情写照吗? 清明节踏青作文2 清明节放假三天,天气难得的凉爽,我们一家打算去半岛公园踏青。 早上的半岛公园,清新的空气夹着青草的清香扑鼻而来,让人顿时清醒许多;花儿随风舞动,伸展着它修长的枝叶;钻石般的露珠顺着叶子上的纹理,一直滑到叶尖尖,才恋恋不舍地放开了手,落了下去。 瞧!有几只小鸟在树枝上“叽叽喳喳”地唱着歌,我想,它们是不是在开歌会呢! 那蔚蓝的天空罩着这小小的一块如爱丽丝仙境般的翡翠,不让它被外界的风沙染上丝毫尘埃,再用彩虹锁小心翼翼地把它锁上,视若珍宝。 我们来到了一个小湖边,我和妹妹兴奋地把鞋子一甩,立刻向湖边跑去。 嘿!湖边有好多小蝌蚪呢!密密麻麻的小黑点在水里快速地游动。我望着水面,想找一只符合我心意的小蝌蚪。看!水草里藏着一只比其他蝌蚪还要大好多的蝌蚪。“就它了!”我心里想着。看准时机!我快速地扑向那只蝌蚪,眼看就要成功了,嘿!小家伙还挺机灵!就在我快抓到它的那一秒,居然从我手下逃走了!我又试图进行第二次抓捕,我的眼睛死死地盯着目标,手再一次扑向那只大蝌蚪。哎呀!又扑了个空!那只大蝌蚪似乎已经不想再和我玩下去了,尾巴一甩,向湖中心游去。 我转头看了看正在一旁开心玩水的妹妹,蝌蚪正在一群一群地朝她游去。它们一来,她就戳,但是蝌蚪还是不依不饶地朝她那个方向游去,妹妹开心地笑了…… 看着妹妹开心的笑脸,我也笑了。能在这个犹如仙境的地方玩,真好! 清明节踏青作文3 “清明时节雨纷纷”,清明节这一天,细雨绵绵下个不停。渲染了迷蒙黯然的气氛,给人带来忧愁与悲伤。我与爸爸妈妈因为思念家乡,便一起到美丽的乡村踏青。 一路上,春景明朗绚丽,生机盎然。让我们倍受感染,我不禁低吟:“千里莺啼绿映红,水村山郭酒旗风。”奏的山村,千里大地花红柳绿,莺歌燕舞,郁郁葱葱的树林绿遍了山陵与原野稻田里的水色映着天空的光辉,呈现出一片白色。山间到处鸣响着鸟儿欢快清脆的叫声,蒙蒙的细雨如烟似云,轻轻地飘洒着,这真的是“绿遍山原白满川,子规声里雨如烟”啊!我们欣赏着美景,兴致勃勃地前进着。这时,两个天真烂漫的孩子映入了我们的眼帘,他们在路边追逐打闹,在与煦的东风中放起了风筝。“儿童散学归来早,忙趁东风放纸鸢。”我吟诵诗句,这两个活泼的孩子给美好的春天平添了几分生机。 “黄四娘家花满蹊,千朵万朵压枝低。留连戏蝶时时舞,自在娇莺恰恰啼。”我们走进农家的花园,美丽的景色让我们惊叹。小路两旁开满了鲜花,压得花枝都弯下了腰。游戏的蝴蝶在花丛中时来时往,盘旋飞舞,依恋着不愿离去。自由自在的黄莺在树上发出娇柔的鸣叫,声音是那么与谐动听,这种境界,既使人惊叹,又叫人舒服。 我们又来到田野,真的是“离离原上草,一岁一枯荣”。田野上长得茂盛的野草,每年一度枯荣,又一度繁荣,春风吹来,它们生机勃勃地生长着,充满了生气。“天苍苍,野茫茫,风吹草低见牛羊”。田野无边无际,一阵清风吹过,草儿低伏下去,显现出成群的牛羊,给静寂的田野增添了无限乐趣! 今天,清明踏青让我体会到了农村简朴而富有乐趣的生活,农村就是多么的美好,四月的乡村,到处呈现着别样的风景。 清明节踏青作文4 春天,万物生长的季节,景色也是最美的时候。说到春天,你能想到什么呢?绿的、青的、红的、黄的。各种各样,不过春最多的还是绿色,没错,让我们在这美丽的.季节,携手去踏青。 这个清明,我正和爷爷去踏青。那天早晨,我刚起床,便感到一股一阵清爽,在老家,我仿佛从微波炉到冰箱里。早晨我起来,发现家里山上的树,都换上春的衣裳,脱下冬的旧装,我又知道这个时候最适宜种下植物。我便拿起工具,拿着种子,跟爷爷上山玩去。 山上的空气更加清爽,让人充满干劲。我们走到一片松树林,松针上满满的都是晶莹剔透的露水。松树下面还有嫩绿的小草,而看上面一闪一闪的水珠,竟一不小心碰到松树,树上的水珠撒我一身。这水特别清凉,让人很舒服。我和爷爷边走边观赏一边的风景,我们看到一颗不知道什么树,它应该有好几年。它有着如同火焰一般的红色叶子,开着如同洁白碧玉一般的花朵,闻着淡淡的花香,我仿佛把它比作成花朵中的贵族。转眼,我们看到一片柳树,那是几年前所种下的。,我便拿出我的种子,挖开一小片土,把它放进去。“种子,你快发芽长大吧。”为能认出它,我在他旁边放一块石头。 春天,万物生长的季节,景色也是最美的时候。说到春天,你能想到什么呢?绿的、青的、红的、黄的。各种各样,不过春最多的还是绿色。没错,让我们在这美丽的季节,携手去踏青。 清明节踏青作文5 今天是礼拜天,早上还下了几滴雨,而到了九点多天空开始放晴,春风拂面,和煦的阳光开始普照大地,让人感到暖融融的,顿觉神清气爽。今天真是一个去户外游玩的好日子。 在我的倡议下,爸妈也放下手头的琐事,我们一齐向城外出发。离开了喧闹嘈杂的县城,来到田野里,顿觉空气清新了许多。脚下便是大片大片的绿油油的麦田。初春以来,天气连续晴好,麦苗也尽扫严冬的萎靡,一派长势繁荣的景象,旁边的一块油菜也抽出新苔,走近一看,那新长的菜苔,像一根根翡翠雕琢的绿玉杖。远处村头柳枝,也被春风吹得柔柔的,绿丝绦在微风中翩翩起舞,仿佛欢迎我们全家去村里做客。此时,不远处的树林的小鸟也辗转圆润的歌喉,开始呼朋引伴,给初春平添许多生机。 我们全家就这样在田野里信步走着、玩着,爸妈都被这春天的景色所陶醉,只有我一会儿蹦蹦跳跳,一会儿在地上打个滚。不经意间,我们来到一条小河边,河堤上的小草猛一看还是枯黄的,但在草根处,有些鹅黄色的嫩芽偷偷探出头来,星星点点的。河里的冰早已溶化,河水开始变得清澈,浅处,一眼就能看到河底的泥沙。水草也变柔软许多,随着流水左右摇摆,还有好多小鱼在其间嬉戏。 春日的一切,都显得那样的生机勃勃。我爱这美丽的春天! 清明节踏青作文6 还是春回大地,还是百花盛开,还是青烟缕缕,还是愁绪牵牵。却是,又一年的光景,又一年的清明! 以往的以往,清明是烈士陵园里的红色教育,是学校里数着日历巴望着的假期;之后,清明是奔波在四处采访的路上,是去古园探望外公的伤感;而如今,清明化作相思雨,成就了我心头浓浓的乡愁。 也许每个人心中都有对乡愁的独特注脚,它可能是古树、池塘、老井以及涓涓细流、山川草甸承载着的儿时记忆,也可能是长大后魂牵梦萦的家乡味道……,如今,当那些飞檐翘角的古建、潺潺流水的浣洗、炊烟袅袅的舍院、小巷悠悠的青石板依稀出此刻梦里,你是否有莫名的感动好梦总是不愿醒,旧时风物在梦的光影里此消彼长,甚至比记忆中的经历更顽固、更执着、更诱人!是否还记得余光中那首《乡愁》:“小时候,乡愁是一枚小小的邮票,我在这头,母亲在那头……而此刻,乡愁是一湾浅浅的海峡,我在这头,大陆在那头。”这样的心绪离愁,似乎是硬要长大一点才能感同身受。 时间是一条缓慢而不更改的长河,心是坐在渡船上的孩童。唱歌、睡眠。欢笑、掉泪。看望风景,相见和告别。 来美之后,人生有如分水岭,与国内的充实忙碌不一样,那里风和景明、人情简单、日子清淡。每逢传统节日,基本都一视同仁,惯于平波度,亦不会起波澜。虽贪得一世清净,却也常常想念曾有亲人夜话,朋友扎堆。 月初,刚送母亲回国,我的内心盛满不舍。回想有她在的日子,我们一齐打理小院,养花种菜,闲时散步,聊天谈心。除此以外每一天都有享不尽的家乡味道,手工馒头、豇豆肉包、卤牛肉、小炒辣子鸡……对于一个没厨艺却空有一颗吃货之心我来说,好似老鼠掉进了米缸,而妈妈的味道与我,是亲情、是分享、也是归属感。 清明节踏青作文7 今年清明节,我们全家到野外踏青。 经过1小时的车程,终于到达广州郊外。一下车,清新的空气迎面扑来,放眼望去,青青的草坪和清澈见底的小溪真是“人间仙境”。外婆让我们把野餐布铺好,就催促我们去那边玩了。 我和母亲、外公爬到了不远的小山坡。山坡上草木丛生,清脆婉转的鸟鸣声不时地传来,外公听了,跟着鸟儿轻声哼起小曲儿来。 从山坡上下来,我们又来到了小溪旁,小溪虽不显眼,但是却处处透露着生机。看,活泼的鱼儿们时而在水里欢快地畅游着,时而忽然跃起,时而吐出一串珍珠般的白泡泡。小溪旁有一片辽阔无垠的草地,上面藏着肥沃的青草,以前我经过这里时,上面已经没有草了,但是现在又似这么茂盛,真是“野火烧不尽,春风吹又生”啊! 这时,外婆在远处招呼我们去吃东西。当我们跑回“大本营”时,大吃一惊,野餐布上有各种各样的美味:可口的零食,甜蜜蜜的饮料,装在保温桶里的鸡汤……哇,野餐布中间还有几支新鲜娇嫩的粉红小花呢!我食欲大开,三下两下吃完后,便好奇地问外婆:“那些花儿是从哪儿来的?”外婆用手一指身后的草丛,说:“你拨开草好好看看吧。”我扒开草仔细一看,原来,这一片不起眼的草丛下竟有如此绚丽的风景,这竟是一大撮艳丽野花的藏身地!顿时,我不禁对大自然产生了敬佩之情。 美妙的时光总是让人享受,我们有说有笑,沉浸在这迷人的“人间仙境”中。两小时后,我们不得不收拾好行装,依依不舍地向大自然告别了。 清明节踏青作文8 清明节来到了,我和小表妹一起去郊外踏青。看,那水平如镜的河面被瑰丽的朝霞渲染着,银光闪闪,多么绮丽。河边,那一棵棵柳树翠欲流,婀娜多姿,纤细如指的柳条抚摸着河面。远处的那个桃园里的桃花全都盛开了,从远处看,真像一片红云降落人间,扑鼻而来的花香在寂静的桃园里飘散。 在离桃园不远的地方是一片雪白的梨花,有的已经盛开了,像一个个展开双臂拥抱春天的白衣天使;有的还是花骨朵儿,像一位位蒙着面纱、害羞的少女不愿让游客看到她的“庐山真面目”。啊!春是朝气蓬勃的,像喷薄的朝阳。 啊!春是充满希望的,像初生的圆日。 清明节假期爸爸妈妈带我一起出去玩,我们周六一大早6:30就和我的好朋友苗苗一起出发了。我们走西汉高速先去子午银滩玩,那里有山有水还有一大片沙滩,我和苗苗在沙滩上挖了好深好深的坑,太费体力了。 昨天我们先去后柳水乡,那里有好大一片湖,人家把我和苗苗装到一个很大的气球里面,我们在里面狂跑,气球就在水面滚动,可好玩了,下午我们又返回了子午银滩,这次我们就住在那里,到了晚上我们还吃烧烤,这次烧烤都是我们小朋友烤,爸爸妈妈吃。 今天我们又去骑沙滩车了,把我爸手机都给颠掉了,然后我们吃完中午饭就回家了,还好路上没有堵车,太累了! 清明节踏青作文9 学完了唐朝诗人杜牧的名句“清明时节雨纷纷,路上行人欲断魂”,让我知道了清明节这一天通常会是阴雨绵绵,但是20xx年的清明节----四月四日,确是一个阳光明媚的春天,爸爸、妈妈、我一家人像往常一样怀着一丝淡淡忧伤的心情踏上了扫墓之路。 透过车窗看着外面熙熙攘攘的人群和红灯前静静等待如长龙一般的车流,我不禁想到一个问题:我每年给外婆和姨妈她们烧了那么多的纸钱,她们真的收到了吗?她们那里也有超市吗?妈妈总说她们在天堂里,但是天堂在那里?在天上还是一个神秘的地方?……翻遍了那么多的书籍都找不到答案。 我们来到了外婆的墓前,外婆的墓地旁边长出了一些新的小树苗和小草,妈妈说:“这些小树苗长得真不错,但是杂草太多了,我们把它清理一下吧!”,说完我们就动手把墓地旁的杂草清理了。接着舅伯把买好的纸钱给每个人都发了一份,拿出打火机点燃了几张黄纸,由于风很大,点了几次都被吹灭了,幸好舅妈带了一把伞,挡住了风,纸钱终于燃烧了起来了,几个大人烧完了就轮到了我,一边烧纸钱一边心里在对外婆说:“您在天堂过得好吗?我是您没见过面的外甥女,我烧的纸钱您收到了吗?”烧完纸钱后我给外婆磕了磕头,并暗暗地许了一个愿望:外婆外婆请一定保佑我身体健康,学习进步,考试考一个好成绩!” 在回来的路上,我又问了妈妈关于天堂的问题,妈妈语重心长地说:虽然外婆、姨妈她们不能够复活,但是他们可以永远地活在我们的心里。我们活着的人一定要努力的工作、学习,珍惜自己的时间和生命。 是啊!在这个没有下雨的清明节,我终于懂得:我们活着的人一定要让自己活得有意义和幸福,才是对那些逝去的亲人们的最好的缅怀! 清明节踏青作文10 清明节假期期间,妈妈和爸爸带我一起去野餐,感受春天的气息。对郊游的渴望,兴奋的家人整理必要的物品,一大早出发。(另一方面)。迈着轻快的步伐哼着熟悉的曲调向郊外走去。路上先跟我打招呼的是“春风姑姑”。她用略微湿润的呼吸轻轻拂过我的脸,突然感到无比舒适。她用手抚摸我的头发,微笑着欢迎来到春天的世界。太阳公公今天难得地展现出他的慈爱和光彩,将金色的碎片洒在世界上,洒在每个人的胸口,将春天的温暖融化到世界各地。当我感受到阳光,正在洗澡的时候,银铃般的鸟儿的叫声唤醒了我醉了。就像对我说“快点!”好像在说。跟我来,前面的景色更完美!”“。跟着鸟儿的歌声,很快就到达了目的地。果然,与城市的喧嚣相比,那里的自然景色显得非常鲜明和宁静。原来澎湃的心境瞬间平静下来。沿着路边走着,一棵小草随着我们的脚步偷偷从地下钻了出来,好像等不及要和我们一起分享这美丽的景色了。,望着前方,展开了绿色的草地。一刮风就沙沙作响。“春天好,春天好。”草地两边的柳树是青的,柳树随风摇曳,挥手向春天致敬。在柳树下的绿草中,野花用笑脸、红色、白色、黄色、五彩六色装饰绿色,格外好看。抬头一看,天边飘着几朵白云,向我们招手,向我们微笑。蓝天、白云、金色的阳光照耀着绿地和我们幸福的微笑,时间的美景原来如此!我觉得世界上还有什么比自然更美丽呢?现在能比我们更幸福吗?珍惜这一刻,我会努力学习,天天向上! 清明节踏青作文11 “清明时节雨纷纷”,清明节这一天,细雨绵绵下个不停。渲染了迷蒙黯然的气氛,给人带来忧愁和悲伤。我和父亲母亲由于思念家乡,便一起到漂亮的乡村踏青。 一路上,春景明朗绚丽,生机盎然。让我们倍受感染,我不禁低吟:“千里莺啼绿映红,水村山郭酒旗风。”奏的山村,千里大地花红柳绿,莺歌燕舞,郁郁葱葱的树林绿遍了山陵和原野稻田里的水色映着天空的光辉,呈现出一片白色。山间到处鸣响着鸟儿欢快清脆的叫声,蒙蒙的细雨如烟似云,轻轻地飘洒着,这真是“绿遍山原白满川,子规声里雨如烟”啊!我们欣赏着美景,兴致勃勃地前进着。这时,两个天真烂漫的孩子映入了我们的眼帘,他们在路边追逐打闹,在和煦的东风中放起了风筝。“儿童散学归来早,忙趁东风放纸鸢。”我吟诵诗句,这两个活泼的孩子给美好的春天平添了几分生机。 “黄四娘家花满蹊,千朵万朵压枝低。留连戏蝶时时舞,自在娇莺恰恰啼。”我们走进农家的花园,漂亮的风景让我们惊叹。小路两旁开满了鲜花,压得花枝都弯下了腰。游戏的蝴蝶在花丛中时来时往,盘旋飞舞,依恋着不愿离去。自由自在的黄莺在树上发出娇柔的鸣叫,声音是那么和谐动听,这种境界,既使人惊叹,又叫人舒服。 我们又来到田野,真是“离离原上草,一岁一枯荣”。田野上长得茂盛的野草,每年一度枯荣,又一度繁荣,春风吹来,它们生机勃勃地生长着,充满了生气。“天苍苍,野茫茫,风吹草低见牛羊”。田野无边无际,一阵清风吹过,草儿低伏下去,显现出成群的牛羊,给静寂的田野增添了无限乐趣! 今日,清明踏青让我体会到了乡村简朴而富有乐趣的生活,乡村是多么的美好,四月的乡村,到处呈现着别样的风景。 清明节踏青作文12 清明节墓碑祭祀,那场急匆匆的细雨应勾起清明节所有记忆。”清明时节雨纷纷,路上行人欲断魂“伴随着这首千古流传的诗篇,我们与时事一起哀悼…… 一路上众草丛生,空气异常的凝重,象积满了灰尘的古屋,凝重、凄清。微风在树枝上缠绕着,象是淘气的孩子,弄得早春的嫩叶瑟瑟发抖。一切都显得如此潮湿、幽静。 今天来到目的地,这里到处野草丛生,看不清脚下的路,慢慢地进入我眼帘的便是太爷爷的坟地。首先,我作为晚辈来到了太爷爷的坟前,将腰弯成90度,郑重的为它老人家深切的鞠上一躬。只见坟边长满了许多无名杂草,去年贴的已被雨水洗得发白的纸钱七零八落的贴在四周,爷爷拿出新的纸钱,点上明火,用它那双苍老而有力的手捏住纸钱,由内向外的轻轻一甩,在树木的映照下划出了一道深深的弧线,这弧线而苍劲而软弱,以凄凉的姿态落入着团熊熊的烈火,以表达我们对先人的赤子之心。回望往事,时光却无法回头,但因为有你们的存在,让这个平凡的家变得更惹人喜爱;正因为那一句句谆谆教诲,才让我们懂得了做人的道理,让这中华礼仪代代传承,发扬光大!以这种方式和心态,我走过了一个个先人的坟墓。云层散开,留下的是一缕温暖的阳光,小鸟展开了歌喉,在树梢为中华儿女的感恩精神放声歌唱! 火苗依然在闪耀,陪伴它的还有那无边的夕阳。我们久久站在墓地,不愿与亲人分离,谁也不知道先祖会在何方。留下的除了悲伤,还有那挥之不去的永远的精神阳光。 时光不会停留,让清明礼赞生命,仿佛是一种温暖。愿这种温暖象春阳一样照进每个人的心田…… 清明节踏青作文13 三四月份正是踏青的好日子,今天爸爸妈妈就带我去沙塘港踏青。 到了,到了!来到乡下的我,如小鸟一般,东蹦蹦,西跳跳,尽情地呼吸着清新的空气,心里有说不出的欢愉!三月中下旬油菜花开得正盛,向田野望去,黄占据了一大半,那油菜花长得“壮”极了,直到我小腿处,一个个探着黄灿灿的小脑袋随风舞蹈。站在油菜花中,我仿佛也成了油菜花中的一员,吸收着太阳的光辉,品尝着露珠的清甜。我在田埂间奔跑着,跳跃着,小心地注意着不踩着花儿、苗儿,我又像是大花园中的一位花仙子,沉浸在花的海洋中! 再往前走便是菜地了,各种各样的菜绿油油的,在田中蓬勃生长着。看,那菠菜多大呀,它穿着一件绿色的晚礼服,脸庞还被胭脂抹红了呢;瞧,那又细又长的金花菜郁郁葱葱,真是惹人喜爱;最大的“霸主”还要数大白菜,看它挺直了腰板儿,卷着波浪头,时髦地站在那儿,跟别的菜一比,活脱脱是一个巨人…… 太湖最近的地方,静静聆听着波涛拍岸的声音,心中的烦躁似乎也被磨平了,好像人也融在了这湖天之间。抬头远望几个渔人正驶着小船向远处进发,在迷雾中若隐若现。 沙塘港最引人注目的莫过那几棵参天大树了,那大树叫做金丝楠木,要几人才能围抱住它,它高极了,五个我也比不及它,我在它身旁留影纪念,愿留下这美好的时光。 春天,真是个踏青的好季节! 清明节踏青作文14 时至四月,百花竟艳,岁月已不再凄寒。期待已久的清明节已悄然来临,这叫我的心能不激动吗? 古诗有云:清明时节雨纷纷。可今天下午,天气晴朗,微风拂面,给人一种轻松的感觉,我在爸爸妈妈的陪伴下到公园游玩。 到了公园,哇塞,公园里人山人海,有老人,有小孩,有大人等等。公园里好玩的项目也有很多;套圈、钓鱼、摩天轮、开小车、骑马、打地鼠......每个游乐项目前都挤满了人。他们喊着叫着,玩的特别开心。忽然一阵欢呼声把我的视线吸引了过去,我急忙拉着爸爸妈妈的手过去看,原来是很多人在套圈。一个小孩套着了一只关在笼子里的小鸟。人们在为他欢呼。看到地上摆着的千奇百怪的玩具,我的心里直痒痒。套圈必须全套上才可以拿走。我行吗?试试看,妈妈鼓励我说。我接过三十个圈,心里有点紧张。旁边的人们为我加油,教给我一些方法。嗖的一声,第一个圈飞出去了,没套着。接连几个都碰到边缘,那也不算。三十个圈套完了一个也没套上,有点灰心。 接着我又和爸爸坐摩天轮。我们坐好以后阿姨按开按扭,摩天轮就慢慢地转起来,摩天轮越转越高,我的心也越提越高,像要蹦出来一样。慢慢地摩天轮又转下来了,我的心才回到他原来的地方。 然后我们又玩了开小车,看了他们钓金鱼,不知不觉太阳就要落山了,我依依不舍的离开了公圆。 清明节踏青作文15 清明节的早晨,阳光明媚,万里无云是个踏青的好日子。 我们出发了,路边的花草树木都开了,迎春花开出了黄色的花,大树妈妈瞬间也变绿了,好像穿了一件绿袍子,大地开满了五颜六色的花。 到了目的地,我看见一个超大的土疙瘩,上面有很多已经去世过的人,清明节就是要纪念自己家的人。 我们顺着一条又窄又陡的小路上,我们不停地向上爬,终于看见了我们的太爷爷,然后拿一些钱摆在太爷爷的坟前面,再给旁边摆一些橘子,再给上面放一些面包,在拿打火机把钱一烧,我们见人还说了一句:“祝我们的太爷爷,太奶奶身体健康,万事如意!”于是,我的爸爸说:“一鞠躬,二鞠躬,三鞠躬。”这代表尊敬的意思。然后,还给旁边插了一些蜡烛。我希望太爷爷和太奶奶能看到我们对他的这份爱。 烧完了纸,我们和爸爸准备爬这个大土疙瘩,我们使劲的爬呀,到了中间,有一些带刺的草把我的手给弄伤了,但是是坚持了下来,最终,还是到了山顶,从上向下看,人就和小马一样,车和毛毛虫一样。 到了回家的路上,我看见了好几个洞穴,我就问爸爸:“这几个洞穴是干什么的?”爸爸笑着回答说:“过去,野人就在里面生存。”哦,原来是这样啊! 到了家,奶奶给我们一人做了一碗凉皮儿,我们吃的津津有味,一碗不够还得再来一碗呢! 好不容易有一个清明节呀!见太爷爷,太奶奶也不容易呀!谁让时间过得这么慢,希望时间能快一点,耶!2023-06-09 13:23:391