﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-kenwell-随笔分类-c++学习中的问题</title><link>http://www.cppblog.com/kenwell/category/1166.html</link><description>自己学习所用</description><language>zh-cn</language><lastBuildDate>Tue, 03 Aug 2010 11:00:44 GMT</lastBuildDate><pubDate>Tue, 03 Aug 2010 11:00:44 GMT</pubDate><ttl>60</ttl><item><title>Windows Socket五种I/O模型——代码全攻略（下）</title><link>http://www.cppblog.com/kenwell/archive/2010/08/03/122086.html</link><dc:creator>c++ 学习</dc:creator><author>c++ 学习</author><pubDate>Tue, 03 Aug 2010 09:27:00 GMT</pubDate><guid>http://www.cppblog.com/kenwell/archive/2010/08/03/122086.html</guid><wfw:comment>http://www.cppblog.com/kenwell/comments/122086.html</wfw:comment><comments>http://www.cppblog.com/kenwell/archive/2010/08/03/122086.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kenwell/comments/commentRss/122086.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kenwell/services/trackbacks/122086.html</trackback:ping><description><![CDATA[<p style="line-height: normal; color: rgb(59, 64, 67); font-family: Georgia; font-size: 12px; letter-spacing: 2px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">2.用完成例程方式实现的重叠I/O模型<br style="line-height: normal; ">#include &lt;WINSOCK2.H&gt;<br style="line-height: normal; ">#include &lt;stdio.h&gt;</p><p style="line-height: normal; color: rgb(59, 64, 67); font-family: Georgia; font-size: 12px; letter-spacing: 2px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">#define PORT&nbsp;&nbsp;&nbsp; 5150<br style="line-height: normal; ">#define MSGSIZE 1024</p><p style="line-height: normal; color: rgb(59, 64, 67); font-family: Georgia; font-size: 12px; letter-spacing: 2px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">#pragma comment(lib, "ws2_32.lib")</p><p style="line-height: normal; color: rgb(59, 64, 67); font-family: Georgia; font-size: 12px; letter-spacing: 2px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">typedef struct<br style="line-height: normal; ">{<br style="line-height: normal; ">WSAOVERLAPPED overlap;<br style="line-height: normal; ">WSABUF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Buffer;<br style="line-height: normal; ">char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; szMessage[MSGSIZE];<br style="line-height: normal; ">DWORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NumberOfBytesRecvd;<br style="line-height: normal; ">DWORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Flags;&nbsp;<br style="line-height: normal; ">SOCKET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sClient;<br style="line-height: normal; ">}PER_IO_OPERATION_DATA, *LPPER_IO_OPERATION_DATA;</p><p style="line-height: normal; color: rgb(59, 64, 67); font-family: Georgia; font-size: 12px; letter-spacing: 2px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">DWORD WINAPI WorkerThread(LPVOID);<br style="line-height: normal; ">void CALLBACK CompletionROUTINE(DWORD, DWORD, LPWSAOVERLAPPED, DWORD);</p><p style="line-height: normal; color: rgb(59, 64, 67); font-family: Georgia; font-size: 12px; letter-spacing: 2px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">SOCKET g_sNewClientConnection;<br style="line-height: normal; ">BOOL&nbsp;&nbsp; g_bNewConnectionArrived = FALSE;</p><p style="line-height: normal; color: rgb(59, 64, 67); font-family: Georgia; font-size: 12px; letter-spacing: 2px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">int main()<br style="line-height: normal; ">{<br style="line-height: normal; ">WSADATA&nbsp;&nbsp;&nbsp;&nbsp; wsaData;<br style="line-height: normal; ">SOCKET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sListen;<br style="line-height: normal; ">SOCKADDR_IN local, client;<br style="line-height: normal; ">DWORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dwThreadId;<br style="line-height: normal; ">int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iaddrSize = sizeof(SOCKADDR_IN);</p><p style="line-height: normal; color: rgb(59, 64, 67); font-family: Georgia; font-size: 12px; letter-spacing: 2px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">// Initialize Windows Socket library<br style="line-height: normal; ">WSAStartup(0x0202, &amp;wsaData);</p><p style="line-height: normal; color: rgb(59, 64, 67); font-family: Georgia; font-size: 12px; letter-spacing: 2px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">// Create listening socket<br style="line-height: normal; ">sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);</p><p style="line-height: normal; color: rgb(59, 64, 67); font-family: Georgia; font-size: 12px; letter-spacing: 2px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">// Bind<br style="line-height: normal; ">local.sin_addr.S_un.S_addr = htonl(INADDR_ANY);<br style="line-height: normal; ">local.sin_family = AF_INET;<br style="line-height: normal; ">local.sin_port = htons(PORT);<br style="line-height: normal; ">bind(sListen, (struct sockaddr *)&amp;local, sizeof(SOCKADDR_IN));</p><p style="line-height: normal; color: rgb(59, 64, 67); font-family: Georgia; font-size: 12px; letter-spacing: 2px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">// Listen<br style="line-height: normal; ">listen(sListen, 3);</p><p style="line-height: normal; color: rgb(59, 64, 67); font-family: Georgia; font-size: 12px; letter-spacing: 2px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">// Create worker thread<br style="line-height: normal; ">CreateThread(NULL, 0, WorkerThread, NULL, 0, &amp;dwThreadId);</p><p style="line-height: normal; color: rgb(59, 64, 67); font-family: Georgia; font-size: 12px; letter-spacing: 2px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">while (TRUE)<br style="line-height: normal; ">{<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp; // Accept a connection<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp; g_sNewClientConnection = accept(sListen, (struct sockaddr *)&amp;client, &amp;iaddrSize);<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp; g_bNewConnectionArrived = TRUE;<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp; printf("Accepted client:%s:%d\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port));<br style="line-height: normal; ">}<br style="line-height: normal; ">}</p><p style="line-height: normal; color: rgb(59, 64, 67); font-family: Georgia; font-size: 12px; letter-spacing: 2px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">DWORD WINAPI WorkerThread(LPVOID lpParam)<br style="line-height: normal; ">{<br style="line-height: normal; ">LPPER_IO_OPERATION_DATA lpPerIOData = NULL;</p><p style="line-height: normal; color: rgb(59, 64, 67); font-family: Georgia; font-size: 12px; letter-spacing: 2px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">while (TRUE)<br style="line-height: normal; ">{<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp; if (g_bNewConnectionArrived)<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp; {<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Launch an asynchronous operation for new arrived connection<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpPerIOData = (LPPER_IO_OPERATION_DATA)HeapAlloc(<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetProcessHeap(),<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HEAP_ZERO_MEMORY,<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sizeof(PER_IO_OPERATION_DATA));<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpPerIOData-&gt;Buffer.len = MSGSIZE;<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpPerIOData-&gt;Buffer.buf = lpPerIOData-&gt;szMessage;<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpPerIOData-&gt;sClient = g_sNewClientConnection;<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WSARecv(lpPerIOData-&gt;sClient,<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;lpPerIOData-&gt;Buffer,<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1,<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;lpPerIOData-&gt;NumberOfBytesRecvd,<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;lpPerIOData-&gt;Flags,<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;lpPerIOData-&gt;overlap,<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CompletionROUTINE);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g_bNewConnectionArrived = FALSE;<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp; }</p><p style="line-height: normal; color: rgb(59, 64, 67); font-family: Georgia; font-size: 12px; letter-spacing: 2px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">&nbsp;&nbsp;&nbsp; SleepEx(1000, TRUE);<br style="line-height: normal; ">}<br style="line-height: normal; ">return 0;<br style="line-height: normal; ">}</p><p style="line-height: normal; color: rgb(59, 64, 67); font-family: Georgia; font-size: 12px; letter-spacing: 2px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">void CALLBACK CompletionROUTINE(DWORD dwError,<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD cbTransferred,<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LPWSAOVERLAPPED lpOverlapped,<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD dwFlags)<br style="line-height: normal; ">{<br style="line-height: normal; ">LPPER_IO_OPERATION_DATA lpPerIOData = (LPPER_IO_OPERATION_DATA)lpOverlapped;<br style="line-height: normal; "><br style="line-height: normal; ">if (dwError != 0 || cbTransferred == 0)<br style="line-height: normal; ">{<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp; // Connection was closed by client<br style="line-height: normal; ">closesocket(lpPerIOData-&gt;sClient);<br style="line-height: normal; ">HeapFree(GetProcessHeap(), 0, lpPerIOData);<br style="line-height: normal; ">}<br style="line-height: normal; ">else<br style="line-height: normal; ">{<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp; lpPerIOData-&gt;szMessage[cbTransferred] = '\0';<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp; send(lpPerIOData-&gt;sClient, lpPerIOData-&gt;szMessage, cbTransferred, 0);<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp; // Launch another asynchronous operation<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp; memset(&amp;lpPerIOData-&gt;overlap, 0, sizeof(WSAOVERLAPPED));<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp; lpPerIOData-&gt;Buffer.len = MSGSIZE;<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp; lpPerIOData-&gt;Buffer.buf = lpPerIOData-&gt;szMessage;&nbsp;&nbsp;&nbsp;</p><p style="line-height: normal; color: rgb(59, 64, 67); font-family: Georgia; font-size: 12px; letter-spacing: 2px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">&nbsp;&nbsp;&nbsp; WSARecv(lpPerIOData-&gt;sClient,<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;lpPerIOData-&gt;Buffer,<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1,<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;lpPerIOData-&gt;NumberOfBytesRecvd,<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;lpPerIOData-&gt;Flags,<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;lpPerIOData-&gt;overlap,<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CompletionROUTINE);<br style="line-height: normal; ">}<br style="line-height: normal; ">}</p><p style="line-height: normal; color: rgb(59, 64, 67); font-family: Georgia; font-size: 12px; letter-spacing: 2px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">用完成例程来实现重叠I/O比用事件通知简单得多。在这个模型中，主线程只用不停的接受连接即可；辅助线程判断有没有新的客户端连接被建立，如果有，就为那个客户端套接字激活一个异步的WSARecv操作，然后调用SleepEx使线程处于一种可警告的等待状态，以使得I/O完成后CompletionROUTINE可以被内核调用。如果辅助线程不调用SleepEx，则内核在完成一次I/O操作后，无法调用完成例程（因为完成例程的运行应该和当初激活WSARecv异步操作的代码在同一个线程之内）。<br style="line-height: normal; ">完成例程内的实现代码比较简单，它取出接收到的数据，然后将数据原封不动的发送给客户端，最后重新激活另一个WSARecv异步操作。注意，在这里用到了&#8220;尾随数据&#8221;。我们在调用WSARecv的时候，参数lpOverlapped实际上指向一个比它大得多的结构PER_IO_OPERATION_DATA，这个结构除了WSAOVERLAPPED以外，还被我们附加了缓冲区的结构信息，另外还包括客户端套接字等重要的信息。这样，在完成例程中通过参数lpOverlapped拿到的不仅仅是WSAOVERLAPPED结构，还有后边尾随的包含客户端套接字和接收数据缓冲区等重要信息。这样的C语言技巧在我后面介绍完成端口的时候还会使用到。</p><p style="line-height: normal; color: rgb(59, 64, 67); font-family: Georgia; font-size: 12px; letter-spacing: 2px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">五.完成端口模型<br style="line-height: normal; ">&#8220;完成端口&#8221;模型是迄今为止最为复杂的一种I/O模型。然而，假若一个应用程序同时需要管理为数众多的套接字，那么采用这种模型，往往可以达到最佳的系统性能！但不幸的是，该模型只适用于Windows NT和Windows 2000操作系统。因其设计的复杂性，只有在你的应用程序需要同时管理数百乃至上千个套接字的时候，而且希望随着系统内安装的CPU数量的增多，应用程序的性能也可以线性提升，才应考虑采用&#8220;完成端口&#8221;模型。要记住的一个基本准则是，假如要为Windows NT或Windows 2000开发高性能的服务器应用，同时希望为大量套接字I/O请求提供服务（Web服务器便是这方面的典型例子），那么I/O完成端口模型便是最佳选择！（节选自《Windows网络编程》第八章）<br style="line-height: normal; ">完成端口模型是我最喜爱的一种模型。虽然其实现比较复杂（其实我觉得它的实现比用事件通知实现的重叠I/O简单多了），但其效率是惊人的。我在T公司的时候曾经帮同事写过一个邮件服务器的性能测试程序，用的就是完成端口模型。结果表明，完成端口模型在多连接（成千上万）的情况下，仅仅依靠一两个辅助线程，就可以达到非常高的吞吐量。下面我还是从代码说起：<br style="line-height: normal; ">#include &lt;WINSOCK2.H&gt;<br style="line-height: normal; ">#include &lt;stdio.h&gt;</p><p style="line-height: normal; color: rgb(59, 64, 67); font-family: Georgia; font-size: 12px; letter-spacing: 2px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">#define PORT&nbsp;&nbsp;&nbsp; 5150<br style="line-height: normal; ">#define MSGSIZE 1024</p><p style="line-height: normal; color: rgb(59, 64, 67); font-family: Georgia; font-size: 12px; letter-spacing: 2px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">#pragma comment(lib, "ws2_32.lib")</p><p style="line-height: normal; color: rgb(59, 64, 67); font-family: Georgia; font-size: 12px; letter-spacing: 2px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">typedef enum<br style="line-height: normal; ">{<br style="line-height: normal; ">RECV_POSTED<br style="line-height: normal; ">}OPERATION_TYPE;</p><p style="line-height: normal; color: rgb(59, 64, 67); font-family: Georgia; font-size: 12px; letter-spacing: 2px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">typedef struct<br style="line-height: normal; ">{<br style="line-height: normal; ">WSAOVERLAPPED overlap;<br style="line-height: normal; ">WSABUF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Buffer;<br style="line-height: normal; ">char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; szMessage[MSGSIZE];<br style="line-height: normal; ">DWORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NumberOfBytesRecvd;<br style="line-height: normal; ">DWORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Flags;<br style="line-height: normal; ">OPERATION_TYPE OperationType;<br style="line-height: normal; ">}PER_IO_OPERATION_DATA, *LPPER_IO_OPERATION_DATA;</p><p style="line-height: normal; color: rgb(59, 64, 67); font-family: Georgia; font-size: 12px; letter-spacing: 2px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">DWORD WINAPI WorkerThread(LPVOID);</p><p style="line-height: normal; color: rgb(59, 64, 67); font-family: Georgia; font-size: 12px; letter-spacing: 2px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">int main()<br style="line-height: normal; ">{<br style="line-height: normal; ">WSADATA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wsaData;<br style="line-height: normal; ">SOCKET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sListen, sClient;<br style="line-height: normal; ">SOCKADDR_IN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; local, client;<br style="line-height: normal; ">DWORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i, dwThreadId;<br style="line-height: normal; ">int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iaddrSize = sizeof(SOCKADDR_IN);<br style="line-height: normal; ">HANDLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CompletionPort = INVALID_HANDLE_VALUE;<br style="line-height: normal; ">SYSTEM_INFO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; systeminfo;<br style="line-height: normal; ">LPPER_IO_OPERATION_DATA lpPerIOData = NULL;</p><p style="line-height: normal; color: rgb(59, 64, 67); font-family: Georgia; font-size: 12px; letter-spacing: 2px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">// Initialize Windows Socket library<br style="line-height: normal; ">WSAStartup(0x0202, &amp;wsaData);</p><p style="line-height: normal; color: rgb(59, 64, 67); font-family: Georgia; font-size: 12px; letter-spacing: 2px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">// Create completion port<br style="line-height: normal; ">CompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);</p><p style="line-height: normal; color: rgb(59, 64, 67); font-family: Georgia; font-size: 12px; letter-spacing: 2px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">// Create worker thread<br style="line-height: normal; ">GetSystemInfo(&amp;systeminfo);<br style="line-height: normal; ">for (i = 0; i &lt; systeminfo.dwNumberOfProcessors; i++)<br style="line-height: normal; ">{<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp; CreateThread(NULL, 0, WorkerThread, CompletionPort, 0, &amp;dwThreadId);<br style="line-height: normal; ">}<br style="line-height: normal; "><br style="line-height: normal; ">// Create listening socket<br style="line-height: normal; ">sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);</p><p style="line-height: normal; color: rgb(59, 64, 67); font-family: Georgia; font-size: 12px; letter-spacing: 2px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">// Bind<br style="line-height: normal; ">local.sin_addr.S_un.S_addr = htonl(INADDR_ANY);<br style="line-height: normal; ">local.sin_family = AF_INET;<br style="line-height: normal; ">local.sin_port = htons(PORT);<br style="line-height: normal; ">bind(sListen, (struct sockaddr *)&amp;local, sizeof(SOCKADDR_IN));</p><p style="line-height: normal; color: rgb(59, 64, 67); font-family: Georgia; font-size: 12px; letter-spacing: 2px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">// Listen<br style="line-height: normal; ">listen(sListen, 3);</p><p style="line-height: normal; color: rgb(59, 64, 67); font-family: Georgia; font-size: 12px; letter-spacing: 2px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">while (TRUE)<br style="line-height: normal; ">{<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp; // Accept a connection<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp; sClient = accept(sListen, (struct sockaddr *)&amp;client, &amp;iaddrSize);<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp; printf("Accepted client:%s:%d\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port));</p><p style="line-height: normal; color: rgb(59, 64, 67); font-family: Georgia; font-size: 12px; letter-spacing: 2px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">&nbsp;&nbsp;&nbsp; // Associate the newly arrived client socket with completion port<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp; CreateIoCompletionPort((HANDLE)sClient, CompletionPort, (DWORD)sClient, 0);<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp; // Launch an asynchronous operation for new arrived connection<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp; lpPerIOData = (LPPER_IO_OPERATION_DATA)HeapAlloc(<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetProcessHeap(),<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HEAP_ZERO_MEMORY,<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sizeof(PER_IO_OPERATION_DATA));<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp; lpPerIOData-&gt;Buffer.len = MSGSIZE;<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp; lpPerIOData-&gt;Buffer.buf = lpPerIOData-&gt;szMessage;<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp; lpPerIOData-&gt;OperationType = RECV_POSTED;<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp; WSARecv(sClient,<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;lpPerIOData-&gt;Buffer,<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1,<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;lpPerIOData-&gt;NumberOfBytesRecvd,<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;lpPerIOData-&gt;Flags,<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;lpPerIOData-&gt;overlap,<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL);<br style="line-height: normal; ">}</p><p style="line-height: normal; color: rgb(59, 64, 67); font-family: Georgia; font-size: 12px; letter-spacing: 2px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">PostQueuedCompletionStatus(CompletionPort, 0xFFFFFFFF, 0, NULL);<br style="line-height: normal; ">CloseHandle(CompletionPort);<br style="line-height: normal; ">closesocket(sListen);<br style="line-height: normal; ">WSACleanup();<br style="line-height: normal; ">return 0;<br style="line-height: normal; ">}</p><p style="line-height: normal; color: rgb(59, 64, 67); font-family: Georgia; font-size: 12px; letter-spacing: 2px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">DWORD WINAPI WorkerThread(LPVOID CompletionPortID)<br style="line-height: normal; ">{<br style="line-height: normal; ">HANDLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CompletionPort=(HANDLE)CompletionPortID;<br style="line-height: normal; ">DWORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dwBytesTransferred;<br style="line-height: normal; ">SOCKET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sClient;<br style="line-height: normal; ">LPPER_IO_OPERATION_DATA lpPerIOData = NULL;</p><p style="line-height: normal; color: rgb(59, 64, 67); font-family: Georgia; font-size: 12px; letter-spacing: 2px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">while (TRUE)<br style="line-height: normal; ">{<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp; GetQueuedCompletionStatus(<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CompletionPort,<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;dwBytesTransferred,<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;sClient,<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (LPOVERLAPPED *)&amp;lpPerIOData,<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INFINITE);<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp; if (dwBytesTransferred == 0xFFFFFFFF)<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp; {<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp; }<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp; if (lpPerIOData-&gt;OperationType == RECV_POSTED)<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp; {<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (dwBytesTransferred == 0)<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Connection was closed by client<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; closesocket(sClient);<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HeapFree(GetProcessHeap(), 0, lpPerIOData);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpPerIOData-&gt;szMessage[dwBytesTransferred] = '\0';<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send(sClient, lpPerIOData-&gt;szMessage, dwBytesTransferred, 0);<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Launch another asynchronous operation for sClient<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(lpPerIOData, 0, sizeof(PER_IO_OPERATION_DATA));<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpPerIOData-&gt;Buffer.len = MSGSIZE;<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpPerIOData-&gt;Buffer.buf = lpPerIOData-&gt;szMessage;<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpPerIOData-&gt;OperationType = RECV_POSTED;<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WSARecv(sClient,<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;lpPerIOData-&gt;Buffer,<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1,<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;lpPerIOData-&gt;NumberOfBytesRecvd,<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;lpPerIOData-&gt;Flags,<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;lpPerIOData-&gt;overlap,<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL);<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp; }<br style="line-height: normal; ">}<br style="line-height: normal; ">return 0;<br style="line-height: normal; ">}</p><p style="line-height: normal; color: rgb(59, 64, 67); font-family: Georgia; font-size: 12px; letter-spacing: 2px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><br style="line-height: normal; ">首先，说说主线程：<br style="line-height: normal; ">1.创建完成端口对象<br style="line-height: normal; ">2.创建工作者线程（这里工作者线程的数量是按照CPU的个数来决定的，这样可以达到最佳性能）<br style="line-height: normal; ">3.创建监听套接字，绑定，监听，然后程序进入循环<br style="line-height: normal; ">4.在循环中，我做了以下几件事情：<br style="line-height: normal; ">(1).接受一个客户端连接<br style="line-height: normal; ">(2).将该客户端套接字与完成端口绑定到一起(还是调用CreateIoCompletionPort，但这次的作用不同)，注意，按道理来讲，此时传递给CreateIoCompletionPort的第三个参数应该是一个完成键，一般来讲，程序都是传递一个单句柄数据结构的地址，该单句柄数据包含了和该客户端连接有关的信息，由于我们只关心套接字句柄，所以直接将套接字句柄作为完成键传递；<br style="line-height: normal; ">(3).触发一个WSARecv异步调用，这次又用到了&#8220;尾随数据&#8221;，使接收数据所用的缓冲区紧跟在WSAOVERLAPPED对象之后，此外，还有操作类型等重要信息。<br style="line-height: normal; "><br style="line-height: normal; ">在工作者线程的循环中，我们<br style="line-height: normal; ">1.调用GetQueuedCompletionStatus取得本次I/O的相关信息（例如套接字句柄、传送的字节数、单I/O数据结构的地址等等）<br style="line-height: normal; ">2.通过单I/O数据结构找到接收数据缓冲区，然后将数据原封不动的发送到客户端<br style="line-height: normal; ">3.再次触发一个WSARecv异步操作</p><p style="line-height: normal; color: rgb(59, 64, 67); font-family: Georgia; font-size: 12px; letter-spacing: 2px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">六.五种I/O模型的比较<br style="line-height: normal; ">我会从以下几个方面来进行比较<br style="line-height: normal; ">*有无每线程64连接数限制<br style="line-height: normal; ">如果在选择模型中没有重新定义FD_SETSIZE宏，则每个fd_set默认可以装下64个SOCKET。同样的，受MAXIMUM_WAIT_OBJECTS宏的影响，事件选择、用事件通知实现的重叠I/O都有每线程最大64连接数限制。如果连接数成千上万，则必须对客户端套接字进行分组，这样，势必增加程序的复杂度。<br style="line-height: normal; ">相反，异步选择、用完成例程实现的重叠I/O和完成端口不受此限制。</p><p style="line-height: normal; color: rgb(59, 64, 67); font-family: Georgia; font-size: 12px; letter-spacing: 2px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">*线程数<br style="line-height: normal; ">除了异步选择以外，其他模型至少需要2个线程。一个主线程和一个辅助线程。同样的，如果连接数大于64，则选择模型、事件选择和用事件通知实现的重叠I/O的线程数还要增加。</p><p style="line-height: normal; color: rgb(59, 64, 67); font-family: Georgia; font-size: 12px; letter-spacing: 2px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">*实现的复杂度<br style="line-height: normal; ">我的个人看法是，在实现难度上，异步选择&lt;选择&lt;用完成例程实现的重叠I/O&lt;事件选择&lt;完成端口&lt;用事件通知实现的重叠I/O</p><p style="line-height: normal; color: rgb(59, 64, 67); font-family: Georgia; font-size: 12px; letter-spacing: 2px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">*性能<br style="line-height: normal; ">由于选择模型中每次都要重设读集，在select函数返回后还要针对所有套接字进行逐一测试，我的感觉是效率比较差；完成端口和用完成例程实现的重叠I/O基本上不涉及全局数据，效率应该是最高的，而且在多处理器情形下完成端口还要高一些；事件选择和用事件通知实现的重叠I/O在实现机制上都是采用WSAWaitForMultipleEvents，感觉效率差不多；至于异步选择，不好比较。所以我的结论是:选择&lt;用事件通知实现的重叠I/O&lt;事件选择&lt;用完成例程实现的重叠I/O&lt;完成端口</p>
<img src ="http://www.cppblog.com/kenwell/aggbug/122086.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kenwell/" target="_blank">c++ 学习</a> 2010-08-03 17:27 <a href="http://www.cppblog.com/kenwell/archive/2010/08/03/122086.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 很幽默的讲解六种Socket I/O模型(转载）</title><link>http://www.cppblog.com/kenwell/archive/2010/08/03/122069.html</link><dc:creator>c++ 学习</dc:creator><author>c++ 学习</author><pubDate>Tue, 03 Aug 2010 07:50:00 GMT</pubDate><guid>http://www.cppblog.com/kenwell/archive/2010/08/03/122069.html</guid><wfw:comment>http://www.cppblog.com/kenwell/comments/122069.html</wfw:comment><comments>http://www.cppblog.com/kenwell/archive/2010/08/03/122069.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kenwell/comments/commentRss/122069.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kenwell/services/trackbacks/122069.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本文简单介绍了当前Windows支持的各种Socket I/O模型，如果你发现其中存在什么错误请务必赐教。一：select模型二：WSAAsyncSelect模型三：WSAEventSelect模型四：Overlapped I/O 事件通知模型五：Overlapped I/O 完成例程模型六：IOCP模型老陈有一个在外地工作的女儿，不能经常回来，老陈和她通过信件联系。他们的信会被邮递员投递到他们的...&nbsp;&nbsp;<a href='http://www.cppblog.com/kenwell/archive/2010/08/03/122069.html'>阅读全文</a><img src ="http://www.cppblog.com/kenwell/aggbug/122069.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kenwell/" target="_blank">c++ 学习</a> 2010-08-03 15:50 <a href="http://www.cppblog.com/kenwell/archive/2010/08/03/122069.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Printing ONE TWO THREE </title><link>http://www.cppblog.com/kenwell/archive/2008/10/11/63760.html</link><dc:creator>c++ 学习</dc:creator><author>c++ 学习</author><pubDate>Sat, 11 Oct 2008 11:51:00 GMT</pubDate><guid>http://www.cppblog.com/kenwell/archive/2008/10/11/63760.html</guid><wfw:comment>http://www.cppblog.com/kenwell/comments/63760.html</wfw:comment><comments>http://www.cppblog.com/kenwell/archive/2008/10/11/63760.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kenwell/comments/commentRss/63760.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kenwell/services/trackbacks/63760.html</trackback:ping><description><![CDATA[<font size="2"><font size="2">- You're given the following program: <br> -------------------------------- <br> int main() <br> { <br> &nbsp; &nbsp; &nbsp;printf("TWO\n"); <br> &nbsp; &nbsp; &nbsp;return 0; <br> } <br> --------------------------------- <br> &nbsp;<br> Add any code above or below the lines so that the output is <br> &nbsp;<br> ONE <br> TWO <br> THREE <br> Give 10 different ways to do this and which of them are specific to C++?<br><br>: just comment it out (already mentioned)<br>#include &lt;iostream&gt;<br>int main() { std::cout &lt;&lt; "ONE\nTWO\nTHREE\n"; return 0; }<br>/*<br>...<br>*/<br>&nbsp;<br>2: use #if or #ifdef<br>#include &lt;iostream&gt;<br>#ifdef foo<br>...<br>#else<br>int main() { std::cout &lt;&lt; "ONE\nTWO\nTHREE\n"; return 0; }<br>#endif<br>&nbsp;<br>3: redefine printf (already mentioned)<br>#include &lt;iostream&gt;<br>#define printf(foo) std::cout &lt;&lt; "ONE\n" &lt;&lt; foo &lt;&lt; "THREE\n";<br>...<br>&nbsp;<br>4: overload printf (already mentioned, c++ specific)<br>void printf(const char * s);<br>...<br>#include &lt;iostream&gt;<br>void printf(const char * s) { std::cout &lt;&lt; "ONE\n" &lt;&lt; s &lt;&lt; "THREE\n"; }<br>&nbsp;<br>5: template printf (c++ specific)<br>void foo(const char * s);<br>template&lt;typename T&gt; void printf(T s) { foo(s); }<br>...<br>#include &lt;iostream&gt;<br>void foo(const char * s) { std::cout &lt;&lt; "ONE\n" &lt;&lt; s &lt;&lt; "THRE\n"; }<br>&nbsp;<br>6: redefine main<br>#include &lt;iostream&gt;<br>int foo();<br>int main() {std::cout &lt;&lt; "ONE\n"; foo(); std::cout &lt;&lt; "THREE\n"; return 0; }<br>#define main foo<br>...<br>&nbsp;<br>7: put main in a namespace (c++ specific)<br>#include &lt;iostream&gt;<br>namespace foo {<br>...<br>};<br>int main() { std::cout &lt;&lt; "ONE\n"; foo::main(); std::cout &lt;&lt; "THREE\n"; return 0; }<br>&nbsp;<br>8: put main in a class or struct (c++ specific)<br>#include &lt;iostream&gt;<br>struct foo {<br>...<br>};<br>int main() { foo bar; std::cout &lt;&lt; "ONE\n"; bar.main(); std::cout &lt;&lt; "THREE\n"; return 0; }<br>&nbsp;<br>9: use #define to remove keywords<br>#include &lt;iostream&gt;<br>int main() {<br>&nbsp; printf("ONE\n");<br>#define main() do<br>#define return<br>#define int<br>...<br>&nbsp;while (!printf("THREE\n"));<br>#undef return<br>&nbsp; return 0;<br>}<br>&nbsp;<br>10: abuse a class or struct constructor (c++ specific)<br>struct printf { printf(const char * s); };<br>...<br>#include &lt;iostream&gt;<br>printf::printf(const char * s) { std::cout &lt;&lt; "ONE\n" &lt;&lt; s &lt;&lt; "THREE\n"; }<br>&nbsp;<br></font></font><img src ="http://www.cppblog.com/kenwell/aggbug/63760.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kenwell/" target="_blank">c++ 学习</a> 2008-10-11 19:51 <a href="http://www.cppblog.com/kenwell/archive/2008/10/11/63760.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ubuntu命令行修改网络配置方法</title><link>http://www.cppblog.com/kenwell/archive/2008/07/22/56832.html</link><dc:creator>c++ 学习</dc:creator><author>c++ 学习</author><pubDate>Tue, 22 Jul 2008 02:41:00 GMT</pubDate><guid>http://www.cppblog.com/kenwell/archive/2008/07/22/56832.html</guid><wfw:comment>http://www.cppblog.com/kenwell/comments/56832.html</wfw:comment><comments>http://www.cppblog.com/kenwell/archive/2008/07/22/56832.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kenwell/comments/commentRss/56832.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kenwell/services/trackbacks/56832.html</trackback:ping><description><![CDATA[<div class="postentry">
<p>/etc/network/interfaces<br>打开后里面可设置DHCP或手动设置静态ip。前面auto eth0，让网卡开机自动挂载.</p>
<p><strong>1. </strong><strong>以DHCP方式</strong><strong>配置</strong><strong>网卡</strong></p>
<p>编辑文件/etc/network/interfaces:<br><code><font face="新宋体">sudo vi /etc/network/interfaces</font></code></p>
<p>并用下面的行来替换有关eth0的行:<br><code><font face="新宋体"># The primary network interface - use DHCP to find our address<br>auto eth0<br>iface eth0 inet dhcp</font></code></p>
<p>用下面的命令使网络设置生效:<br><font face="新宋体"><code>sudo /etc/init.d/networking restart</code><br></font>也可以在命令行下直接输入下面的命令来获取地址</p>
<p><font face="新宋体"><code>sudo dhclient eth0</code><br></font><strong><br>2. 为网卡配置静态IP地址</strong></p>
<p>编辑文件/etc/network/interfaces:</p>
<p><code><font face="新宋体">sudo vi /etc/network/interfaces</font></code></p>
<p>并用下面的行来替换有关eth0的行:# The primary network interface<br><code><font face="新宋体">auto eth0<br>iface eth0 inet static<br>address 192.168.3.90<br>gateway 192.168.3.1<br>netmask 255.255.255.0<br>#network 192.168.3.0<br>#broadcast 192.168.3.255</font></code></p>
<p>将上面的ip地址等信息换成你自己就可以了.用下面的命令使网络设置生效:<br><code><font face="新宋体">sudo /etc/init.d/networking restart</font></code></p>
<p><strong>3. 设定第二个IP地址(虚拟IP地址)</strong></p>
<p>编辑文件/etc/network/interfaces:</p>
<p><code><font face="新宋体">sudo vi /etc/network/interfaces</font></code></p>
<p>在该文件中添加如下的行:<br><code><font face="新宋体">auto eth0:1<br>iface eth0:1 inet static<br>address 192.168.1.60<br>netmask 255.255.255.0<br>network x.x.x.x<br>broadcast x.x.x.x<br>gateway x.x.x.x</font></code></p>
<p>根据你的情况填上所有诸如address,netmask,network,broadcast和gateways等信息.<br>用下面的命令使网络设置生效:<br><code><font face="新宋体">sudo /etc/init.d/networking restart</font></code></p>
<p><strong>4. 设置主机名称(hostname)</strong></p>
<p>使用下面的命令来查看当前主机的主机名称:</p>
<p><code><font face="新宋体">sudo /bin/hostname</font></code></p>
<p>使用下面的命令来设置当前主机的主机名称:<br><code><br><font face="新宋体">sudo /bin/hostname newname</font></code></p>
<p>系统启动时,它会从/etc/hostname来读取主机的名称.</p>
<p>关于设置主机名称的更多信息,请访问<a  href="http://www.debianadmin.com/change-hostname-or-server-name-of-a-linux-machine.html" target="_blank"><font color="#0000ff">这里</font></a></p>
<p><strong>5. 配置DNS</strong></p>
<p>首先,你可以在/etc/hosts中加入一些主机名称和这些主机名称对应的IP地址,这是简单使用本机的静态查询.</p>
<p>要访问DNS 服务器来进行查询,需要设置/etc/resolv.conf文件.<br>假设DNS服务器的IP地址是192.168.3.2, 那么/etc/resolv.conf文件的内容应为:</p>
<p><code><font face="新宋体">search test.com<br>nameserver 192.168.3.2</font></code></p>
</div>
<p class="postmeta">2008年02月15日 星期五 于 10:07 am &#183; 发表在: <a  href="http://my.donews.com/wucr/category/unixlinux/" title="显示Unix/Linux的所有文章" rel="category tag"><font color="#0000ff">Unix/Linux</font></a> </p>
<div class="postentry">
<p>/etc/network/interfaces<br>打开后里面可设置DHCP或手动设置静态ip。前面auto eth0，让网卡开机自动挂载.</p>
<p><strong>1. </strong><strong>以DHCP方式</strong><strong>配置</strong><strong>网卡</strong></p>
<p>编辑文件/etc/network/interfaces:<br><code><font face="新宋体">sudo vi /etc/network/interfaces</font></code></p>
<p>并用下面的行来替换有关eth0的行:<br><code><font face="新宋体"># The primary network interface - use DHCP to find our address<br>auto eth0<br>iface eth0 inet dhcp</font></code></p>
<p>用下面的命令使网络设置生效:<br><font face="新宋体"><code>sudo /etc/init.d/networking restart</code><br></font>也可以在命令行下直接输入下面的命令来获取地址</p>
<p><font face="新宋体"><code>sudo dhclient eth0</code><br></font><strong><br>2. 为网卡配置静态IP地址</strong></p>
<p>编辑文件/etc/network/interfaces:</p>
<p><code><font face="新宋体">sudo vi /etc/network/interfaces</font></code></p>
<p>并用下面的行来替换有关eth0的行:# The primary network interface<br><code><font face="新宋体">auto eth0<br>iface eth0 inet static<br>address 192.168.3.90<br>gateway 192.168.3.1<br>netmask 255.255.255.0<br>#network 192.168.3.0<br>#broadcast 192.168.3.255</font></code></p>
<p>将上面的ip地址等信息换成你自己就可以了.用下面的命令使网络设置生效:<br><code><font face="新宋体">sudo /etc/init.d/networking restart</font></code></p>
<p><strong>3. 设定第二个IP地址(虚拟IP地址)</strong></p>
<p>编辑文件/etc/network/interfaces:</p>
<p><code><font face="新宋体">sudo vi /etc/network/interfaces</font></code></p>
<p>在该文件中添加如下的行:<br><code><font face="新宋体">auto eth0:1<br>iface eth0:1 inet static<br>address 192.168.1.60<br>netmask 255.255.255.0<br>network x.x.x.x<br>broadcast x.x.x.x<br>gateway x.x.x.x</font></code></p>
<p>根据你的情况填上所有诸如address,netmask,network,broadcast和gateways等信息.<br>用下面的命令使网络设置生效:<br><code><font face="新宋体">sudo /etc/init.d/networking restart</font></code></p>
<p><strong>4. 设置主机名称(hostname)</strong></p>
<p>使用下面的命令来查看当前主机的主机名称:</p>
<p><code><font face="新宋体">sudo /bin/hostname</font></code></p>
<p>使用下面的命令来设置当前主机的主机名称:<br><code><br><font face="新宋体">sudo /bin/hostname newname</font></code></p>
<p>系统启动时,它会从/etc/hostname来读取主机的名称.</p>
<p>关于设置主机名称的更多信息,请访问<a  href="http://www.debianadmin.com/change-hostname-or-server-name-of-a-linux-machine.html" target="_blank"><font color="#0000ff">这里</font></a></p>
<p><strong>5. 配置DNS</strong></p>
<p>首先,你可以在/etc/hosts中加入一些主机名称和这些主机名称对应的IP地址,这是简单使用本机的静态查询.</p>
<p>要访问DNS 服务器来进行查询,需要设置/etc/resolv.conf文件.<br>假设DNS服务器的IP地址是192.168.3.2, 那么/etc/resolv.conf文件的内容应为:</p>
<p><code><font face="新宋体">search test.com<br>nameserver 192.168.3.2</font></code></p>
</div><img src ="http://www.cppblog.com/kenwell/aggbug/56832.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kenwell/" target="_blank">c++ 学习</a> 2008-07-22 10:41 <a href="http://www.cppblog.com/kenwell/archive/2008/07/22/56832.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++ 中用IXMLHTTPRequest向服务器post Xml数据</title><link>http://www.cppblog.com/kenwell/archive/2008/05/21/50663.html</link><dc:creator>c++ 学习</dc:creator><author>c++ 学习</author><pubDate>Wed, 21 May 2008 10:41:00 GMT</pubDate><guid>http://www.cppblog.com/kenwell/archive/2008/05/21/50663.html</guid><wfw:comment>http://www.cppblog.com/kenwell/comments/50663.html</wfw:comment><comments>http://www.cppblog.com/kenwell/archive/2008/05/21/50663.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kenwell/comments/commentRss/50663.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kenwell/services/trackbacks/50663.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">iostream</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#import&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">msxml4.dll</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;SendData(std::wstring&nbsp;url,&nbsp;std::wstring&nbsp;username,&nbsp;std::wstring&nbsp;password)<br>{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;HRESULT&nbsp;hr;<br>&nbsp;&nbsp;&nbsp;&nbsp;MSXML2::IXMLHTTPRequestPtr&nbsp;pIXMLHTTPRequest;<br>&nbsp;&nbsp;&nbsp;&nbsp;MSXML2::IXMLDOMDocumentPtr&nbsp;pXMLDoc;<br>&nbsp;&nbsp;&nbsp;&nbsp;std::wstring&nbsp;wvarQuery(L</span><span style="color: #000000;">"</span><span style="color: #000000;">username=</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;wvarQuery.append(username);<br>&nbsp;&nbsp;&nbsp;&nbsp;wvarQuery.append(L</span><span style="color: #000000;">"</span><span style="color: #000000;">&amp;password=</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;wvarQuery.append(password);<br>&nbsp;&nbsp;&nbsp;&nbsp;_variant_t&nbsp;vartQueryFields(wvarQuery.c_str());<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CoInitialize(NULL);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hr</span><span style="color: #000000;">=</span><span style="color: #000000;">pIXMLHTTPRequest.CreateInstance(__uuidof(MSXML2::XMLHTTP));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUCCEEDED(hr)&nbsp;</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;:&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;hr;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hr</span><span style="color: #000000;">=</span><span style="color: #000000;">pIXMLHTTPRequest</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">open(</span><span style="color: #000000;">"</span><span style="color: #000000;">POST</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;url.c_str(),&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUCCEEDED(hr)&nbsp;</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;:&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;hr;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">如果要向服务器post数据，这个地方一定要设置为application/x-www-form-urlencoded</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pIXMLHTTPRequest</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">setRequestHeader(</span><span style="color: #000000;">"</span><span style="color: #000000;">Content-Type</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">application/x-www-form-urlencoded</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pIXMLHTTPRequest</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">send(&nbsp;vartQueryFields&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUCCEEDED(hr)&nbsp;</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;:&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;hr;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">拿到返回来的xml数据</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pXMLDoc</span><span style="color: #000000;">=</span><span style="color: #000000;">pIXMLHTTPRequest</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">responseXML;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">后面就是对拿回来的xml数据进行解析，主要是dom方法</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">(<img src="http://www.cppblog.com/Images/dot.gif">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(pIXMLHTTPRequest)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pIXMLHTTPRequest.Release();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(pXMLDoc)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pXMLDoc.Release();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CoUninitialize();<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br><br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;SendData(L</span><span style="color: #000000;">"</span><span style="color: #000000;">http://localhost/login.php</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;L</span><span style="color: #000000;">"</span><span style="color: #000000;">kenwell</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;L</span><span style="color: #000000;">"</span><span style="color: #000000;">kenwell</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>}</span></div>
<br><img src ="http://www.cppblog.com/kenwell/aggbug/50663.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kenwell/" target="_blank">c++ 学习</a> 2008-05-21 18:41 <a href="http://www.cppblog.com/kenwell/archive/2008/05/21/50663.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++ string 和wstring 之间的互相转换函数</title><link>http://www.cppblog.com/kenwell/archive/2008/05/21/50661.html</link><dc:creator>c++ 学习</dc:creator><author>c++ 学习</author><pubDate>Wed, 21 May 2008 10:23:00 GMT</pubDate><guid>http://www.cppblog.com/kenwell/archive/2008/05/21/50661.html</guid><wfw:comment>http://www.cppblog.com/kenwell/comments/50661.html</wfw:comment><comments>http://www.cppblog.com/kenwell/archive/2008/05/21/50661.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/kenwell/comments/commentRss/50661.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kenwell/services/trackbacks/50661.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>std::</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;ws2s(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;std::wstring</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;ws)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;std::</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;curLocale&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;setlocale(LC_ALL,&nbsp;NULL);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;curLocale&nbsp;=&nbsp;"C";</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;setlocale(LC_ALL,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">chs</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;wchar_t</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;_Source&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ws.c_str();<br>&nbsp;&nbsp;&nbsp;&nbsp;size_t&nbsp;_Dsize&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;ws.size()&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">_Dest&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">[_Dsize];<br>&nbsp;&nbsp;&nbsp;&nbsp;memset(_Dest,</span><span style="color: #000000;">0</span><span style="color: #000000;">,_Dsize);<br>&nbsp;&nbsp;&nbsp;&nbsp;wcstombs(_Dest,_Source,_Dsize);<br>&nbsp;&nbsp;&nbsp;&nbsp;std::</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;_Dest;<br>&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;[]_Dest;<br>&nbsp;&nbsp;&nbsp;&nbsp;setlocale(LC_ALL,&nbsp;curLocale.c_str());<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;result;<br>}<br><br>std::wstring&nbsp;s2ws(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;std::</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;s)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;setlocale(LC_ALL,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">chs</span><span style="color: #000000;">"</span><span style="color: #000000;">);&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;_Source&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;s.c_str();<br>&nbsp;&nbsp;&nbsp;&nbsp;size_t&nbsp;_Dsize&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;s.size()&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;wchar_t&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">_Dest&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;wchar_t[_Dsize];<br>&nbsp;&nbsp;&nbsp;&nbsp;wmemset(_Dest,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;_Dsize);<br>&nbsp;&nbsp;&nbsp;&nbsp;mbstowcs(_Dest,_Source,_Dsize);<br>&nbsp;&nbsp;&nbsp;&nbsp;std::wstring&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;_Dest;<br>&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;[]_Dest;<br>&nbsp;&nbsp;&nbsp;&nbsp;setlocale(LC_ALL,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">C</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;result;<br>}<br></span></div>
<br>这些都是最近自己在开发项目中用到的<br><img src ="http://www.cppblog.com/kenwell/aggbug/50661.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kenwell/" target="_blank">c++ 学习</a> 2008-05-21 18:23 <a href="http://www.cppblog.com/kenwell/archive/2008/05/21/50661.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++经典书籍推荐和下载</title><link>http://www.cppblog.com/kenwell/archive/2007/10/24/35065.html</link><dc:creator>c++ 学习</dc:creator><author>c++ 学习</author><pubDate>Wed, 24 Oct 2007 08:45:00 GMT</pubDate><guid>http://www.cppblog.com/kenwell/archive/2007/10/24/35065.html</guid><wfw:comment>http://www.cppblog.com/kenwell/comments/35065.html</wfw:comment><comments>http://www.cppblog.com/kenwell/archive/2007/10/24/35065.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/kenwell/comments/commentRss/35065.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kenwell/services/trackbacks/35065.html</trackback:ping><description><![CDATA[给学习c++的新手，这些书籍都是很经典的。经典中的经典<br>深度探索C++对象模型<br>英文版:http://www.nengxia.com/soft.asp?id=5<br>中文版：http://www.nengxia.com/soft.asp?id=19<br><br>Modern C++ Design<br>http://www.nengxia.com/soft.asp?id=7<br><br>c++编程思想<br>第一卷：<br>中文版:http://www.nengxia.com/soft.asp?id=1039<br>英文版： Prentice Hall Bruce Eckel Thinking In C++, Second EditionVolume.1<br>第二卷：<br>中文版：http://www.nengxia.com/soft.asp?id=1040<br>英文版：http://www.nengxia.com/soft.asp?id=1041<br><br><br>c++ Programming language <br>中文版：http://www.nengxia.com/soft.asp?id=1038<br>英文版：http://www.nengxia.com/soft.asp?id=368 <br><br>C++ Primer<br>第三版中文版：http://www.nengxia.com/soft.asp?id=6<br>第四版<br>英文版：http://www.nengxia.com/soft.asp?id=117<br>中文版：http://www.nengxia.com/soft.asp?id=635<br>c++ primer 题解<br>http://www.nengxia.com/soft.asp?id=17<br><br><br>C++ Primer plus 第4版中文：<br>中文版：http://www.nengxia.com/soft.asp?id=987<br>英文版：<br>Third.Editionhttp://www.nengxia.com/soft.asp?id=1037<br>Special.Edition：http://www.nengxia.com/soft.asp?id=369<br><br><br>Effective C++<br>中文版：http://www.nengxia.com/soft.asp?id=9<br>英文版：http://www.nengxia.com/soft.asp?id=1033<br><br>More Effective C++<br>中文版：http://www.nengxia.com/soft.asp?id=8<br><br>STL源码剖析<br>http://www.nengxia.com/soft.asp?id=11<br><br><br>c++ template<br>英文版：<br>http://www.nengxia.com/soft.asp?id=1034<br>简体中文版：<br>http://www.nengxia.com/soft.asp?id=15<br>繁体中文版：<br>http://www.nengxia.com/soft.asp?id=16<br><br>Effective STL<br>http://www.nengxia.com/soft.asp?id=54<br><br>c++ 标准库<br>http://www.nengxia.com/soft.asp?id=47<br><br>Exception c++<br>中文版：http://www.nengxia.com/soft.asp?id=1035<br>英文版：http://www.nengxia.com/soft.asp?id=18<br><br>More Excetption c++<br>英文版：http://www.nengxia.com/soft.asp?id=20<br><br>C++ Coding Standards:<br>http://www.nengxia.com/soft.asp?id=114<br><br>STL轻松入门<br>http://www.nengxia.com/soft.asp?id=162<br><br>c/c++标准函数库 中文版<br>http://www.nengxia.com/soft.asp?id=641<br><br>the design and evolution of c++<br>英文版：http://nengxia.com/soft.asp?id=1042<br><br>高质量C++编程指南<br>http://www.nengxia.com/soft.asp?id=1043<br><br><br><br><img src ="http://www.cppblog.com/kenwell/aggbug/35065.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kenwell/" target="_blank">c++ 学习</a> 2007-10-24 16:45 <a href="http://www.cppblog.com/kenwell/archive/2007/10/24/35065.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>上海交通大学2006年复试上机题 (转）</title><link>http://www.cppblog.com/kenwell/archive/2006/03/31/4862.html</link><dc:creator>c++ 学习</dc:creator><author>c++ 学习</author><pubDate>Fri, 31 Mar 2006 11:16:00 GMT</pubDate><guid>http://www.cppblog.com/kenwell/archive/2006/03/31/4862.html</guid><wfw:comment>http://www.cppblog.com/kenwell/comments/4862.html</wfw:comment><comments>http://www.cppblog.com/kenwell/archive/2006/03/31/4862.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kenwell/comments/commentRss/4862.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kenwell/services/trackbacks/4862.html</trackback:ping><description><![CDATA[
		<div>本题目是懒猪一字一字敲上电脑的，转载请尊重懒猪的劳动成果，注明转自懒猪的窝窝<a href="http://spaces.msn.com/davidblogs/">http://spaces.msn.com/davidblogs/</a>，资源共享，谢谢合作。<br />懒猪稍后给出自己做的参考解答，希望能和大家多多交流。</div>
		<div> </div>
		<div>编程环境：VC++6<br />考试时间：3小时<br /></div>
		<div>Problem A.Fibonacci<br />Input:           fib.in<br />Output:        Standard Output<br />Time limit:     5 second<br />Memory limit: 64 megabytes<br />Offerd by ：   <a href="http://spaces.msn.com/davidblogs/">http://spaces.msn.com/davidblogs/</a></div>
		<div> </div>
		<div>The Fibonacci Numbers{0,1,1,2,3,5,8,13,21,34,55...} are defined by the recurrence:<br />F0=0 F1=1 Fn=Fn-1+Fn-2,n&gt;=2<br />Write a program to calculate the Fibonacci Numbers.</div>
		<div> </div>
		<div>Input<br />The input file contains a number n and you are expected to calculate Fn.(0&lt;=n&lt;=30)</div>
		<div>
				<br />Output<br />Print a number Fn on a separate line,which means the nth Fibonacci Number.</div>
		<div> </div>
		<div>Example<br />fib.in       Standard Output<br />1            1<br />2            1<br />3            2<br />4            3<br />5            5<br />6            8</div>
		<div> </div>
		<div>
				<br />Problem B.WERTYU<br />Input:           wertyu.in<br />Output:         Standard Output<br />Time limit:      5 second<br />Memory limit:  64 megabytes<br />Offerd by ：   <a href="http://spaces.msn.com/davidblogs/">http://spaces.msn.com/davidblogs/</a></div>
		<div> </div>
		<div>A common typing error is to place the hands on the keyboard one
row to the right of the correct position.So "Q" is typed as "W" and "J"
is typed as "K" and so on.You are to decode a message typed in this
manner.</div>
		<div> </div>
		<div>` 1 2 3 4 5 6 7 8 9 0 - = BackSp<br />Tab Q W E R T Y U I O P [ ] \<br />A S D F G H J K L ; ' Enter<br />Z  X  C  V  B  N  M  ,  .  /<br />Control Alt  Space  Alt Control</div>
		<div> </div>
		<div>Input<br />The input file consist of several lines of text.Each line
may contain digits,spaces,upper case letters(except Q,A,Z),or
punctuation shown above(except back-quote(') which is left to the key
"1").Keys labelled with words [Tab,BackSp,Control,etc.] are not
represented in the input.</div>
		<div> </div>
		<div>Output<br />You are to replace each letter or punctuation symbol by
the one immediately to its left on the QWERTY keyboard shown
above.Spaces in the input should be echoed in the output.</div>
		<div> </div>
		<div>Example<br />wertyu.in                   
 Standard Output<br />O S, GOMR YPFSU/        I AM FINE TODAY.</div>
		<div> </div>
		<div> </div>
		<div>Problem C.String Matching<br />Input:            matching.in<br />Output:         Standard Output<br />Time limit:      5 second<br />Memory limit:  64 megabytes<br />Offerd by ：   <a href="http://spaces.msn.com/davidblogs/">http://spaces.msn.com/davidblogs/</a></div>
		<div> </div>
		<div>Finding all occurrences of a pattern in a text is a problem that
arises frequently in text-editing programs.Typically,the text is a
document being edited,and the pattern searched for is a particular word
supplied by the user.</div>
		<div> </div>
		<div>We assume that the text is an array T[1..n] of length n and that
the pattern is an array P[1..m] of length m&lt;=n.We further assume
that the elements of P and T are all alphabets(∑={a,b...,z}).The
character arrays P and T are often called strings of characters.</div>
		<div> </div>
		<div>We say that pattern P occurs with shift s in the text T if
0&lt;=s&lt;=n and T[s+1..s+m] = P[1..m](that is if T[s+j]=P[j],for
1&lt;=j&lt;=m).</div>
		<div> </div>
		<div>If P occurs with shift s in T,then we call s a valid shift;otherwise,we call s a invalid shift.</div>
		<div>Your task is to calculate the number of vald shifts for the given text T and pattern P.</div>
		<div> </div>
		<div>Input<br />In the input file,there are two strings T and P on a
line,separated by a single space.You may assume both the length of T
and P will not exceed 10^6.</div>
		<div> </div>
		<div>Output<br />You should output a number on a separate line,which indicates the number of valid shifts for the given text T and pattern P.</div>
		<div> </div>
		<div>Example<br />matching.in       Standard Output<br />aaaaaa a            6<br />abababab abab   3<br />abcdabc abdc     0</div>
		<div> </div>
		<div>Problem D.Exponential Form<br />Input:            form.in<br />Output:         Standard Output<br />Time limit:      5 second<br />Memory limit:  64 megabytes<br />Offerd by ：   <a href="http://spaces.msn.com/davidblogs/">http://spaces.msn.com/davidblogs/</a></div>
		<div> </div>
		<div>Every positive number can be presented by the exponential form.For example,<br />137 = 2^7 + 2^3 + 2^0</div>
		<div>Let's present a^b by the form a(b).Then 137 is presented by 2(7)+2(3)+2(0).<br />Since 7 = 2^2 + 2 + 2^0 and 3 = 2 + 2^0 , 137 is finally presented by 2(2(2)+2+2(0))+2(2+2(0))+2(0).</div>
		<div> </div>
		<div>Given a positive number n,your task is to present n with the exponential form which only contains the digits 0 and 2.</div>
		<div> </div>
		<div>Input<br />The input file contains a positive integer n (n&lt;=20000).</div>
		<div> </div>
		<div>Output<br />You should output the exponential form of n an a single
line.Note that,there should not be any additional white spaces in the
line.</div>
		<div> </div>
		<div>Example<br />form.in<br />137<br />Stardard Output<br />2(2(2)+2+2(0))+2(2+2(0))+2(0)<br />form.in<br />1315<br />Stardard Output<br />2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)</div>
<img src ="http://www.cppblog.com/kenwell/aggbug/4862.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kenwell/" target="_blank">c++ 学习</a> 2006-03-31 19:16 <a href="http://www.cppblog.com/kenwell/archive/2006/03/31/4862.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>函数中有未知个参数的定义</title><link>http://www.cppblog.com/kenwell/archive/2006/03/21/4407.html</link><dc:creator>c++ 学习</dc:creator><author>c++ 学习</author><pubDate>Tue, 21 Mar 2006 04:39:00 GMT</pubDate><guid>http://www.cppblog.com/kenwell/archive/2006/03/21/4407.html</guid><wfw:comment>http://www.cppblog.com/kenwell/comments/4407.html</wfw:comment><comments>http://www.cppblog.com/kenwell/archive/2006/03/21/4407.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kenwell/comments/commentRss/4407.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kenwell/services/trackbacks/4407.html</trackback:ping><description><![CDATA[我是看了msdn后，感觉还是很简单的，只要知道三个东西<br />va_arg, va_start, va_end<br /><font color="#ff0000"><strong>va_arg:<br /></strong></font><a class="synParam" onclick="showTip(this)" href=""><em>type</em></a><b>va_arg(</b><br /><b>   va_list</b><i><a class="synParam" onclick="showTip(this)" href="">arg_ptr</a></i><b>,</b><br /><b>   </b><i><a class="synParam" onclick="showTip(this)" href="">type</a></i><br /><b>);</b><br /><br /><strong>va_arg</strong> returns the current argument; <b>va_start</b> and <b>va_end</b> do not return values<br /><br /><p>The <b>va_arg</b>, <b>va_end</b>, and <b>va_start</b> macros provide a portable way to access the arguments to a function when the function takes a variable number of arguments. Two versions of the macros are available: The macros defined in STDARG.H conform to the ANSI C standard, and the macros defined in VARARGS.H are compatible with the UNIX System V definition. The macros are: <br /><br /></p><p>The ANSI C standard macros, defined in STDARG.H, are used as follows: 
</p><ul type="disc"><li>All required arguments to the function are declared as parameters in the usual way. <b>va_dcl</b> is not used with the STDARG.H macros. 
</li><li><b>va_start</b> sets <i>arg_ptr</i> to the first optional argument in the list of arguments passed to the function. The argument <i>arg_ptr</i> must have <b>va_list</b> type. The argument <i>prev_param</i> is the name of the required parameter immediately preceding the first optional argument in the argument list. If <i>prev_param</i> is declared with the register storage class, the macro's behavior is undefined. <b>va_start</b> must be used before <b>va_arg</b> is used for the first time. 
</li><li><b>va_arg</b> retrieves a value of <i>type</i> from the location given by <i>arg_ptr</i> and increments <i>arg_ptr</i> to point to the next argument in the list, using the size of <i>type</i> to determine where the next argument starts. <b>va_arg</b> can be used any number of times within the function to retrieve arguments from the list. </li></ul><p><font style="BACKGROUND-COLOR: #ff0000" color="#ff0000"><strong><font style="BACKGROUND-COLOR: #ffffff" color="#ff0000">The example:<br /><br /></font></strong></font></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> crt_va.c</span><span style="COLOR: #008000"><br /><img id="Codehighlighter1_12_219_Open_Image" onclick="this.style.display='none'; Codehighlighter1_12_219_Open_Text.style.display='none'; Codehighlighter1_12_219_Closed_Image.style.display='inline'; Codehighlighter1_12_219_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_12_219_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_12_219_Closed_Text.style.display='none'; Codehighlighter1_12_219_Open_Image.style.display='inline'; Codehighlighter1_12_219_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_12_219_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_12_219_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> The program below illustrates passing a variable<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /> * number of arguments using the following macros:<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /> *      va_start            va_arg              va_end<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /> *      va_list             va_dcl (UNIX only)<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /> </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000"> ANSI            /* Comment out for UNIX version     */</span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_328_365_Open_Image" onclick="this.style.display='none'; Codehighlighter1_328_365_Open_Text.style.display='none'; Codehighlighter1_328_365_Closed_Image.style.display='inline'; Codehighlighter1_328_365_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_328_365_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_328_365_Closed_Text.style.display='none'; Codehighlighter1_328_365_Open_Image.style.display='inline'; Codehighlighter1_328_365_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />#ifdef ANSI             </span><span id="Codehighlighter1_328_365_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_328_365_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> ANSI compatible version          </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdarg.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> average( </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> first, <img src="http://www.cppblog.com/images/dot.gif" /> );<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">#else</span><span style="COLOR: #000000">                   /* UNIX compatible version          */</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">varargs.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> average( va_list );<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">#endif</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> main( </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> )<br /><img id="Codehighlighter1_551_852_Open_Image" onclick="this.style.display='none'; Codehighlighter1_551_852_Open_Text.style.display='none'; Codehighlighter1_551_852_Closed_Image.style.display='inline'; Codehighlighter1_551_852_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_551_852_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_551_852_Closed_Text.style.display='none'; Codehighlighter1_551_852_Open_Image.style.display='inline'; Codehighlighter1_551_852_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_551_852_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_551_852_Open_Text"><span style="COLOR: #000000">{<br /><img id="Codehighlighter1_556_609_Open_Image" onclick="this.style.display='none'; Codehighlighter1_556_609_Open_Text.style.display='none'; Codehighlighter1_556_609_Closed_Image.style.display='inline'; Codehighlighter1_556_609_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_556_609_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_556_609_Closed_Text.style.display='none'; Codehighlighter1_556_609_Open_Image.style.display='inline'; Codehighlighter1_556_609_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />   </span><span id="Codehighlighter1_556_609_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_556_609_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> Call with 3 integers (-1 is used as terminator). </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />   printf( </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Average is: %d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, average( </span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000"> ) );<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_673_699_Open_Image" onclick="this.style.display='none'; Codehighlighter1_673_699_Open_Text.style.display='none'; Codehighlighter1_673_699_Closed_Image.style.display='inline'; Codehighlighter1_673_699_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_673_699_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_673_699_Closed_Text.style.display='none'; Codehighlighter1_673_699_Open_Image.style.display='inline'; Codehighlighter1_673_699_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />   </span><span id="Codehighlighter1_673_699_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_673_699_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> Call with 4 integers. </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />   printf( </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Average is: %d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, average( </span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">7</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">9</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">11</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000"> ) );<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_767_801_Open_Image" onclick="this.style.display='none'; Codehighlighter1_767_801_Open_Text.style.display='none'; Codehighlighter1_767_801_Closed_Image.style.display='inline'; Codehighlighter1_767_801_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_767_801_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_767_801_Closed_Text.style.display='none'; Codehighlighter1_767_801_Open_Image.style.display='inline'; Codehighlighter1_767_801_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />   </span><span id="Codehighlighter1_767_801_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_767_801_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> Call with just -1 terminator. </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />   printf( </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Average is: %d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, average( </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000"> ) );<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_855_911_Open_Image" onclick="this.style.display='none'; Codehighlighter1_855_911_Open_Text.style.display='none'; Codehighlighter1_855_911_Closed_Image.style.display='inline'; Codehighlighter1_855_911_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_855_911_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_855_911_Closed_Text.style.display='none'; Codehighlighter1_855_911_Open_Image.style.display='inline'; Codehighlighter1_855_911_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_855_911_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_855_911_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> Returns the average of a variable list of integers. </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_937_968_Open_Image" onclick="this.style.display='none'; Codehighlighter1_937_968_Open_Text.style.display='none'; Codehighlighter1_937_968_Closed_Image.style.display='inline'; Codehighlighter1_937_968_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_937_968_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_937_968_Closed_Text.style.display='none'; Codehighlighter1_937_968_Open_Image.style.display='inline'; Codehighlighter1_937_968_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />#ifdef ANSI             </span><span id="Codehighlighter1_937_968_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_937_968_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> ANSI compatible version    </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> average( </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> first, <img src="http://www.cppblog.com/images/dot.gif" /> )<br /><img id="Codehighlighter1_1000_1333_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1000_1333_Open_Text.style.display='none'; Codehighlighter1_1000_1333_Closed_Image.style.display='inline'; Codehighlighter1_1000_1333_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_1000_1333_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1000_1333_Closed_Text.style.display='none'; Codehighlighter1_1000_1333_Open_Image.style.display='inline'; Codehighlighter1_1000_1333_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_1000_1333_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_1000_1333_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />   </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> count </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">, sum </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">, i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> first;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />   va_list marker;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_1094_1129_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1094_1129_Open_Text.style.display='none'; Codehighlighter1_1094_1129_Closed_Image.style.display='inline'; Codehighlighter1_1094_1129_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1094_1129_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1094_1129_Closed_Text.style.display='none'; Codehighlighter1_1094_1129_Open_Image.style.display='inline'; Codehighlighter1_1094_1129_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />   va_start( marker, first );     </span><span id="Codehighlighter1_1094_1129_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_1094_1129_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> Initialize variable arguments. </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />   </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">( i </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000"> )<br /><img id="Codehighlighter1_1154_1222_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1154_1222_Open_Text.style.display='none'; Codehighlighter1_1154_1222_Closed_Image.style.display='inline'; Codehighlighter1_1154_1222_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1154_1222_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1154_1222_Closed_Text.style.display='none'; Codehighlighter1_1154_1222_Open_Image.style.display='inline'; Codehighlighter1_1154_1222_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />   </span><span id="Codehighlighter1_1154_1222_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_1154_1222_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />      sum </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000"> i;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />      count</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />      i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> va_arg( marker, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />   }</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_1258_1293_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1258_1293_Open_Text.style.display='none'; Codehighlighter1_1258_1293_Closed_Image.style.display='inline'; Codehighlighter1_1258_1293_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1258_1293_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1258_1293_Closed_Text.style.display='none'; Codehighlighter1_1258_1293_Open_Image.style.display='inline'; Codehighlighter1_1258_1293_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />   va_end( marker );              </span><span id="Codehighlighter1_1258_1293_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_1258_1293_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> Reset variable arguments.      </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />   </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">( sum </span><span style="COLOR: #000000">?</span><span style="COLOR: #000000"> (sum </span><span style="COLOR: #000000">/</span><span style="COLOR: #000000"> count) : </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> );<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">#else</span><span style="COLOR: #000000">       /* UNIX compatible version must use old-style definition.  */</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> average( va_alist )<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />va_dcl<br /><img id="Codehighlighter1_1440_1749_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1440_1749_Open_Text.style.display='none'; Codehighlighter1_1440_1749_Closed_Image.style.display='inline'; Codehighlighter1_1440_1749_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_1440_1749_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1440_1749_Closed_Text.style.display='none'; Codehighlighter1_1440_1749_Open_Image.style.display='inline'; Codehighlighter1_1440_1749_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_1440_1749_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_1440_1749_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />   </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i, count, sum;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />   va_list marker;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_1518_1553_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1518_1553_Open_Text.style.display='none'; Codehighlighter1_1518_1553_Closed_Image.style.display='inline'; Codehighlighter1_1518_1553_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1518_1553_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1518_1553_Closed_Text.style.display='none'; Codehighlighter1_1518_1553_Open_Image.style.display='inline'; Codehighlighter1_1518_1553_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />   va_start( marker );            </span><span id="Codehighlighter1_1518_1553_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_1518_1553_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> Initialize variable arguments. </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />   </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">( sum </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> count </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">; (i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> va_arg( marker, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">)) </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">; count</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000"> )<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />      sum </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000"> i;<br /><img id="Codehighlighter1_1674_1709_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1674_1709_Open_Text.style.display='none'; Codehighlighter1_1674_1709_Closed_Image.style.display='inline'; Codehighlighter1_1674_1709_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1674_1709_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1674_1709_Closed_Text.style.display='none'; Codehighlighter1_1674_1709_Open_Image.style.display='inline'; Codehighlighter1_1674_1709_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />   va_end( marker );              </span><span id="Codehighlighter1_1674_1709_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_1674_1709_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> Reset variable arguments.      </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />   </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">( sum </span><span style="COLOR: #000000">?</span><span style="COLOR: #000000"> (sum </span><span style="COLOR: #000000">/</span><span style="COLOR: #000000"> count) : </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> );<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">#endif</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div><p><font color="#000000"></font><br />最主要的是average 函数<br />开始时申明一个va_list marker<br />后来调用va_start(marker);<br />再后来调用va_arg(marker, int)<br />最后结束时调用va_end(marker):</p><img src ="http://www.cppblog.com/kenwell/aggbug/4407.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kenwell/" target="_blank">c++ 学习</a> 2006-03-21 12:39 <a href="http://www.cppblog.com/kenwell/archive/2006/03/21/4407.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>上海交大数据结构中的一个算法题</title><link>http://www.cppblog.com/kenwell/archive/2006/03/21/4403.html</link><dc:creator>c++ 学习</dc:creator><author>c++ 学习</author><pubDate>Tue, 21 Mar 2006 02:55:00 GMT</pubDate><guid>http://www.cppblog.com/kenwell/archive/2006/03/21/4403.html</guid><wfw:comment>http://www.cppblog.com/kenwell/comments/4403.html</wfw:comment><comments>http://www.cppblog.com/kenwell/archive/2006/03/21/4403.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kenwell/comments/commentRss/4403.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kenwell/services/trackbacks/4403.html</trackback:ping><description><![CDATA[
		<p> </p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">给出一个前序遍历，给出一个中序遍历，要求把树输出<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />给出算法答案如下：<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />main()<br /><img id="Codehighlighter1_42_148_Open_Image" onclick="this.style.display='none'; Codehighlighter1_42_148_Open_Text.style.display='none'; Codehighlighter1_42_148_Closed_Image.style.display='inline'; Codehighlighter1_42_148_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_42_148_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_42_148_Closed_Text.style.display='none'; Codehighlighter1_42_148_Open_Image.style.display='inline'; Codehighlighter1_42_148_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span id="Codehighlighter1_42_148_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.cppblog.com/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_42_148_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />Datatype preorder[n], inorder[n];<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />Struct link</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000">BT;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000">(n </span>
						<span style="COLOR: #000000">&gt;</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">)<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />BT </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> creatBT(</span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">, n</span>
						<span style="COLOR: #000000">-</span>
						<span style="COLOR: #000000">1</span>
						<span style="COLOR: #000000">, </span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">, n </span>
						<span style="COLOR: #000000">-</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">1</span>
						<span style="COLOR: #000000">);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000">(BT);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">struct</span>
				<span style="COLOR: #000000"> link</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000"> createBT(</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> prestart, </span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> preend, </span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> instart, </span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> inend)<br /><img id="Codehighlighter1_223_632_Open_Image" onclick="this.style.display='none'; Codehighlighter1_223_632_Open_Text.style.display='none'; Codehighlighter1_223_632_Closed_Image.style.display='inline'; Codehighlighter1_223_632_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_223_632_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_223_632_Closed_Text.style.display='none'; Codehighlighter1_223_632_Open_Image.style.display='inline'; Codehighlighter1_223_632_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span id="Codehighlighter1_223_632_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.cppblog.com/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_223_632_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />p </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> (</span>
						<span style="COLOR: #0000ff">struct</span>
						<span style="COLOR: #000000"> link</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000">)malloc(</span>
						<span style="COLOR: #0000ff">sizeof</span>
						<span style="COLOR: #000000">(</span>
						<span style="COLOR: #0000ff">struct</span>
						<span style="COLOR: #000000"> link);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />p</span>
						<span style="COLOR: #000000">-&gt;</span>
						<span style="COLOR: #000000">lchild </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">null</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />p</span>
						<span style="COLOR: #000000">-&gt;</span>
						<span style="COLOR: #000000">rchild </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">null</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />p</span>
						<span style="COLOR: #000000">-&gt;</span>
						<span style="COLOR: #000000">data </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> preorder[prestart];<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000">(prestart </span>
						<span style="COLOR: #000000">&gt;</span>
						<span style="COLOR: #000000"> preend)<br /><img id="Codehighlighter1_359_614_Open_Image" onclick="this.style.display='none'; Codehighlighter1_359_614_Open_Text.style.display='none'; Codehighlighter1_359_614_Closed_Image.style.display='inline'; Codehighlighter1_359_614_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_359_614_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_359_614_Closed_Text.style.display='none'; Codehighlighter1_359_614_Open_Image.style.display='inline'; Codehighlighter1_359_614_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span>
						<span id="Codehighlighter1_359_614_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_359_614_Open_Text">
								<span style="COLOR: #000000">{ <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  </span>
								<span style="COLOR: #0000ff">for</span>
								<span style="COLOR: #000000">(</span>
								<span style="COLOR: #0000ff">int</span>
								<span style="COLOR: #000000"> i </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> instart; inorder[i] </span>
								<span style="COLOR: #000000">!=</span>
								<span style="COLOR: #000000"> preorder[start]; i</span>
								<span style="COLOR: #000000">++</span>
								<span style="COLOR: #000000">);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000">(i </span>
								<span style="COLOR: #000000">&gt;</span>
								<span style="COLOR: #000000"> instart)<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />   p</span>
								<span style="COLOR: #000000">-&gt;</span>
								<span style="COLOR: #000000">lchild </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> createBT(prestart </span>
								<span style="COLOR: #000000">+</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">1</span>
								<span style="COLOR: #000000">, prestart</span>
								<span style="COLOR: #000000">-</span>
								<span style="COLOR: #000000"> instart </span>
								<span style="COLOR: #000000">+</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">1</span>
								<span style="COLOR: #000000">, instart, i </span>
								<span style="COLOR: #000000">-</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">1</span>
								<span style="COLOR: #000000">);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000">(i </span>
								<span style="COLOR: #000000">&lt;</span>
								<span style="COLOR: #000000"> inend)<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  p</span>
								<span style="COLOR: #000000">-&gt;</span>
								<span style="COLOR: #000000">rchild </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> createBT(prestart </span>
								<span style="COLOR: #000000">-</span>
								<span style="COLOR: #000000"> instart </span>
								<span style="COLOR: #000000">+</span>
								<span style="COLOR: #000000"> i </span>
								<span style="COLOR: #000000">+</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">1</span>
								<span style="COLOR: #000000">, preend, i </span>
								<span style="COLOR: #000000">+</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">1</span>
								<span style="COLOR: #000000">, inend);        <br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span>
						</span>
						<span style="COLOR: #000000">  <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /> <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> (p):<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
<img src ="http://www.cppblog.com/kenwell/aggbug/4403.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kenwell/" target="_blank">c++ 学习</a> 2006-03-21 10:55 <a href="http://www.cppblog.com/kenwell/archive/2006/03/21/4403.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>