1. c++文章:
a: dynamic_cast和static_cast的区别
2.套接字
#include<iostream>
#include<WinSock2.h>
#include<io.h>
#include<process.h>
#pragma comment (lib , "ws2_32.lib")
using namespace std;
int main()
{
WSADATA wsadata;
WSAStartup(MAKEWORD (2,2), &wsadata);
int sockfd;//文件描述符
int optval;//属性值
int optlen = sizeof(optval);
int flag;
/**************************************************************
第一个参数指定应用程序使用的通信协议的协议族,对于TCP/IP协议族,该参数置AF_INET;
第二个参数指定要创建的套接字类型,流套接字类型为SOCK_STREAM、
数据报套接字类型为SOCK_DGRAM、原始套接字SOCK_RAW(WinSock接口
并不适用某种特定的协议去封装它,而是由程序自行处理数据包以及协议首部);
第三个参数指定应用程序所使用的通信协议。此参数可以指定单个协议系列中的
不同传输协议。在Internet通讯域中,此参数一般取值为0,系统会根据套接字的
类型决定应使用的传输层协议。
*****************************************************************/
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0))< 0)
{
perror("socket error");
return -1;
}
getsockopt(sockfd, SOL_SOCKET, SO_TYPE, (char*)&(optval), &optlen);
cout<<"optval 属性值: "<<optval<<endl;
int sndbuf = 0;
int revbuf =0;
optlen = sizeof(sndbuf);
/************************************************************************/
/* sockfd:一个标识套接口的描述字。
level:选项定义的层次。支持的层次仅有SOL_SOCKET和IPPROTO_TCP。
optname:需获取的套接口选项。
optval:指针,指向存放所获得选项值的缓冲区。
optlen:指针,指向optval缓冲区的长度值。 */
/************************************************************************/
flag = getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, (char*)&sndbuf, &optlen);
cout<<"sndbuf: "<<sndbuf<<endl;
cout<<"flag= "<<flag<<endl;
sndbuf= 51200;
flag =setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, (char*)&sndbuf, optlen);
sndbuf=0;
flag =getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, (char*)&sndbuf, &optlen);
cout<<"sndbuf: "<<sndbuf<<endl;
cout<<"flag: "<<flag<<endl;
closesocket(sockfd);// 使用close会出现问题, close()函数关闭了数据的双向传输
//在release版本下使用close是可以的。
WSACleanup();
return 0;
}
/
// 命令行输入 xx.exe www.sina.com
// 可输出 www.sina.com的信息
///
#include<iostream>
#include<cstdlib>
#include<WinSock2.h>
#pragma comment (lib, "ws2_32.lib")
using namespace std;
int main(int argc, char* argv[])
{
WSADATA wsaData;
WSAStartup(MAKEWORD (2,2), &wsaData);
struct hostent* h;
if (argc !=2)
{
perror("input error!");
return -1;
}
if((h=gethostbyname(argv[1]))== NULL)
{
perror("gethostbyname!");
return -1;
}
char hostname[30];
memset(hostname, 0 , sizeof(hostname));
int flag_hostname=0;
if ((flag_hostname= gethostname(hostname, sizeof(hostname)))<0)
{
perror("gethostname");
return -1;
}
cout<<"name of host: "<<hostname<<endl;
// h_name – 地址的正式名称。
// h_aliases – 空字节-地址的预备名称的指针。
// h_addrtype –地址类型; 通常是AF_INET。
// h_length – 地址的比特长度。
// h_addr_list – 零字节-主机网络地址指针。网络字节顺序。
// h_addr - h_addr_list中的第一地址。
cout<<h->h_name<<endl;
cout<<h->h_addrtype<<endl;
cout<<*h->h_aliases<<endl;
cout<<h->h_length<<endl;
//cout<<h->h_addr_list<<endl;
cout<<inet_ntoa(*(struct in_addr*)h->h_addr)<<endl;//将一个IP转换成一个互联网标准点分格式的字符串。
WSACleanup();//WSACleanup()中止了Windows Sockets在所有线程上的操作
return 0;
}
#gethostname()函数
3 多线程
本段摘自: http://www.cnblogs.com/me115/archive/2011/01/25/1944598.html
2、OpenMP指令和库函数介绍
下面来介绍OpenMP的基本指令和常用指令的用法,
在C/C++中,OpenMP指令使用的格式为
#pragma omp 指令 [子句[子句]…]
前面提到的parallel for就是一条指令,有些书中也将OpenMP的“指令”叫做“编译指导语句”,后面的子句是可选的。例如:
#pragma omp parallel private(i, j)
parallel 就是指令, private是子句
为叙述方便把包含#pragma和OpenMP指令的一行叫做语句,如上面那行叫parallel语句。
OpenMP的指令有以下一些:
parallel,用在一个代码段之前,表示这段代码将被多个线程并行执行
for,用于for循环之前,将循环分配到多个线程中并行执行,必须保证每次循环之间无相关性。
parallel for, parallel 和 for语句的结合,也是用在一个for循环之前,表示for循环的代码将被多个线程并行执行。
sections,用在可能会被并行执行的代码段之前
parallel sections,parallel和sections两个语句的结合
critical,用在一段代码临界区之前
single,用在一段只被单个线程执行的代码段之前,表示后面的代码段将被单线程执行。
flush,
barrier,用于并行区内代码的线程同步,所有线程执行到barrier时要停止,直到所有线程都执行到barrier时才继续往下执行。
atomic,用于指定一块内存区域被制动更新
master,用于指定一段代码块由主线程执行
ordered, 用于指定并行区域的循环按顺序执行
threadprivate, 用于指定一个变量是线程私有的。
OpenMP除上述指令外,还有一些库函数,下面列出几个常用的库函数:
omp_get_num_procs, 返回运行本线程的多处理机的处理器个数。
omp_get_num_threads, 返回当前并行区域中的活动线程个数。
omp_get_thread_num, 返回线程号
omp_set_num_threads, 设置并行执行代码时的线程个数
omp_init_lock, 初始化一个简单锁
omp_set_lock, 上锁操作
omp_unset_lock, 解锁操作,要和omp_set_lock函数配对使用。
omp_destroy_lock, omp_init_lock函数的配对操作函数,关闭一个锁
OpenMP的子句有以下一些
private, 指定每个线程都有它自己的变量私有副本。
firstprivate,指定每个线程都有它自己的变量私有副本,并且变量要被继承主线程中的初值。
lastprivate,主要是用来指定将线程中的私有变量的值在并行处理结束后复制回主线程中的对应变量。
reduce,用来指定一个或多个变量是私有的,并且在并行处理结束后这些变量要执行指定的运算。
nowait,忽略指定中暗含的等待
num_threads,指定线程的个数
schedule,指定如何调度for循环迭代
shared,指定一个或多个变量为多个线程间的共享变量
ordered,用来指定for循环的执行要按顺序执行
copyprivate,用于single指令中的指定变量为多个线程的共享变量
copyin,用来指定一个threadprivate的变量的值要用主线程的值进行初始化。
default,用来指定并行处理区域内的变量的使用方式,缺省是shared
4 new 的几种用法()
其一是new operator,也叫new表达式;其二是operator new,也叫new操作符。还有一中不太常见的placement new
string* ps = new string("abc"); // 释放 delete ps
上面这个new表达式完成了两件事情:申请内存和初始化对象。
new操作符类似于C语言中的malloc,只是负责申请内存,例如:
void* buffer = operator new(sizeof(string)); // 释放 operator delete(buffer);
这样得到的buffer是指向一块 sizeof(string)大小的内存块, 并没有初试话。 这个时候我们可以用placement new 在指定位置申请内存
例如:
buffer = new(buffer) string("abc")
placement new 在指定位置申请内存时,并不会判断buffer的边界,当buffer空间不足以满足要求时就会直接占用后面的内存, 可能造成问题。
测试代码:
void test2(char*a, const char& value)
{
cout<<"test2"<<endl;
cout<<new(a) char(value)<<endl;
}
int main()
{
char a[6] = {'a','b','c','d','e','\0'};
cout<<a<<endl;
test2(a+7, 'r');
cout<<a<<endl;
}
输出:
abcdetest2
r烫烫虣€j绺
abcde
请按任意键继续. . .
可以看到输出的第三行是直接跨过数组a的边界
1.函数指针定义
函数类型 (*指针变量名)(形参列表);
“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数列表。
#include<iostream>
using namespace std;
// 利用typedef 定义一个函数指针类型
typedef int (* P_FUN)(int , int);
P_FUN p_fun;
int func(int a, int b)
{
return a+b;
}
void test(P_FUN fun);
int main()
{
p_fun = &func;
cout<<"main: ";
cout<<p_fun(2, 3)<<endl;
test(func);
}
void test(P_FUN fun)
{
cout<<"test:"<<endl;
cout<<fun(3, 5);
}
andorid
一时兴起, 开始捣鼓android了, 刚开始那个迷茫, 啥也不知道。一行代码十次百度。半个月过去了还是迷迷糊糊。
在网上看了看最近比较火的flappybird游戏。 结合别人的代码自己试着实现了下, 操作体验虽然一般,但已经很满意啦,以后改进。
部分flappybird代码下载连接。
http://download.csdn.net/detail/lmnxjf/7344247