<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[独木舟 - Coding]]></title>
<link>https://kanoe.cn/</link>
<description><![CDATA[我的IT生活]]></description>
<language>zh-cn</language>
<copyright><![CDATA[Copyright 2005 PBlog3 v2.8]]></copyright>
<webMaster><![CDATA[master@kanoe.cn(独木舟)]]></webMaster>
<generator>PBlog2 v2.4</generator> 
<image>
	<title>独木舟</title>
	<url>https://kanoe.cn/images/logos.gif</url>
	<link>https://kanoe.cn/</link>
	<description>独木舟</description>
</image>

			<item>
			<link>https://kanoe.cn/article/coding/233.htm</link>
			<title><![CDATA[C语言二进制文件读写（Binary I/O)实例]]></title>
			<author>master@kanoe.cn(独木舟)</author>
			<category><![CDATA[Coding]]></category>
			<pubDate>Fri,17 Feb 2012 13:31:41 +0800</pubDate>
			<guid>https://kanoe.cn/default.asp?id=233</guid>
		<description><![CDATA[经常遇到这样的问题。由于二进制文件没有ASCII方式的直观性，所以读写时调试起来比较麻烦。用C语言读写文件的好处之一是比C++的I/O库快（如果做过ACM应该会有这样的体验），此外C语言读写只需要简单的几个库函数，如fopen(),fclose(),fwrite(),fread(),fsanf(),fprintf()，其中fsanf()和fprintf()用于ASCII文件的读写，fwrite()和fread()用于二进制文件的读写。以下是一个小小的实例总结：<br/><br/>typedef struct tagPoint<br/>{<br/>double x,y,z;<br/>}Point;<br/><br/>设有结构体：Point plist[100];<br/><br/>文件：file.dat<br/><br/>file.dat中的数据和结构体数组plist中的数据组织方式一致。<br/><br/>现在我们的任务是：<br/><br/>1、将文件file.dat中的数据读到plist中<br/><br/>2、或者将plist中的数据写到文件file.dat中。<br/><br/>读：<br/><br/>FILE *fp = fopen(&#34;file.dat&#34;,&#34;r&#34;);<br/><br/>fread(plist,sizeof(Point),100,fp);<br/><br/>fread的返回值为实际读入的结构体Point的元素个数。<br/><br/>写：<br/><br/>&nbsp;&nbsp; FILE *fp = fopen(&#34;file.dat&#34;,&#34;w&#34;);<br/><br/>fwrite(plist,sizeof(Point),100,fp);<br/><br/>fread的返回值为实际写入的结构体Point的元素个数。<br/><br/>简单吧，fread和fwrite的参数完全一样。在实际进行文件读写之前，应该先弄清文件数据的数据结构，这样就可以根据数据结构来设计与文件数据一致的结构体，一次性读入或写入数据。而不需要每次从二进制文件中读写一小块儿数据，从而避免出错，同时也避免多次的循环读写，加快读写速度。<br/>]]></description>
		</item>
		
			<item>
			<link>https://kanoe.cn/article/coding/231.htm</link>
			<title><![CDATA[[转] 如何在C语言中巧用正则表达式]]></title>
			<author>master@kanoe.cn(独木舟)</author>
			<category><![CDATA[Coding]]></category>
			<pubDate>Sat,27 Aug 2011 03:18:25 +0800</pubDate>
			<guid>https://kanoe.cn/default.asp?id=231</guid>
		<description><![CDATA[看到大家讨论这方面的东西，作点贡献聊表各位高手对这个版快的无私奉献&nbsp;&nbsp;<br/><br/>如果用户熟悉Linux下的sed、awk、grep或vi，那么对正则表达式这一概念肯定不会陌生。由于它可以极大地简化处理字符串时的复杂度，因此现在已经在许多Linux实用工具中得到了应用。千万不要以为正则表达式只是Perl、Python、Bash等脚本语言的专利，作为C语言程序员，用户同样可以在自己的程序中运用正则表达式。 <br/><br/>标准的C和C++都不支持正则表达式，但有一些函数库可以辅助C/C++程序员完成这一功能，其中最著名的当数Philip Hazel的Perl-Compatible Regular Expression库，许多Linux发行版本都带有这个函数库。 <br/><br/>编译正则表达式 <br/><br/>为了提高效率，在将一个字符串与正则表达式进行比较之前，首先要用regcomp()函数对它进行编译，将其转化为regex_t结构： <br/><br/>int regcomp(regex_t *preg, const char *regex, int cflags);<br/><br/><br/><br/>参数regex是一个字符串，它代表将要被编译的正则表达式；参数preg指向一个声明为regex_t的数据结构，用来保存编译结果；参数cflags决定了正则表达式该如何被处理的细节。 <br/><br/>如果函数regcomp()执行成功，并且编译结果被正确填充到preg中后，函数将返回0，任何其它的返回结果都代表有某种错误产生。 <br/><br/>匹配正则表达式 <br/><br/>一旦用regcomp()函数成功地编译了正则表达式，接下来就可以调用regexec()函数完成模式匹配： <br/><br/>int regexec(const&nbsp;&nbsp;regex_t&nbsp;&nbsp;*preg,&nbsp;&nbsp;const&nbsp;&nbsp;char *string, size_t nmatch,regmatch_t pmatch[], int eflags);<br/>typedef struct {<br/>&nbsp;&nbsp;regoff_t rm_so;<br/>&nbsp;&nbsp;regoff_t rm_eo;<br/>} regmatch_t;<br/><br/><br/><br/>参数preg指向编译后的正则表达式，参数string是将要进行匹配的字符串，而参数nmatch和pmatch则用于把匹配结果返回给调用程序，最后一个参数eflags决定了匹配的细节。 <br/><br/>在调用函数regexec()进行模式匹配的过程中，可能在字符串string中会有多处与给定的正则表达式相匹配，参数pmatch就是用来保存这些匹配位置的，而参数nmatch则告诉函数regexec()最多可以把多少个匹配结果填充到pmatch数组中。当regexec()函数成功返回时，从string+pmatch[0].rm_so到string+pmatch[0].rm_eo是第一个匹配的字符串，而从string+pmatch[1].rm_so到string+pmatch[1].rm_eo，则是第二个匹配的字符串，依此类推。 <br/><br/>释放正则表达式 <br/><br/>无论什么时候，当不再需要已经编译过的正则表达式时，都应该调用函数regfree()将其释放，以免产生内存泄漏。 <br/><br/>void regfree(regex_t *preg);<br/><br/><br/><br/>函数regfree()不会返回任何结果，它仅接收一个指向regex_t数据类型的指针，这是之前调用regcomp()函数所得到的编译结果。 <br/><br/>如果在程序中针对同一个regex_t结构调用了多次regcomp()函数，POSIX标准并没有规定是否每次都必须调用regfree()函数进行释放，但建议每次调用regcomp()函数对正则表达式进行编译后都调用一次regfree()函数，以尽早释放占用的存储空间。 <br/><br/>报告错误信息 <br/><br/>如果调用函数regcomp()或regexec()得到的是一个非0的返回值，则表明在对正则表达式的处理过程中出现了某种错误，此时可以通过调用函数regerror()得到详细的错误信息。 <br/><br/>size_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size);<br/><br/><br/><br/>参数errcode是来自函数regcomp()或regexec()的错误代码，而参数preg则是由函数regcomp()得到的编译结果，其目的是把格式化消息所必须的上下文提供给regerror()函数。在执行函数regerror()时，将按照参数errbuf_size指明的最大字节数，在errbuf缓冲区中填入格式化后的错误信息，同时返回错误信息的长度。 <br/><br/>应用正则表达式 <br/><br/>最后给出一个具体的实例，介绍如何在C语言程序中处理正则表达式。 <br/><br/>#include &lt;stdio.h&gt;;<br/>#include &lt;sys/types.h&gt;;<br/>#include &lt;regex.h&gt;;<br/><br/>/* 取子串的函数 */<br/>static char* substr(const char*str, unsigned start, unsigned end)<br/>{<br/>&nbsp;&nbsp;unsigned n = end - start;<br/>&nbsp;&nbsp;static char stbuf[256];<br/>&nbsp;&nbsp;strncpy(stbuf, str + start, n);<br/>&nbsp;&nbsp;stbuf[n] = 0;<br/>&nbsp;&nbsp;return stbuf;<br/>}<br/>/* 主程序 */<br/>int main(int argc, char** argv)<br/>{<br/>&nbsp;&nbsp;char * pattern;<br/>&nbsp;&nbsp;int x, z, lno = 0, cflags = 0;<br/>&nbsp;&nbsp;char ebuf[128], lbuf[256];<br/>&nbsp;&nbsp;regex_t reg;<br/>&nbsp;&nbsp;regmatch_t pm[10];<br/>&nbsp;&nbsp;const size_t nmatch = 10;<br/>&nbsp;&nbsp;/* 编译正则表达式*/<br/>&nbsp;&nbsp;pattern = argv[1];<br/>&nbsp;&nbsp;z = regcomp(®, pattern, cflags);<br/>&nbsp;&nbsp;if (z != 0){<br/>&nbsp;&nbsp;&nbsp;&nbsp;regerror(z, ®, ebuf, sizeof(ebuf));<br/>&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr, &#34;%s: pattern &#39;%s&#39; \n&#34;, ebuf, pattern);<br/>&nbsp;&nbsp;&nbsp;&nbsp;return 1;<br/>&nbsp;&nbsp;}<br/>&nbsp;&nbsp;/*&nbsp;&nbsp;逐行处理输入的数据 */<br/>&nbsp;&nbsp;while(fgets(lbuf, sizeof(lbuf), stdin)) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;++lno;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if ((z = strlen(lbuf)) &gt;; 0 &amp;&amp; lbuf[z-1] == &#39;\n&#39;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lbuf[z - 1] = 0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;/* 对每一行应用正则表达式进行匹配 */<br/>&nbsp;&nbsp;&nbsp;&nbsp;z = regexec(®, lbuf, nmatch, pm, 0);<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (z == REG_NOMATCH) continue;<br/>&nbsp;&nbsp;&nbsp;&nbsp;else if (z != 0) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;regerror(z, ®, ebuf, sizeof(ebuf));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr, &#34;%s: regcom(&#39;%s&#39;)\n&#34;, ebuf, lbuf);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 2;<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;/* 输出处理结果 */<br/>&nbsp;&nbsp;&nbsp;&nbsp;for (x = 0; x &lt; nmatch &amp;&amp; pm[x].rm_so != -1; ++ x) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!x) printf(&#34;%04d: %s\n&#34;, lno, lbuf);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&#34;&nbsp;&nbsp;$%d=&#39;%s&#39;\n&#34;, x, substr(lbuf, pm[x].rm_so, pm[x].rm_eo));<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;}<br/>&nbsp;&nbsp;/* 释放正则表达式&nbsp;&nbsp;*/<br/>&nbsp;&nbsp;regfree(®);<br/>&nbsp;&nbsp;return 0;<br/>}<br/><br/><br/><br/>上述程序负责从命令行获取正则表达式，然后将其运用于从标准输入得到的每行数据，并打印出匹配结果。执行下面的命令可以编译并执行该程序： <br/><br/>#&nbsp;&nbsp;gcc regexp.c -o regexp<br/>#&nbsp;&nbsp;./regexp&nbsp;&nbsp;&#39;regex[a-z]*&#39; &lt; regexp.c<br/>0003: #include &lt;regex.h&gt;;<br/>&nbsp;&nbsp;$0=&#39;regex&#39;<br/>0027:&nbsp;&nbsp; regex_t reg;<br/>&nbsp;&nbsp;$0=&#39;regex&#39;<br/>0054:&nbsp;&nbsp;&nbsp;&nbsp; z = regexec(®, lbuf, nmatch, pm, 0);<br/>&nbsp;&nbsp;$0=&#39;regexec&#39;<br/><br/><br/>小结 <br/><br/>对那些需要进行复杂数据处理的程序来说，正则表达式无疑是一个非常有用的工具。本文重点在于阐述如何在C语言中利用正则表达式来简化字符串处理，以便在数据处理方面能够获得与Perl语言类似的灵活性。<br/><br/>原文地址：<a href="http://www.chinaunix.net/jh/23/303346.html" target="_blank" rel="external">http://www.chinaunix.net/jh/23/303346.html</a>]]></description>
		</item>
		
			<item>
			<link>https://kanoe.cn/article/coding/189.htm</link>
			<title><![CDATA[open MPI 妙用[转]]]></title>
			<author>master@kanoe.cn(独木舟)</author>
			<category><![CDATA[Coding]]></category>
			<pubDate>Tue,22 Dec 2009 15:48:53 +0800</pubDate>
			<guid>https://kanoe.cn/default.asp?id=189</guid>
		<description><![CDATA[<strong>工作需要，刚想到跟本文一样的思路，顺着思路找到本文，转以留念</strong><br/><br/>是不是经常需要在多台机器上做同样的繁琐操作？<br/><br/>或许open MPI可以帮你的忙。<br/><br/>在所有的节点上，做下面的1—3操作<br/><br/>1，安装openmpi，有三个包需要装：<br/>openmpi<br/>openmpi-libs<br/>openmpi-devel<br/><br/>2，配置无密码ssh登录：<br/>请参考：<a target="_blank" href="http://hanhuzi.blogspot.com/2008/09/ssh.html" rel="external">如何配置无密码SSH</a><br/><br/>3，在工作目录下编制配置文件(文件名随意)，内容包括所有节点的名称，例如：<br/>#&gt;cat hosts<br/>host1<br/>host2<br/>host3<br/>————————<br/>所有节点上的工作目录必需相同，配置文件名和内容也必需相同，简单的办法是所有节点的工作目录都mount到同一个nfs输出上<br/>————————<br/><br/>在主节点上写程序并编译执行4—8<br/>4，例子程序：<br/>[root@dhcp-beijing-cdc-10-182-120-155 ~]# cat hello.c<br/>#include <br/>#include &#34;mpi.h&#34;<br/><br/>int main(int argc, char *argv[])<br/>{<br/>int nproc;<br/>int iproc;<br/>char proc_name[MPI_MAX_PROCESSOR_NAME];<br/>int nameLength;<br/>MPI_Init(&amp;argc,&amp;argv);<br/>MPI_Comm_size(MPI_COMM_WORLD,&amp;nproc);<br/>MPI_Comm_rank(MPI_COMM_WORLD,&amp;iproc);<br/><br/>MPI_Get_processor_name(proc_name,&amp;nameLength);<br/>printf(&#34;Hello World, Iam host %s with rank %d of %d\n&#34;, proc_name,iproc,nproc);<br/><br/>MPI_Finalize();<br/><br/>return 0;<br/>}<br/><br/>5，编译这个例子：<br/>mpicc -o hello hello.c<br/><br/>6，拷贝可执行文件hello到所有节点的相同工作目录（如果使用nfs可忽略此步）<br/><br/>7，执行hello<br/>#&gt; mpirun -np 2 hello -hostfiles hosts<br/>(上面的数字2代表在两个节点上运行hello)<br/>此时，是不是已经看到了来自其它节点的问候？<br/><br/>8，当然，你可以用其他命令来替换hello比如：<br/>#&gt; mpirun -np 3 ls -hostfiles hosts<br/>此命令在各节点上执行ls操作，并显示结果在主节点上。<br/><br/>9，发挥你的想象力吧，有1000台机器需要同时做同一件事情　。。。<br/><br/>10，当然了，此文章并不是关于分布式计算的，有兴趣的朋友参考相关文章 ]]></description>
		</item>
		
			<item>
			<link>https://kanoe.cn/article/coding/188.htm</link>
			<title><![CDATA[Open MPI unable to find the specified compiler]]></title>
			<author>master@kanoe.cn(独木舟)</author>
			<category><![CDATA[Coding]]></category>
			<pubDate>Tue,15 Dec 2009 21:09:05 +0800</pubDate>
			<guid>https://kanoe.cn/default.asp?id=188</guid>
		<description><![CDATA[今天在新集群弄OpenMPI＋MM5出现 The Open MPI wrapper compiler was unable to find the specified compiler<br/>f77 in your PATH. 错误，初次看很眼熟，没想到是我以前装OpenMPI时就出现过得，几经搜索，又回到熟悉的解决方法：PATH！<br/><br/>--------------------------------------------------------------------------<br/>The Open MPI wrapper compiler was unable to find the specified compiler<br/>f77 in your PATH.<br/><br/>Note that this compiler was either specified at configure time o&#114; in<br/>one of several possible environment variables.<br/>--------------------------------------------------------------------------<br/><br/>解决方法：<br/>export PATH=$PATH:/data/soft/pgi714bin/linux86-64/7.1-4/bin<br/><br/>最后测试一下设置成功没：<br/>which cc<br/>which f77<br/>which CC]]></description>
		</item>
		
			<item>
			<link>https://kanoe.cn/article/coding/MPPMM5.htm</link>
			<title><![CDATA[关于MM5的MPP编译]]></title>
			<author>master@kanoe.cn(独木舟)</author>
			<category><![CDATA[Coding]]></category>
			<pubDate>Tue,03 Nov 2009 19:05:30 +0800</pubDate>
			<guid>https://kanoe.cn/default.asp?id=186</guid>
		<description><![CDATA[由于工作的需要，我要在集群机上运行并行版本的MM5，但是编译运行了好久都出错，后来发现在FCFLAGS和LDOPTIONS上加上-mcmodel=medium 就可以了，下面是configure.user的设置。本集群为曙光5000A，CPU为AMD Opteron&nbsp;&nbsp;2350，并行环境采用openmpi，编译器为PGI。<br/>#-----------------------------------------------------------------------------<br/>RUNTIME_SYSTEM = &#34;linux&#34;<br/>MPP_TARGET=$(RUNTIME_SYSTEM)<br/>## edit the following definition for your system<br/>LINUX_MPIHOME = /state/partition1/soft/compiler/ompi/1.3.3/pgcc.pgf90<br/>MFC = $(LINUX_MPIHOME)/bin/mpif90<br/>MCC = $(LINUX_MPIHOME)/bin/mpicc<br/>MLD = $(LINUX_MPIHOME)/bin/mpif90<br/>FCFLAGS =-O3 -mcmodel=medium -fastsse -Munroll -Mcray=pointer -tp barcelona-64 -pc 64 -Mnoframe -byteswapio -DDEC_ALPHA<br/>LDOPTIONS =-O3 -mcmodel=medium -Mcray=pointer -Munroll -tp barcelona-64 -pc 64 -Mnoframe -byteswapio -DDEC_ALPHA<br/>LOCAL_LIBRARIES = -L$(LINUX_MPIHOME)/lib -lmpi<br/>MAKE = make -i -r<br/>AWK = awk<br/>SED = sed<br/>CAT = cat<br/>CUT = cut<br/>EXPAND = expand<br/>M4 = m4<br/>CPP = /lib/cpp -C -P -traditional<br/>CPPFLAGS = -DMPI -Dlinux -DSYSTEM_CALL_OK -DDEC_ALPHA -DMPI2_SUPPORT<br/>CFLAGS = -DMPI -I$(LINUX_MPIHOME)/include -DSGI_IA64 -DMPI2_SUPPORT -DDEC_ALPHA<br/>ARCH_OBJS =&nbsp;&nbsp;milliclock.o<br/>IWORDSIZE = 4<br/>RWORDSIZE = 4<br/>LWORDSIZE = 4<br/>#-----------------------------------------------------------------------------]]></description>
		</item>
		
			<item>
			<link>https://kanoe.cn/article/coding/183.htm</link>
			<title><![CDATA[使用Perl修改Linux文件]]></title>
			<author>master@kanoe.cn(独木舟)</author>
			<category><![CDATA[Coding]]></category>
			<pubDate>Tue,01 Sep 2009 20:15:38 +0800</pubDate>
			<guid>https://kanoe.cn/default.asp?id=183</guid>
		<description><![CDATA[当你编写脚本或是安装程序的时候，就需要修改特定文件的数据，如果这时有自动修改文件的功能，那将会是非常实用的。例如，当你需要移动一个文件中的某个字符串或是命令，当你要改变许多文件的IP地址的时候，这个功能就可以拿来利用了。<br/><br/>手动改变这些文件会耗费很长的时间，特别当它是一件重复性的任务。但是，你可以使用Perl程序来完成。所有的Linux供应商都有这个程序。执行以下操作：<br/><br/>$ perl -pi -e &#39;s|[old_string]|[new_string]|g&#39; [file] <br/><br/>字符串可以是简单的命令或是常规的表达式。如果你要改变目录的位置（例：从/var/spool/mail到/var/spool/messages），你想要改变目录/etc下的每个文件来反映路径变化。执行以下操作：<br/><br/>$ find /etc -type f| xargs perl -pi -e &#39;s|/var/spool/mail|/var/spool/messages|g&#39; <br/><br/>在这个例子上，我们使用搜索和xargs来确保系统只运行常规文件的命令，而不是非常规目录或其它文件类型的命令。这也就运行了/etc目录树，而且会递归的改变所有文件。<br/><br/>由于我们/标识，所以我们必须输入了像/var这样的路径而不是/var。我们也可以在Perl表达式使用分隔符。（除了使用|，你也能够使用/, #,@作为分隔符。）<br/><br/>执行以下操作，从整个文件里移开一个命令<br/><br/>$ perl -pi -e &#39;s|myword||g&#39; file <br/><br/>这就从基本上没有使用任何东西却代替了“myword”.(需要注意的是在第二个和第三个分隔符之间没有空格)。<br/><br/>以这种方式使用Perl的话,当你修改配置文件或其它任何类型的数据的时候，你就会极具创造力。它就是一个自动搜索和代替的功能。<br/>]]></description>
		</item>
		
			<item>
			<link>https://kanoe.cn/article/coding/179.htm</link>
			<title><![CDATA[弄清C语言中的变量未赋值时的初始值问题]]></title>
			<author>master@kanoe.cn(独木舟)</author>
			<category><![CDATA[Coding]]></category>
			<pubDate>Fri,17 Jul 2009 10:51:30 +0800</pubDate>
			<guid>https://kanoe.cn/default.asp?id=179</guid>
		<description><![CDATA[/*<br/>程序目的:弄清C语言中的变量未赋值时的初始值问题<br/><br/>测试结果:在C语言中,全局变量和静态变量,如果没有赋初值,则默认初始值int,float,char,空指针<br/>分别为0.0.0.&#39;\0&#39;,0~~~~~~~除了全局变量和静态变量以外,其它变量如果没有赋初值,则默认初始值为<br/>内存中的垃圾内容,对于垃圾内容不能有任何假设.<br/>这些规则对于数组\结构体和联合体也同样适用<br/>用malloc()和realloc()动态分配的内存也可能存在垃圾内容.因此在使用变量前最好都赋初值.<br/>*/<br/><br/>#include&lt;stdio.h&gt;<br/>#define N 10<br/>int a,b[N];<br/>char c,*m;<br/>void main()<br/>{<br/> static int p,q[N],i;<br/> char e,*n;<br/> printf(&#34;%d,%d\n%d,%d\n%d\n&#34;,a,c,p,e,n);<br/> for(i=0;i&lt;N;i++)<br/> {<br/>&nbsp;&nbsp;printf(&#34;%d &#34;,q[i]);<br/> }<br/> getchar();<br/>}]]></description>
		</item>
		
			<item>
			<link>https://kanoe.cn/article/coding/sscanf.htm</link>
			<title><![CDATA[sscanf]]></title>
			<author>master@kanoe.cn(独木舟)</author>
			<category><![CDATA[Coding]]></category>
			<pubDate>Mon,13 Jul 2009 10:12:14 +0800</pubDate>
			<guid>https://kanoe.cn/default.asp?id=177</guid>
		<description><![CDATA[名称:<br/>　　sscanf() - 从一个字符串中读进与指定格式相符的数据. <br/>　　函数原型:<br/>　　Int sscanf( string str, string fmt, mixed var1, mixed var2 ... );<br/>　　int scanf( const char *format [,argument]... ); <br/>　　说明：<br/>　　sscanf与scanf类似，都是用于输入的，只是后者以键盘(stdin)为输入源，前者以固定字符串为输入源。<br/>　　其中的format可以是一个或多个 {%<li> </li>[width] [{h | l | I64 | L}]type | &#39; &#39; | &#39;\t&#39; | &#39;\n&#39; | 非%符号} <br/>　　注：<br/>　　1、 * 亦可用于格式中, (即 %*d 和 %*s) 加了星号 (*) 表示跳过此数据不读入. (也就是不把此数据读入参数中) <br/>　　2、{a|b|c}表示a,b,c中选一，[d],表示可以有d也可以没有d。 <br/>　　3、width表示读取宽度。 <br/>　　4、{h | l | I64 | L}:参数的size,通常h表示单字节size，I表示2字节 size,L表示4字节size(double例外),l64表示8字节size。<br/>　　5、type :这就很多了，就是%s,%d之类。 <br/>　　6、特别的：%*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉，不会向目标参数中写入值<br/>　　支持集合操作：<br/>　　%[a-z] 表示匹配a到z中任意字符，贪婪性(尽可能多的匹配)<br/>　　%[aB&#39;] 匹配a、B、&#39;中一员，贪婪性<br/>　　%[^a] 匹配非a的任意字符，贪婪性<br/><br/>例子：1. 常见用法。<br/>　　char buf[512] = ;<br/>　　sscanf(&#34;123456 &#34;, &#34;%s&#34;, buf);<br/>　　printf(&#34;%s\n&#34;, buf);<br/>　　结果为：123456<br/>　　2. 取指定长度的字符串。如在下例中，取最大长度为4字节的字符串。<br/>　　sscanf(&#34;123456 &#34;, &#34;%4s&#34;, buf);<br/>　　printf(&#34;%s\n&#34;, buf);<br/>　　结果为：1234 <br/>　　3. 取到指定字符为止的字符串。如在下例中，取遇到空格为止字符串。<br/>　　sscanf(&#34;123456 abcdedf&#34;, &#34;%[^ ]&#34;, buf);<br/>　　printf(&#34;%s\n&#34;, buf);<br/>　　结果为：123456 <br/>　　4. 取仅包含指定字符集的字符串。如在下例中，取仅包含1到9和小写字母的字符串。<br/>　　sscanf(&#34;123456abcdedfBCDEF&#34;, &#34;%[1-9a-z]&#34;, buf);<br/>　　printf(&#34;%s\n&#34;, buf);<br/>　　结果为：123456abcdedf <br/>　　5. 取到指定字符集为止的字符串。如在下例中，取遇到大写字母为止的字符串。<br/>　　sscanf(&#34;123456abcdedfBCDEF&#34;, &#34;%[^A-Z]&#34;, buf);<br/>　　printf(&#34;%s\n&#34;, buf);<br/>　　结果为：123456abcdedf <br/>　　6、给定一个字符串iios/12DDWDFF@122，获取 / 和 @ 之间的字符串，先将 &#34;iios/&#34;过滤掉，再将非&#39;@&#39;的一串内容送到buf中<br/>　　sscanf(&#34;iios/12DDWDFF@122&#34;, &#34;%*[^/]/%[^@]&#34;, buf);<br/>　　printf(&#34;%s\n&#34;, buf);<br/>　　结果为：12DDWDFF <br/>　　7、给定一个字符串““hello, world”，仅保留world。（注意：“，”之后有一空格）<br/>　　sscanf(“hello, world”, &#34;%*s%s&#34;, buf); <br/>　　printf(&#34;%s\n&#34;, buf); <br/>　　结果为：world<br/>　　%*s表示第一个匹配到的%s被过滤掉，即hello被过滤了<br/>　　如果没有空格则结果为NULL。<br/>　　sscanf的功能很类似于正则表达式, 但却没有正则表达式强大,所以如果对于比较复杂的字符串处理,建议使用正则表达式.]]></description>
		</item>
		
			<item>
			<link>https://kanoe.cn/article/coding/124.htm</link>
			<title><![CDATA[ VB中MsFlexGrid控件的使用细则(收集)]]></title>
			<author>master@kanoe.cn(独木舟)</author>
			<category><![CDATA[Coding]]></category>
			<pubDate>Mon,09 Feb 2009 14:18:26 +0800</pubDate>
			<guid>https://kanoe.cn/default.asp?id=124</guid>
		<description><![CDATA[&gt;&gt; 将文本赋值给MsFlexGrid的单元格 <br/>MsFlexGrid.TextMatrix(3,1)=”Hello” <br/>&gt;&gt; 在MsFlexGrid控件单元格中插入背景图形 <br/>Set MsFlexGrid.CellPicture=LoadPicture(“C:\temp\1.bmp”) <br/>&gt;&gt;选中某个单元 <br/>MsFlexGrid.Row=1 <br/>MsFlexGrid.Col=1 <br/>&gt;&gt;用粗体格式化当前选中单元 <br/>MsFlexGrid.CellFontBold=True <br/>&gt;&gt; 添加新的一行 <br/>使用AddItem方法,用Tab字符分开不同单元格的内容 <br/>dim row as string <br/>row=”AAA”&amp;vbtab&amp;”bbb” <br/>MsFlexFrid1.addItem row <br/>&gt;&gt;怎样来实现MSFlexGrid控件单数行背景为白色，双数的行背景为蓝色? <br/>Dim i As Integer <br/>With MSFlexGrid1 <br/>.AllowBigSel&#101;ction = True ’ 设置网格样式 <br/>.FillStyle = flexFillRepeat <br/>For i = 0 To .Rows - 1 <br/>.Row = i: .Col = .FixedCols <br/>.ColSel = .Cols() - .FixedCols - 1 <br/>If i Mod 2 = 0 Then <br/>.CellBackColor = &amp;HC0C0C0 ’ 浅灰 <br/>Else <br/>.CellBackColor = vbBlue ’ 兰色 <br/>End If <br/>Next i <br/>End With <br/>&gt;&gt; MSFlexGrid控件如何移到最后一行 <br/>MSFlexGrid1.TopRow = MSFlexGrid1.Rows – 1 <br/>&gt;&gt;如何判断msflexgrid有无滚动条 <br/>Declare Function GetScrollRange Lib &#34;user32&#34; (ByVal hWnd As Long, ByVal nBar As Long, lpMinPos As <br/>Long, lpMaxPos As Long) As Long <br/>Public Const SB_HORZ = &amp;H0 <br/>Public Const SB_VERT = &amp;H1 <br/>Public Function VsScroll(MshGrid As MSHFlexGrid) As Boolean ’判断水平滚动条的可见 <br/>Dim i As Long <br/>VsScroll = False <br/>i = GetScrollRange(MshGrid.hWnd, SB_HORZ, lpMinPos, lpMaxPos) <br/>If lpMaxPos &lt;&gt; lpMinPos Then VsScroll = True <br/>End Function <br/>Public Function HeScroll(MshGrid As MSHFlexGrid) As Boolean ’判断垂直滚动条的可见 <br/>Dim i As Long <br/>HeScroll = False <br/>i = GetScrollRange(MshGrid.hWnd, SB_VERT, lpMinPos, lpMaxPos) <br/>If lpMaxPos &lt;&gt; lpMinPos Then HeScroll = True <br/>End Function <br/>&gt;&gt;程序运行时，想动态增加MSFlexgrid的列数 <br/>在第2列后插入一列： <br/>Private Sub Form_Load() <br/>Me.MSHFlexGrid1.Cols = 5 <br/>MSHFlexGrid1.Rows = 2 <br/>For i = 0 To Me.MSHFlexGrid1.Cols - 1 <br/>Me.MSHFlexGrid1.TextMatrix(0, i) = i <br/>Me.MSHFlexGrid1.TextMatrix(1, i) = i <br/>Next <br/>End Sub <br/>Private Sub Command1_Click() <br/>Me.MSHFlexGrid1.Cols = Me.MSHFlexGrid1.Cols + 1 <br/>Me.MSHFlexGrid1.ColPosition(5) = 3 <br/>End Sub <br/>&gt;&gt; 请教MSFlexGrid中的对齐功能的使用 <br/>设置MSFlexGrid1.ColAlignment(index)=n <br/>&gt;&gt;得到MSFlexGrid控件中当前选中的一行 <br/>msflexgrid1.rowsel就是当前选中行 <br/>&gt;&gt; 如何通过代码调节列宽度 <br/>msflexgrid1.colwidth(i)=4000 <br/>将MsFlexGrid控件的内容输出到文本<br/>2004-03-19 14:25:18 <br/>&#39;OutDataToText<br/>&#39;将MsFlexGrid控件中显示的内容输出到文本文件<br/>Public Sub OutDataToText(Flex As MSFlexGrid) <br/>Dim s As String<br/>Dim i As Integer<br/>Dim j As Integer<br/>Dim k As Integer<br/>Dim strTemp As String<br/>On Error GoTo Ert<br/>Me.MousePointer = 11<br/>On Error Resume Next<br/>DoEvents<br/>Dim FileNum As Integer<br/>FileNum = FreeFile<br/>Open &#34;d:aa.txt&#34; For Output As #FileNum<br/>With Flex<br/>k = .Rows<br/>For i = 0 To k - 1<br/>strTemp = &#34;&#34;<br/>For j = 0 To .Cols - 1<br/>DoEvents<br/>strTemp = strTemp &amp; .TextMatrix(i, j) &amp; &#34;,&#34;<br/>Next j<br/>Print #FileNum, Left(strTemp, Len(strTemp) - 1)<br/>Next i<br/>End With<br/>Close #FileNum<br/>Me.MousePointer = 0<br/>MsgBox &#34;导出成功&#34;<br/>Ert:<br/>MsgBox Err.Description<br/>Me.MousePointer = 0<br/>End Sub<br/>增加 MsFlexGrid 的编辑功能 <br/>概述<br/>MsFlexGrid 控件没有提供文本编辑的功能，下面的例子演示了如何利用一个TextBox 实现编辑当前网格的功能。在按下一个键后，就把TextBox 移动到当前的位置，并激活。在键入回车或移动到其他网格时，就把TextBox 中的内容放到网格中。 <br/>实现步骤<br/>1 打开 VB5，开启一个新的工程。<br/>2 在菜单“工程” 中选择 “部件”，在列表中选中 “Microsoft FlexGrid Control ..”<br/>3 放一个 MsFlexGrid 控件和一个TextBox 控件(Text1)到 Form1。修改MsFlexGrid 控件的名称为 Grid1， <br/>设置Grid1 的行，列为 4，固定行，列为 0。设置 Text1 的 Visiable 为 False， BorderStyle 为 <br/>None(0)。<br/>4 在Form1 的代码中增加声明：<br/>Const ASC_ENTER = 13 &#39;回车<br/>Dim gRow As Integer<br/>Dim gCol As Integer<br/>5 增加代码到 Grid_KeyPress 过程：<br/>Private Sub Grid1_KeyPress(KeyAscii As Integer)<br/>&#39; Move the text box to the current grid cell:<br/>Text1.Top = Grid1.CellTop + Grid1.Top<br/>Text1.Left = Grid1.CellLeft + Grid1.Left<br/>&#39; Save the position of the grids Row and Col for later:<br/>gRow = Grid1.Row<br/>gCol = Grid1.Col<br/>&#39; Make text box same size as current grid cell:<br/>Text1.Width = Grid1.CellWidth - 2 * Screen.TwipsPerPixelX<br/>Text1.Height = Grid1.CellHeight - 2 * Screen.TwipsPerPixelY<br/>&#39; Transfer the grid cell text:<br/>Text1.Text = Grid1.Text<br/>&#39; Show the text box:<br/>Text1.Visible = True<br/>Text1.ZOrder 0 &#39; 把 Text1 放到最前面！<br/>Text1.SetFocus<br/>&#39; Redirect this KeyPress event to the text box:<br/>If KeyAscii &lt;&gt; ASC_ENTER Then<br/>SendKeys Chr$(KeyAscii)<br/>End If<br/>End Sub<br/>6 增加代码到 Text1_KeyPress 过程：<br/>Private Sub Text1_KeyPress(KeyAscii As Integer)<br/>If KeyAscii = ASC_ENTER Then<br/>Grid1.SetFocus &#39; Set focus back to grid, see Text_LostFocus.<br/>KeyAscii = 0 &#39; Ignore this KeyPress.<br/>End If<br/>End Sub<br/>7 增加代码到 Text1_LostFocus 过程：<br/>Private Sub Text1_LostFocus()<br/>Dim tmpRow As Integer<br/>Dim tmpCol As Integer<br/>&#39; Save current settings of Grid Row and col. This is needed only if<br/>&#39; the focus is set somewh&#101;re else in the Grid.<br/>tmpRow = Grid1.Row<br/>tmpCol = Grid1.Col<br/>&#39; Set Row and Col back to what they were before Text1_LostFocus:<br/>Grid1.Row = gRow<br/>Grid1.Col = gCol<br/>Grid1.Text = Text1.Text &#39; Transfer text back to grid.<br/>Text1.SelStart = 0 &#39; Return caret to beginning.<br/>Text1.Visible = False &#39; Disable text box.<br/>&#39; Return row and Col contents:<br/>Grid1.Row = tmpRow<br/>Grid1.Col = tmpCol<br/>End Sub<br/>8 好了。按 F5 开始测试。您可以自由地在 Grid 中移动，按回车可以开始或结束编辑。 <br/>使用MsFlexGrid控件的几个函数 <br/><br/>在VB处理数据显示的时候,使用表格是一种好的方法,虽然DataGrid可以与数据源绑定,但是总有美中不足,就是外观不好看,所以有时应用MsFlexGrid显示数据还是一种比较好的方法,以下几个函数是用来控制MsFlexGrid的程序<br/>&#39;&#39;MsFlexGrid操作函数&#39;&#39;合并列<br/>Public Function MergeCol(GridObj As Object, ByVal StartCol As Long, ByVal EndCol As Long, ByVal <br/>ColValue As String, ByVal CurrentRow As Long) As Boolean<br/>If StartCol &gt; EndCol o&#114; StartCol &gt; GridObj.Cols o&#114; CurrentRow &gt; GridObj.Rows Then<br/>MsgBox &#34;对不起，行列设置错误！&#34;, vbOKOnly, App.Title<br/>MergeCol = False<br/>Exit Function<br/>End If<br/>For I = StartCol To EndCol<br/>GridObj.MergeCol(I) = True<br/>GridObj.TextArray(faIndex(GridObj, CurrentRow, I)) = ColValue<br/>GridObj.ColAlignment(I) = flexAlignCenterCenter<br/>Next I<br/>GridObj.MergeRow(CurrentRow) = True<br/>MergeCol = True<br/>End Function<br/>&#39;&#39;合并行<br/>Public Function MergeRow(GridObj As Object, ByVal StartRow As Long, ByVal EndRow As Long, ByVal <br/>RowValue As String, ByVal CurrentCol As Long) As Boolean<br/>If StartRow &gt; EndRow o&#114; StartRow &gt; GridObj.Rows o&#114; CurrentCol &gt; GridObj.Cols Then<br/>MsgBox &#34;对不起，行列设置错误！&#34;, vbOKOnly, App.Title<br/>MergeRow = False<br/>Exit Function<br/>End If<br/>For I = StartRow To EndRow<br/>GridObj.MergeRow(I) = True<br/>GridObj.TextArray(faIndex(GridObj, I, CurrentCol)) = RowValue<br/>GridObj.ColAlignment(CurrentCol) = flexAlignCenterCenter<br/>Next I<br/>GridObj.MergeCol(CurrentCol) = True<br/>MergeRow = True<br/>End Function<br/>&#39;&#39;转换索引<br/>Public Function faIndex(GridObj As Object, ByVal row As Integer, ByVal col As Integer) As Long<br/>If row &gt; GridObj.Rows o&#114; row &lt; 0 o&#114; col &gt; GridObj.Cols o&#114; col &lt; 0 Then<br/>MsgBox &#34;对不起，行列设置错误！&#34;, vbOKOnly, App.Title<br/>faIndex = -1<br/>Exit Function<br/>End If<br/><br/>faIndex = row * GridObj.Cols + col<br/>End Function<br/>&#39;&#39;插入行<br/>Public Function SetItem(GridObj As Object, ByVal row As Integer, ByVal col As Integer, ByVal <br/>SetValue As String) As Boolean<br/>If row &gt; GridObj.Rows o&#114; row &lt; 0 o&#114; col &gt; GridObj.Cols o&#114; col &lt; 0 Then<br/>MsgBox &#34;对不起，行列设置错误！&#34;, vbOKOnly, App.Title<br/>SetItem = False<br/>Exit Function<br/>End If<br/>GridObj.TextArray(faIndex(GridObj, row, col)) = SetValue<br/>etItem = True<br/>End Function<br/>&#39;&#39;得到单元格值<br/>Public Function GetItem(GridObj As Object, ByVal row As Integer, ByVal col As Integer) As String<br/>If row &gt; GridObj.Rows o&#114; row &lt; 0 o&#114; col &gt; GridObj.Cols o&#114; col &lt; 0 Then<br/>MsgBox &#34;对不起，行列设置错误！&#34;, vbOKOnly, App.Title<br/>GetItem = &#34;&#34;<br/>Exit Function<br/>End If<br/>GetItem = GridObj.TextArray(faIndex(GridObj, row, col))<br/>End Function<br/>在msflexgrid控件中每一个cell格的内容是不可以由用户直接编辑的但是我们可以通过一些小技巧来方便的实现这编辑功能来扩展msflexgrid的应用（在实际应用中这是很常用的功能）。<br/>你只需按下面的做即可轻松实现编辑msflexgrid控件数据的功能<br/>例在窗体上放一文本框txtvalue，和一msflexgrid控件grid<br/>‘文本框控件的keypress事件<br/>private sub txtvalue_keypress(keyascii as integer)<br/>‘放入一些处理过程，如只需输入数字时的处理<br/>dim i<br/>i=1<br/>end sub<br/>private sub txtvalue_change()<br/>grid.text = txtvalue.text<br/>end sub<br/>&#39;在grid的entercell事件中加入下例代码<br/>private sub grid_entercell()<br/>txtvalue.text = grid.text<br/>txtvalue.selstart = 0<br/>txtvalue.sellength = len(txtvalue.text)<br/>end sub<br/>&#39;当用户输入数据时直接调用文本框的keypress事件<br/>private sub grid_keypress(keyascii as integer)<br/>txtvalue_keypress keyascii<br/>end sub<br/>ok,这样一个可编辑的msflexgrid控件就完成了，简单吧!!<br/>原理<br/>当用户点击msflexgrid中的某个cell格要输入数据时,产生entercell事件，在这里我们对文本框进行初始化，输入当前cell格中的内容，并且选中所有文本。当用户要按下按键进行输入时，就直接调用txtvalue的事件，由文本框来处理.处理的结果同grid的当前cell同步，使用户编辑cell格就象使用文本框一样方便。]]></description>
		</item>
		
			<item>
			<link>https://kanoe.cn/article/coding/123.htm</link>
			<title><![CDATA[使用mschart控件实现对数图表并且保存图像]]></title>
			<author>master@kanoe.cn(独木舟)</author>
			<category><![CDATA[Coding]]></category>
			<pubDate>Fri,06 Feb 2009 20:03:53 +0800</pubDate>
			<guid>https://kanoe.cn/default.asp?id=123</guid>
		<description><![CDATA[<textarea name="code" class="vb">Private Declare Function SendMessage Lib &#34;user32&#34; Alias _
       &#34;SendMessageA&#34; (ByVal hwnd As Long, ByVal wMsg As Long, _
        ByVal wParam As Long, ByVal lParam As Long) As Long

      Private Const WM_PAINT = &amp;HF
      Private Const WM_PRINT = &amp;H317
      Private Const PRF_CLIENT = &amp;H4&amp;    ' Draw the window's client area.
      Private Const PRF_CHILDREN = &amp;H10&amp; ' Draw all visible child windows.
      Private Const PRF_OWNED = &amp;H20&amp;    ' Draw all owned windows.

 

Private Sub Command1_Click()
Dim wav(2500) As Single
Dim drt As Boolean

Dim dd(1 To 1152, 1 To 4) As Variant

'读取红外波段波长
i = 0
Open &#34;d:\lowe\swavd.txt&#34; For Input As #1
Do While Not EOF(1)
i = i + 1
Input #1, wav(i)
Loop
Close #1
For i = 1 To 1151
dd(i, 1) = wav(i)
dd(i, 3) = wav(i)

Next i


dd(1, 1) = &#34;R&#34;
dd(1, 3) = &#34;T&#34;
Open App.Path &amp; &#34;\daor.txt&#34; For Input As #1
For i = 2 To 1151
Input #1, dd(1153 - i, 2)
Next i
Close #1

Open App.Path &amp; &#34;\daot.txt&#34; For Input As #1
For i = 2 To 1151
Input #1, dd(1153 - i, 4)
Next i
Close #1
If Option1 = True Then
drt = drw(dd, 3)
Else
drt = drw(dd, 30)
End If

End Sub

 

 

Private Sub Command3_Click()
         Dim rv As Long
    
         With Picture1
         .AutoRedraw = True

         rv = SendMessage(MSChart1.hwnd, WM_PAINT, .hdc, 0)
         Picture1.Line (0, 0)-(Picture1.Width - 100, Picture1.Height - 100), vbBlack, B
         .Picture = .Image
         .AutoRedraw = False
         ' Sent the picture to the clipboard.
         Clipboard.Clear
         Clipboard.SetData .Image, vbCFBitmap
         .Visible = True
         End With

         ' Save the picture on disk.
         'SavePicture Form1.Picture1.Picture, &#34;c:\testpic.bmp&#34;
      End Sub

      Private Sub Form_Load()
' Make sure picturebox is same size as the chart.
         With Picture1
            .Height = MSChart1.Height
            .Width = MSChart1.Width
             Form1.Width = .Width
            .Top = 0
            .Left = 0
            .DrawWidth = 1
         End With
         
         

 

      End Sub


Function drw(arrdata() As Variant, bound As Long) As Boolean
Dim j As Long
Dim maxdata As Long
Dim max_div As Long
Dim min_div As Long

maxdata = bound
If maxdata = 3 Then
max_div = 4
min_div = 2
Else
max_div = 8
min_div = 1
End If
MSChart1.ChartData = arrdata


'图形不能拖动
MSChart1.AllowSel&#101;ctions = False
'使用自定义绘图区比例
MSChart1.Plot.UniformAxis = False '该值指定图表的所有值坐标轴的单位刻度是否一致
MSChart1.Plot.AutoLayout = False '该值决定 Plot 对象是采用人工还是自动的布局方式
 '设置绘图区域范围
 With MSChart1.Plot.LocationRect
      .Min.x = -300
      .Min.y = -100
      .Max.x = MSChart1.Width + 100
      .Max.y = MSChart1.Height + 100
 End With
'设置图形背景颜色
MSChart1.Backdro&#112;.Fill.Brush.Style = VtBrushStyleSolid
MSChart1.Backdro&#112;.Fill.Brush.FillColor.Set 255, 255, 255
MSChart1.Backdro&#112;.Frame.Style = VtFrameStyleSingleLine
MSChart1.Backdro&#112;.Frame.FrameColor.Set 0, 0, 0


' 从 scale 转换到 log
MSChart1.Plot.Axis(VtChAxisIdX).AxisScale.Type = VtChScaleTypeLogarithmic
' 从 scale 转换到 log 时必须特别指定一个 LogBase。基数可以设为
' 2 到 200 间的任意值。
MSChart1.Plot.Axis(VtChAxisIdX).AxisScale.LogBase = 10

 

'设置x轴刻度最大，最小值，主要刻度，次要刻度,刻度线向内
MSChart1.Plot.Axis(VtChAxisIdX).ValueScale.Auto = False

MSChart1.Plot.Axis(VtChAxisIdX).ValueScale.Maximum = maxdata
MSChart1.Plot.Axis(VtChAxisIdX).ValueScale.Minimum = 0.3
MSChart1.Plot.Axis(VtChAxisIdX).ValueScale.MajorDivision = max_div
MSChart1.Plot.Axis(VtChAxisIdX).ValueScale.MinorDivision = min_div
MSChart1.Plot.Axis(VtChAxisIdX).Tick.Style = VtChAxisTickStyleInside
MSChart1.Plot.Axis(VtChAxisIdX).AxisTitle = &#34;Wavelengh(μm)&#34;

'设置y轴刻度最大，最小值，主要刻度，次要刻度,刻度线向内
MSChart1.Plot.Axis(VtChAxisIdY).ValueScale.Auto = False
MSChart1.Plot.Axis(VtChAxisIdY).ValueScale.Maximum = 100
MSChart1.Plot.Axis(VtChAxisIdY).ValueScale.Minimum = 0
MSChart1.Plot.Axis(VtChAxisIdY).ValueScale.MajorDivision = 5
MSChart1.Plot.Axis(VtChAxisIdY).ValueScale.MinorDivision = 4
MSChart1.Plot.Axis(VtChAxisIdY).Tick.Style = VtChAxisTickStyleInside
MSChart1.Plot.Axis(VtChAxisIdY).AxisTitle = &#34;R&amp;T(%)&#34;

MSChart1.Plot.Axis(VtChAxisIdY).AxisTitle.TextLayout.Orientation = VtOrientationUp

MSChart1.Legend.Location.LocationType = VtChLocationTypeRight
MSChart1.Legend.Backdro&#112;.Fill.Style = VtFillStyleBrush
MSChart1.Legend.Backdro&#112;.Fill.Brush.FillColor.Set 255, 255, 255
MSChart1.Legend.Location.Visible = True
Call Command3_Click

End Function 
</textarea>]]></description>
		</item>
		
</channel>
</rss>
