sql server 函數

sql server 函數

silver6 | 09 十二月, 2005 11:07

1.字符串函数
长度与分析用

datalength(Char_expr) 返回字符串包含字符数,但不包含后面的空格

substring(expression,start,length) 不多说了,取子串

right(char_expr,int_expr) 返回字符串右边int_expr个字符

字符操作类

upper(char_expr) 转为大写

lower(char_expr) 转为小写

space(int_expr) 生成int_expr个空格

replicate(char_expr,int_expr)复制字符串int_expr次

reverse(char_expr) 反转字符串

stuff(char_expr1,start,length,char_expr2) 将字符串char_expr1中的从

start开始的length个字符用char_expr2代替

ltrim(char_expr) rtrim(char_expr) 取掉空格


ascii(char) char(ascii) 两函数对应,取ascii码,根据ascii吗取字符


字符串查找

charindex(char_expr,expression) 返回char_expr的起始位置

patindex("%pattern%",expression) 返回指定模式的起始位置,否则为0


2.数学函数

abs(numeric_expr) 求绝对值

ceiling(numeric_expr) 取大于等于指定值的最小整数

exp(float_expr) 取指数

floor(numeric_expr) 小于等于指定值得最大整数

pi() 3.1415926.........

power(numeric_expr,power) 返回power次方

rand([int_expr]) 随机数产生器

round(numeric_expr,int_expr) 安int_expr规定的精度四舍五入

sign(int_expr) 根据正数,0,负数,,返回+1,0,-1

sqrt(float_expr) 平方根


3.日期函数

getdate() 返回日期

datename(datepart,date_expr) 返回名称如 June

datepart(datepart,date_expr) 取日期一部份

datediff(datepart,date_expr1.dateexpr2) 日期差

dateadd(datepart,number,date_expr) 返回日期加上 number

上述函数中datepart的

写法 取值和意义

yy 1753-9999 年份

qq 1-4 刻

mm 1-12 月

dy 1-366 日

dd 1-31 日

wk 1-54 周

dw 1-7 周几

hh 0-23 小时

mi 0-59 分钟

ss 0-59 秒

ms 0-999 毫秒


日期转换

convert()



4.系统函数

suser_name() 用户登录名

user_name() 用户在数据库中的名字

user 用户在数据库中的名字

show_role() 对当前用户起作用的规则


db_name() 数据库名

object_name(obj_id) 数据库对象名

col_name(obj_id,col_id) 列名

col_length(objname,colname) 列长度

valid_name(char_expr) 是否是有效标识符
 查看全文

<!--

毕业快三年了,对做软件感触很深,特将最近一年多来遇到的问题和解决方式与大家共享

silver6 | 09 十二月, 2005 10:51

IE信息设定: HKEY_CURRENT_USERSoftwareMicrosoftWindowsShellNoRoamMUICache
1、浮点数格式:
a、浮点数的范围:



-2(2m-1)*(1-2-n)

2、帮助文档的制作
每一节的标题注脚:$
每一节的跳转命(不能是中文):#
每一节的关键字索引:K
节序号:+
跳转文本在RTF文件中是带双下划线的文本
3、Dumpbin.exe:用于检查COFF目标文件,标准COFF目标库文件,可执行文件,和动态连接库文件
4、Q:ZIP与RAR之类密码能否用SOFTICE或TRW动态跟踪破解?——《看雪论坛》
A: 不能,WinZip和WinRAR是通过与CRC结合的方式进行加密,它们在解压的时候会不管3721先把带上用户输入的密码的CRC放进解压流程中,先解出来再说,最后才进行原始的CRC判定,如果最后得到的CRC与原来的不一样,那就是解压失败。因为CRC是不可逆推的,所以也没办法得到原始的密码,同时也因为把对比的过程放在了最后,所以才没办法用SoftICE等工具进行破解,只能穷举(目前来说)。
5、Q:为什么在WinNT/2000/XP系统,bpx hmemcpy断点无效?
A: hmemcpy是Win9x系统内部的一个函数,俗称万能断点,但在一般的编程书籍上很少提到,原因它是底层的东西,没有特殊需要,一般不直接调用。它的操作很简单,只是将内存中的一块数据拷贝到另一个地方,Win9x系统里很频繁地调用它处理数据。在Win NT/2K系统上相关的函数是memcpy,但在Win NT/2K上不同于Windows 9x上,很少再调用memcpy来处理数据了,用此函数设断基本上什么也拦不住。
6、Q:为何同一函数有几种形式,如MessageBoxA(W)?
A: MessageBoxA(W)是MessageBoxA,MessageBoxW两种形式缩写,Windows函数是区分字符集的:A表示ANSI,W表示Wide,即Unicode (Wide character-set),前者就是通常使用的单字节方式,而后者是双字节方式,方便处理双字节字符。Win98基本是使用ANSI字符串来进行内部操作的,但它仍可处理少数Unicode字串符函数,如MessageBoxW、MessageBoxExW等。而Win2000/XP所有核心函数都是 Unicode字串符。
7、Q:为什么SoftICE或TRW再运行一些软件时会中断跳出?
A:用命令FAULTS off关闭错误跟踪功能。
8、Q:F11与F12区别?
A:F11对应的命令是:G@ss:sp,假如你目前正中断在程序中,下这个指令会在堆栈的返回地址设个暂时断点并执行到此断点。
F12 对应的命令是:P RET 。SoftICE或TRW将一直单步执行直到它找到一条返回语句(RET、RETF),也就是说让SoftICE一直执行代码,直到出现 RET (XXXX) 命令,再跳出来拦截,这时,当前 IP(EIP) 会是停在 RET (XXXX) 后的某一条语句上,通常是在某一个CALL XXXXXXXX 后面。
说明:F11功能键在SoftICE中有效,在TRW中可以用pmodule命令代替F11或F12,可瞬间回到到前程序领空。
9、Q:SoftICE与TRW2000的断点有什么不同?
A:在这里以G命令来解释,如对G 401000命令,大家都知道是执行到401000停下,但SoftICE认为是到当前段的401000停下(也就是说在当前应用程序领空),而 TRW200却不管段址如何,只要EIP是401000便停下。 这样一般跟踪一软件只要G 401000便解决。这个功能看起来简单,却极为有用。有了这条命令,只要把当前跟踪到的EIP记下,下一次一G便到。而在SoftICE下,一般先用其 Symbol Loader装载程序,先来到当前应用程序的领空,然后再G 401000才能到达指定地址处。其它断点命令,如bpx原理与此类似。
10、Q:如何在对话框中加入工具条
在 OnInitDialog 中加入下面代码:
BOOL CYourDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// Create the toolbar. To understand the meaning of the styles used, you
// can take a look at the MSDN for the Create function of the CToolBar class.

ToolBar.Create(this, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_TOOLTIPS |CBRS_FLYBY | CBRS_BORDER_BOTTOM);

// I have assumed that you have named your toolbar''s resource as IDR_TOOLBAR1.
// If you have given it a different name, change the line below to accomodate
// that by changing the parameter for the LoadToolBar function.

ToolBar.LoadToolBar(IDR_TOOLBAR1);

CRect rcClientStart;
CRect rcClientNow;
GetClientRect(rcClientStart);

// To reposition and resize the control bar

RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST,0, reposQuery, rcClientNow);
CPoint ptOffset(rcClientNow.left - rcClientStart.left,rcClientNow.top-rcClientStart.top);

CRect rcChild;
CWnd* pwndChild = GetWindow(GW_CHILD);

while (pwndChild)
{
pwndChild->GetWindowRect(rcChild);
ScreenToClient(rcChild);
rcChild.OffsetRect(ptOffset);
pwndChild->MoveWindow(rcChild, FALSE);
pwndChild = pwndChild->GetNextWindow();
}
CRect rcWindow;
GetWindowRect(rcWindow);
rcWindow.right += rcClientStart.Width() - rcClientNow.Width();
rcWindow.bottom += rcClientStart.Height() - rcClientNow.Height();
MoveWindow(rcWindow, FALSE);

// And position the control bars
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);

return TRUE; // return TRUE unless you set the focus to a control
}

Q:如何改变对话框的形状?
可用下面一些函数:
CreatePolygonRgn
CreateRectRgn
CreateRoundRectRgn 等.
CRgn m_rgn; // Put this in your dialog''s header file. i.e. a member variable

// This Gets the size of the Dialog: This piece of code is to be placed in the
// OnInitDialog Function of your dialog.

CRect rcDialog
GetClientRect(rcDialog);

// The following code Creates the area and assigns it to your Dialog
m_rgn.CreateEllipticRgn(0, 0, rcDialog.Width(), rcDialogHeight());
SetWindowRgn(GetSafeHwnd(), (HRGN) m_rgn, TRUE);
Q:如何实现非客户区移动?
可用下面二种方法
// Handler for WM_LBUTTONDOWN message

void CYourDialog::OnLButtonDown(UINT nFlags, CPoint point)
{
CDialog::OnLButtonDown(nFlags, point);
PostMessage( WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM( point.x, point.y));
}

// Handler for WM_NCHITTEST message
LONG CYourDialog::OnNcHitTest( UINT uParam, LONG lParam )
{
int xPos = LOWORD(lParam);
int yPos = HIWORD(lParam);
UINT nHitTest = CDialog::OnNcHitTest(CSize(xPos, yPos));
return (nHitTest == HTCLIENT) ? HTCAPTION : nHitTest;
}

Q:如何使对话框初始为最小化状态?
在 OnInitDialog 中加入下面代码:
SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE, NULL);
Q:如何限定对话框大小范围?

在 WM_SIZING中加入下面代码:
void CYourDialog::OnSizing(UINT fwSide, LPRECT pRect)
{
if(pRect->right - pRect->left <=200)
pRect->right = pRect->left + 200;

if(pRect->bottom - pRect->top <=200)
pRect->bottom = pRect->top + 200;

CDialog::OnSizing(fwSide, pRect);
}
Q:如何在对话框中加入状态条?
定义 CStatusBar 变量:
CStatusBar m_StatusBar;
定义状态条指定状态:
static UINT BASED_CODE indicators[] =
{
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM
};
在 OnInitDialog 中加入下面代码:
m_StatusBar.CreateEx(this,SBT_TOOLTIPS,WS_CHILD|WS_VISIBLE|CBRS_BOTTOM,AFX_IDW_STATUS_BAR);

// Set the indicators namely caps and nums lock status
m_StatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT));

CRect rect;
GetClientRect(&rect);

m_StatusBar.SetPaneInfo(0,ID_INDICATOR_CAPS,SBPS_NORMAL,rect.Width()/2);
m_StatusBar.SetPaneInfo(1,ID_INDICATOR_NUM,SBPS_STRETCH ,rect.Width()/2);

RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,ID_INDICATOR_NUM);

m_StatusBar.GetStatusBarCtrl().SetBkColor(RGB(180,180,180));

11. Microsoft Distributed Transaction Coordinator服务(MSDTC.EXE)默认监听3372TCP端口
12. #pragma alloc_text( "textsection", function1, ... )
13. Unicode 字符串数据类型是C语言规范的一部分,使用下列方法来使用Unicode 字符串:
l将字符串常量加上前缀L。例如,L”Some text”是一个Unicode 字符串,而”Some text”是8-bit ANSI。
l使用wchar_t数据类型。DDK头文件定义了WCHAR为wchar_t,PWSTR为wchar_t*。
l使用常数UNICODE_NULL去终止Unicode 字符串,UNICODE_NULL被定义为16 bits的零。

cvs服务器的安装作者:weiqiong 发表时间:2002/12/30 08:32pm安装cvs后服务器和客户端就都安装了,主要是需要配置服务器端:1.查看是否安装cvs(我的redhat7.3缺省是装了的)rpm -qa|grep cvs一般安装在/usr/bin/cvs,如果未安装,到www.cvshome.org下载一个最新的rpm安装即可2.建立cvs用户组,便于管理 cvs用户groupadd cvs3.建立cvs组的cvsroot用户和所属的目录useradd -g cvs -G cvs -d /home/cvsroot cvsroot4.为cvsroot用户添加密码passwd cvsroot5.改变/home/cvsroot的目录属性chmod 775 /home/cvsroot6.初始化cvs源代码库,此操作生成目录/home/cvsroot/CVSROOT,其下为一些初始化文件cvs -d /home/cvsroot init7.创建可以登陆cvs服务的用户及密码,需要创建文件passwdvi /home/cvsroot/CVSROOT/passwd文件内容如下:weiqiong:xxxxxx:cvsrootchenxu:xxxxxx: cvsroot此文件的意思是weiqiong和chenxu两个用户可以登陆cvs服务器,登陆后其权限为用户cvsroot的权限注意:cvs用户和服务器用户是可以不一样的8.xxxxxx为密码,由以下文件生成:vi /home/cvsroot/passwdgen.pl文件内容: #!/usr/bin/perlsrand (time());my $randletter = "(int (rand (26)) + (int (rand (1) + .5) % 2 ? 65 : 97))";my $salt = sprintf ("%c%c", eval $randletter, eval $randletter);my $plaintext = shift;my $crypttext = crypt ($plaintext, $salt);print "${crypttext}n";9.如果需要密码为:some,则敲入:passwdgen.pl "some"回车即可得到加密密码,用其替换passwd文件中的xxxxxx10.加入cvs服务(我的redhath7.3缺省就有cvs服务,所以不用加)vi /etc/servicescvspserver 2401/tcp #pserver cvs servicecvspserver 2401/udp #pserver cvs service 11.cvs服务由inted来唤起,因此需要改动inetd提供的服务,如果你的redhat使用的是inetd 方式则在文件/etc/inetd.conf中加入如下的内容:cvspserver stream tcp nowait root /usr/bin/cvs cvs --allow-root=/home/cvsroot pserver 我的redhat7.3使用的是xinetd方式,所以在xinetd.d目录下添加需要启动的服务: cd /etc/xinetd.d vi cvspserver 文件内容: service cvspserver { disable = no flags = REUSE socket_type = stream wait = no user = root server = /usr/bin/cvs server_args = -f --allow-root=/home/cvsroot pserver log_on_failure += USERID }12.重新启动inetd或者xinetd: /etc/rc.d/init.d/xinetd restart13.检查cvspserver服务是否已经启动netstat -l |grep cvspserver应该有如下结果:tcp 0 0 *:cvspserver *:* LISTEN14.试用: cvs -d :pserver:weiqiong@202.204.114.37:/home/cvsroot login 敲入命令回车后提示输入weiqiong的密码,你按照自己设置的密码输入,如果没有什么错误信息出现就是成功了(我的机器IP地址是 202.204.114.37,也可以用localhost)
14、ActiveX控件的调试:2005.3.27-2005.3.28
这次编写的ActiveX控件是DynaGraph,用于实时显示三组动态曲线。
a、如何实现控件属性的加载和保存,如VB中的ReadProperties和WriteProperties?
在DoPropExchange(CPropExchange* pPX)中进行,诸如:
PX_Long(pPX,"Height",m_lHeight,250);
PX_Long(pPX,"Width",m_lWidth,380);
参见MSDN/ActiveX controls:Serializing
b、由于粗心,导致产生"参数无效错误",错误如下:
m_rtBound.left=GRID_EDGE_SPACE;m_rtBound.left=GRID_EDGE_SPACE;m_rtBound.right =m_rtGrid.right-GRID_EDGE_SPACE;m_rtBound.bottom=m_rtGrid.bottom-GRID_EDGE_SPACE; 由于把top写成了left,导致top没有赋值,出现溢出[不在有效范围内]
c、由于VC的Bug,导致在添加属性和方法时,相应的ID没有同步,从而导致很多的属性和方法的ID没有相互对应,导致"无效参数数目"错误,而且无法对其进行跟踪(因为ID错位)。
方法(以DrawGraph为例):
BEGIN_DISPATCH_MAP(CDynaGraphCtrl, COleControl)
DISP_FUNCTION(CDynaGraphCtrl, "DrawGraph", DrawGraph, VT_EMPTY, VTS_PI4 VTS_PI4 VTS_PI4 VTS_I2)
END_DISPATCH_MAP()
dispidDrawGraph = 15L,
afx_msg void DrawGraph(long FAR* pPressData, long FAR* pSpeedData, long FAR* pCtrlData, short sLen);
void CDynaGraphCtrl::DrawGraph(long FAR* pPressData,long FAR* pSpeedData,long FAR* pCtrlData,short sLen)
属性(以BackColor为例):
BEGIN_DISPATCH_MAP(CDynaGraphCtrl, COleControl)
DISP_PROPERTY_EX(CDynaGraphCtrl, "BackColor", GetBackColor, SetBackColor, VT_COLOR)
END_DISPATCH_MAP()
dispidBackColor = 3L,
afx_msg OLE_COLOR GetBackColor();
afx_msg void SetBackColor(OLE_COLOR nNewValue);
OLE_COLOR CDynaGraphCtrl::GetBackColor() { }
void CDynaGraphCtrl::SetBackColor(OLE_COLOR nNewValue) {}

16、ODBC connect string sample:
“DBQ=E:工程PROGRAMME舱盖升降系统HATCHHatchDB.mdb;UID=SA;PWD="";DRIVER=Microsoft Access Driver (*.mdb)”
17、由于坐标的不一致,导致移动控件始终不是按照预期的目的在移动。即少用了一个ScreenToClient(),正确代码如下[Hatch]:2005/4/11
GetCursorPos(&pt);
ScreenToClient(&pt);
if(pt.x!=m_ptLPPPosOldX.x)
{
m_ctlLPPointer.GetWindowRect(&m_rtLPPointer);
ScreenToClient(&m_rtLPPointer);
m_rtLPPointer.left-=m_ptLPPPosOldX.x-pt.x;
m_rtLPPointer.right-=m_ptLPPPosOldX.x-pt.x;
m_ctlLPPointer.SetWindowPos(&CWnd::wndTop,m_rtLPPointer.left,m_rtLPPointer.top,
m_rtLPPointer.right-m_rtLPPointer.left,m_rtLPPointer.bottom-m_rtLPPointer.top,
SWP_SHOWWINDOW);
m_ptLPPPosOldX=pt;
}
18、VB的ActiveX中的Extender在VB中是不兼容的,所以如果要在VC中使用VB开发的控件,则不能包含Extender。4/11/05
19、自绘控件的无闪烁更新,使用InvalidateControl(&m_rtBound);更新绘图区域,而不用更新没有变化的区域。[DynaGraph: DrawGraph]4/12/2005
20、向导中文乱码:原因尚未查证,但是可以使用Dialog替代PROPPAGE则可解决这个问题。
21、在对话框中加入属性页,当对话框失去焦点后,对话框便假死:主要是因为在创建属性页时,没有将扩展属性中的WS_EX_CONTROLPARENT加上,导致对话框无法处理属性页的相关消息,而我的属性页又没有建立相应的消息处理机制,故此。下例中this是对话框[Hatch: OnInitDialog]:2005-4-14
m_PSheet.Create(this,WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER|WS_OVERLAPPED,
WS_EX_OVERLAPPEDWINDOW|WS_EX_DLGMODALFRAME.|WS_EX_CONTROLPARENT);
22、在子对话框类中的CPropertySheet m_PSheet成员变量,初始化时执行添加属性页时,不能多次显示—隐藏子对话框:主要是因为m_Psheet对像没有执行析构,添加进去的属性页仍然存在,解决的办法是可以在创建显示之前,删掉以前的即可,如下[Hatch: OnInitDialog]:2005-4-14
while(m_PSheet.GetPageCount()>0)
m_PSheet.RemovePage(0);//删掉以前的

m_PSheet.AddPage(&m_TestPage);
m_PSheet.AddPage(&m_ConfigPage);
m_PSheet.Create(this,WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER|WS_OVERLAPPED,
WS_EX_OVERLAPPEDWINDOW|WS_EX_DLGMODALFRAME.|WS_EX_CONTROLPARENT);
23、DC[Device Contexts(设备相关):MSDN]
设备相关是一个Windows数据结构,它包含了诸如显示器或打印机等设备的绘制属性.所有的绘制调用是直接通过设备相关对象进行的,其中封装了诸如画线, 形状和文本等Windows APIs.设备相关允许在Windows中独立使用.设备相关可以用来绘制屏幕,绘制打印或者绘制媒体文件.
CPaintDC: CPaintDC对象封装了Windows的通用习惯,调用BeginPaint函数,然后在设备相关中进行绘制,再调用EndPaint函数. CpaintDC在构造函数中调用BeginPaint,在析构函数调用EndPaint.这简化的处理是创建CDC对象--绘制—销毁CDC对象.在框架中,许多事件是自动处理的.特别是,你的OnDraw函数是一个CpaintDC已经准备好的(通过OnPrepareDC),并且你只是简单地绘制. 它通过框架进行销毁,在设备相关中在调用OnDraw函数返回是释放给Windows.
CClientDC:CclientDC对象封装了只有在客户窗口区相关的设备相关.CClientDC的构造函数调用GetDC函数,它的析构函数调用ReleaseDC函数.
CWindowDC:CWindowDC对象封装了响应整个窗口的设备相关,包括框架.
CMetaFileDC:CMetaFileDC对象封装了绘制到一个窗口媒体文件.调用OnDraw的方式与CpaintDC相比较,你自己必须在这里面调用OnPrepareDC
24、串口操作函数
a.打开串口
HANDLE CreateFile(LPCTSTR lpFileName,DWORD dwDesiredAccess, DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);
b.设置缓冲
BOOL SetupComm( HANDLE hFile, DWORD dwInQueue, DWORD dwOutQueue);
c、关闭串口
BOOL CloseHandle(HANDLE hObject);
d、配置串口
BOOL GetCommState( HANDLE hFile, LPDCB lpDCB );
BOOL SetCommState( HANDLE hFile, LPDCB lpDCB );
BOOL BuildCommDCB( LPCTSTR lpDef, LPDCB lpDCB);
BOOL BuildCommDCBAndTimeouts(LPCTSTR lpDef, LPDCB lpDCB,LPCOMMTIMEOUTS lpCommTimeouts);
e、串口属性
BOOL GetCommProperties( HANDLE hFile, LPCOMMPROP lpCommProp);
f、串口读写
BOOL ReadFile( HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped );
BOOL ReadFileEx(
HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPOVERLAPPED lpOverlapped,
LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine );
BOOL WriteFile( HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped);
BOOL WriteFileEx(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite,
LPOVERLAPPED lpOverlapped, LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine );
g、重叠操作
BOOL GetOverlappedResult(HANDLE hFile, LPOVERLAPPED lpOverlapped,
LPDWORD lpNumberOfBytesTransferred, BOOL bWait );
h、超时
BOOL GetCommTimeouts( HANDLE hFile, LPCOMMTIMEOUTS lpCommTimeouts);
BOOL SetCommTimeouts(HANDLE hFile, LPCOMMTIMEOUTS lpCommTimeouts);
i、通信状态和通信错误
BOOL ClearCommError( HANDLE hFile, LPDWORD lpErrors, LPCOMSTAT lpStat);
25.数据库在执行插入语句时,始终不能插入数据:4/25/2005
原是语句如下:
INSERT INTO ExpResult(Name,ExpID,MinPress,MaxPress,AvrPress,ResultA,ResultB,ResultC,ResultD,Result,
DateStart,DateStop,Reserved1,Reserved2,Reserved3) VALUES ('23_0',1,0.000000,0.000000,0.000000, 24.000000,
234.000000,234.000000,0.000000,'',0,0,0,0.000000,'')
原因:因为我在数据库中对字符串设置了默认值为NULL,二在这儿有两个'',操作就不成功,将其改为下面的格式即可:
INSERT INTO ExpResult(Name,ExpID,MinPress,MaxPress,AvrPress,ResultA,ResultB,ResultC,ResultD,Result,
DateStart,DateStop,Reserved1,Reserved2,Reserved3) VALUES ('23_0',1,0.000000,0.000000,0.000000, 24.000000,234.000000,234.000000,0.0000,'Null',0,0,0,0.0000,'Null')即不能给无效的数据进去罢了.
26.使用SQL语句创建表单,关键字需要自增,使用Counter,如下:2005/5/9
szSQL.Format("CREATE TABLE Data200504(IDD Counter PRIMARY KEY UNIQUE NOT NULL,StepDisplace INTEGER,PPPress SINGLE,PRESSAB INTEGER,CtrlPressC INTEGER,DateTimes INTEGER)");
27.在表单中的字段名字不能用保留字,否则在执行SQL时会不成功,诸如:Date,DateTime等。
28. 奇耻大辱啊,因为系统所使用的ActiveX和DLL没有注册,造成编译后的文件无法正常运行,有的是悄然无声;有的出现内存访问冲突.在注册后也出现这样的问题,主要是因为注册的空降位置在system32下,而在当前路径下仍然有一份相应的文件.还有就是非system32下的进行注册怎么也不好使,不知到底是为啥.最后写成一个只执行一次的批处理文件来解决此问题[register.bat],内容如下:[氡气 5/10/2005]
Copy G:Share氡气ReleaseMSCOMCTL.ocx C:WINNTsystem32
Copy G:Share氡气ReleaseFM20.dll C:WINNTsystem32
Copy G:Share氡气ReleaseMSCOMM32.ocx C:WINNTsystem32
Copy G:Share氡气ReleaseMSCOMCT2.ocx C:WINNTsystem32
Copy G:Share氡气ReleaseMyPic.ocx C:WINNTsystem32
regsvr32.exe /s MSCOMCTL.ocx
regsvr32.exe /s FM20.dll
regsvr32.exe /s MSCOMM32.ocx
regsvr32.exe /s MSCOMCT2.ocx
regsvr32.exe /s MyPic.ocx
29.因为发行版本的程序,调试版本的控件而导致程序无法启动.[氡气]

30.在多线程里面调用成员对象[ActiveX]的方法产生异常,原因未知,估计是因为变量作用域问题.[舱盖升降系统,工作线程中调用m_ctlLEDP1.SetValue("11.22");]
解决方法:最好不要在线程里面操作有关界面的东西,而是发送消息来进行处理
原因:VB开发的控件没有正常版权,在[系统信息]中看到版本和制造商为“不可用”,即为版权问题。而VC开发的是有上面的正确信息,调用一切正常。问题有待于进一步研究2005-6-3
ACTIVEX 控件是 COM对象. 它按COM的方式运行. 对于运行在单线程公寓模型内的 COM 来说, 它是线程不安全的,不能直接将 COM 裸指针传递至其它的线程. 如果你确信要这么做,请对COM接口进行 线程调度:
IMyObject* p = ...;
IStream* pStream = 0;
HRESULT hr = CoMarshalInterThreadInterfaceInStream(__uuidof(p), p, &pStream);
if(FAILED(hr))
{
... ERROR !
}
DWORD dwID;
HANDLE hThread = CreateThread(NULL, 0, ThreadFnc, (void*)pStream, 0, &dwID);
....

DWORD WINAPI ThreadProc(LPVOID lp)
{
IStream* pStream = (IStream*)lp;
IMyObject* pItf = NULL;
HRESULT hr=CoGetInterfaceAndReleaseStream(pStream, __uuidof(pItf), (void**)&pItf);
if(FAILED(hr))
// ERROR
pStream->Release();
return 0;
}

// ....
hr = pItf->CallSomtMethod(para);
...
pItf->Release();
return 0;
}

COM库是针对线程有效的,因此你需要在线程起始处AfxOleInit()或者在起始处 ::CoInitialize(NULL); 结束处 ::CoUninitialize();
31.在AD采集时,始终出现前一个通道影响后一个通道,原因可能是因为没有通道建立延时[调用的DLL][ 舱盖升降系统]
32.AD采集数据线不能太长,如超过1m,这样会采集不到正确的数据.[舱盖升降系统]
33.DA输出时,输出信号会一直保留,直到下一次输出为止.[ 舱盖升降系统2005/5/20]
34.对话框中的打印实例:[轴承测试,6/17/2005]
void CDataMan::OnBtnPrint()
{
if(NULL==m_ctlDataIndex.GetFirstSelectedItemPosition())
{
AfxMessageBox("你没有选中待打印的记录,不能进行打印!");
return;
}
CDC dc;
CPrintDialog printDlg(FALSE);

if (printDlg.DoModal()==IDCANCEL)
return;//Get printer settings from user

dc.Attach(printDlg.GetPrinterDC());
//将纸张改为横向的
LPDEVMODE lpDM=printDlg.GetDevMode();
lpDM->dmOrientation=DMORIENT_LANDSCAPE;
lpDM->dmFields|=DM_ORIENTATION;
dc.ResetDC(lpDM);
//Get and attach a printer DC
dc.m_bPrinting = TRUE;
CString strTitle; // Get the application title
strTitle.LoadString(AFX_IDS_APP_TITLE);

DOCINFO di; // Initialise print document details
::ZeroMemory (&di, sizeof (DOCINFO));
di.cbSize = sizeof (DOCINFO);
di.lpszDocName = strTitle;

BOOL bPrintingOK = dc.StartDoc(&di);
// Begin a new print job. Get the printing extents and
//ore in the m_rectDraw field of a CPrintInfo object
CPrintInfo Info;

m_nWidth =dc.GetDeviceCaps(HORZRES);
m_nHeight=dc.GetDeviceCaps(VERTRES);
Info.m_rectDraw.SetRect(0,0,m_nWidth,m_nHeight);

m_fRatioX=(float)m_nWidth/PAGE_WIDTH;
m_fRatioY=(float)m_nHeight/PAGE_HEIGHT;

OnBeginPrinting(&dc,&Info);
//Call your "Init printing" function
for(UINT page = Info.GetMinPage(); page <=
Info.GetMaxPage() && bPrintingOK; page++)
{
dc.StartPage(); // begin new page
Info.m_nCurPage = page;
OnPrint(&dc,&Info);
//Call your "Print page" function
bPrintingOK = (dc.EndPage() > 0); // end page
}
OnEndPrinting(&dc, &Info);
// Call your "Clean up" function
if (bPrintingOK)
dc.EndDoc();// end a print job
else
dc.AbortDoc();// abort job.
dc.DeleteDC();// delete the printer DC]
}

void CDataMan::OnBeginPrinting(CDC *pDC, CPrintInfo *pInfo)
{
POSITION pos=m_ctlDataIndex.GetFirstSelectedItemPosition();
int nRow=m_ctlDataIndex.GetNextSelectedItem(pos);

m_uaPrint.RemoveAll();
do{
m_uaPrint.Add(nRow);
nRow=m_ctlDataIndex.GetNextSelectedItem(pos);
}while(nRow>=0);

m_penTable.CreatePen(PS_SOLID,1,RGB(10,10,10));
m_pOldPen=pDC->SelectObject(&m_penTable);

m_RptFont.CreateFont(FONT_HEIGHT*m_fRatioX,0, 0, 0,
FW_NORMAL, FALSE, FALSE, 0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH| FF_ROMAN, NULL);

//因为我在表格中只使用一种字体,所以可以在这里将字体选入设备中
m_pOldFont=pDC->SelectObject(&m_RptFont);

int nPage=m_uaPrint.GetSize();
nPage=nPage/(TABLE_ROW_NUMBER-1);
nPage+=(m_uaPrint.GetSize()%(TABLE_ROW_NUMBER-1)==0)?0:1;
pInfo->SetMinPage(1);
pInfo->SetMaxPage(nPage);
}

void CDataMan::OnPrint(CDC *pDC, CPrintInfo *pInfo)
{
int nTabs[TABLE_COLUMN_NUMBER]={
(COL_1+TABLE_LEFT_SPACE)*m_fRatioX,(COL_2+TABLE_LEFT_SPACE)*m_fRatioX,
(COL_3+TABLE_LEFT_SPACE)*m_fRatioX,(COL_4+TABLE_LEFT_SPACE)*m_fRatioX,
(COL_5+TABLE_LEFT_SPACE)*m_fRatioX,(COL_6+TABLE_LEFT_SPACE)*m_fRatioX};
CString szPrint;
TEXTMETRIC metrics;
pDC->GetTextMetrics(&metrics);

pDC->FillSolidRect(0,0,m_nWidth,m_nHeight,RGB(0XFF,0XFF,0XFF));
//打印文字内容//
szPrint.Format("令号: %s",m_ctlDataIndex.GetItemText(m_uaPrint.GetAt(0),2));
pDC->TextOut((PAGE_LEFT_SPACE+TABLE_LEFT_SPACE)*m_fRatioX,
(PAGE_TOP_SPACE+TABLE_TOP_SPACE)*m_fRatioX,szPrint);

szPrint.Format("附件号: ");
pDC->TextOut((PAGE_LEFT_SPACE+TABLE_LEFT_SPACE)*m_fRatioX,
(PAGE_TOP_SPACE+TABLE_TOP_SPACE+TABLE_ROW_HEIGHT)*m_fRatioY,szPrint);

//表单标题
szPrint=m_szRptTitle;
int nPosX=pInfo->m_rectDraw.right/2-(szPrint.GetLength()*metrics.tmMaxCharWidth)/2;
pDC->TextOut(1600*m_fRatioX,(PAGE_TOP_SPACE+TABLE_TOP_SPACE)*m_fRatioY,szPrint);

//列标题
szPrint.Format("t附件名称t轴承型号t轴承序号t测试时长(s)t测试类型t测试结果(KHz)");
pDC->TabbedTextOut(TABLE_LEFT_POSITION*m_fRatioX,(TABLE_TOP_POSITION+TABLE_TOP_SPACE)*m_fRatioY,szPrint,sizeof(nTabs),nTabs,0);
//"操作员","测试日期","轴承型号","轴承编号","测试结果","时间长度","门限电压","A导通","B导通","标志信息"
int nIndex=0;
int nRow;
for(nRow=1;nRow<=TABLE_ROW_NUMBER-1&&nRow<=m_uaPrint.GetSize();nRow++)//打印
{
nIndex=m_uaPrint.GetAt(nRow-1);
szPrint.Format("t%st%st%st%st%st%s",m_ctlDataIndex.GetItemText(nIndex,3),
m_ctlDataIndex.GetItemText(nIndex,4),m_ctlDataIndex.GetItemText(nIndex,5),
m_ctlDataIndex.GetItemText(nIndex,7),m_ctlDataIndex.GetItemText(nIndex,8),
m_ctlDataIndex.GetItemText(nIndex,9));
pDC->TabbedTextOut(TABLE_LEFT_POSITION*m_fRatioX,
(TABLE_TOP_POSITION+nRow*TABLE_ROW_HEIGHT+TABLE_TOP_SPACE)*m_fRatioY,
szPrint,sizeof(nTabs),nTabs,0);
}

m_uaPrint.RemoveAt(0,nRow>=TABLE_ROW_NUMBER?11:nRow-1);//去掉已经打印的部分
szPrint.Format("t工作者:%st日期:%s", m_ctlDataIndex.GetItemText(nIndex,0),
m_ctlDataIndex.GetItemText(nIndex,1));
int nRootTab[]={(COL_1+TABLE_LEFT_SPACE)*m_fRatioX,(PAGE_WIDTH-PAGE_RIGHT_SPACE-900)*m_fRatioY};
pDC->TabbedTextOut(TABLE_LEFT_POSITION*m_fRatioX,
(TABLE_TOP_POSITION+TABLE_ROW_NUMBER*TABLE_ROW_HEIGHT+TABLE_TOP_SPACE)*m_fRatioY,szPrint,sizeof(nRootTab),nRootTab,0);

//打印表格/
for(nRow=0;nRow{//打印横线
pDC->MoveTo(TABLE_LEFT_POSITION*m_fRatioX,(TABLE_TOP_POSITION+nRow*TABLE_ROW_HEIGHT)*m_fRatioY);
pDC->LineTo((PAGE_WIDTH-PAGE_RIGHT_SPACE)*m_fRatioX,(TABLE_TOP_POSITION+nRow*TABLE_ROW_HEIGHT)*m_fRatioY);
}

int nColPos[]={COL_1*m_fRatioX,COL_2*m_fRatioX,COL_3*m_fRatioX,COL_4*m_fRatioX,COL_5*m_fRatioX,COL_6*m_fRatioX,COL_END*m_fRatioX};
for(int nCol=0;nCol{//打印竖线
pDC->MoveTo(nColPos[nCol],TABLE_TOP_POSITION*m_fRatioY);
pDC->LineTo(nColPos[nCol],(TABLE_TOP_POSITION+TABLE_ROW_NUMBER
*TABLE_ROW_HEIGHT)*m_fRatioY);
}
}

void CDataMan::OnEndPrinting(CDC *pDC, CPrintInfo *pInfo)
{
pDC->SelectObject(m_pOldFont);
pDC->SelectObject(m_pOldPen);

m_pOldFont=NULL;
m_pOldPen=NULL;

m_penTable.DeleteObject();
m_RptFont.DeleteObject();
}

35.数据库的模糊匹配问题:在数据库的模糊匹配问题上,在不同地方使用的是不同的通配符,这一定的注意,要不然在一个地方测试通过了,但是在另一个地方却会出现无名的异常.在ACCESS里面的通配符为'*'(匹配多个字符)和'?'(匹配单个字符)。但是在ODBC中使用时,却是使用'%'(匹配多个字符)和"_"(匹配单个字符)。我在Hatch 中使用的是CDatabase和CRrectset,里面就应该使用"%"和"_"才能正常匹配。【2005-6-28 Hatch/CData
SELECT Name,MinPress,MaxPress,ResultName1,ResultName2,ResultName3,ResultName4, ResultA,ResultB,ResultC,ResultD,DateStart,Operator,ExpNo,PdtNo FROM ExpResult, ExpItem, ExpRsltInfo WHERE Name LIKE 'sd%' AND ExpID=ExpItem.IDD AND ExpNo='sd'"
36.在使用CListCtrl时,如果要显示表格线条,只需要将其扩展属性中加上LVS_EX_GRIDLINES即可,可以使用GetExtendedStyle()来的到现有的List属性,而使用 SetExtendedStyle()来进行设置即可.[6/30/2005]
37.在使用CListCtrl时,使用了Sort进行排序,这时却只显示了最后的一行,其余的全部都是空行.Sort的选项有:None,Ascending和Descending.当选择为None时就正常显示,其余的升序和降序都不能正常显示.[6/30/2005]
38.对于BSTR*类型参数的传递,在DynaGraph中的SetCaption定义如下:7/7/2005
void SetCaption(BSTR* pInfo, short nChoose);
我要调用他来进行Caption改变,但是我测试了很久都未能实现[以前成功使用过,不过太久了],而我又不想定义太多的变量来进行操作,所以问题变产生了。可行的解决方式如下[懒人方式]:
BSTR str;
str=(BSTR)m_szValue.GetBuffer(0);
m_ctlDGG.SetCaption(&str,++n);
39.字符编码转换问题.[7/13/2005 Antipush use Dynagraph.ocx]
在进行VC ActiveX(DynaGraph.ocx)在VB(Antipush)中使用时,出现了在ActiveX中不能正确识别所传入的字符串,究其原因,是因为字符编码不一致所造成的.之后在VB中使用编码转换函数进行转换之后在传入ActiveX中,问题得到圆满解决.
在VB中用于编码转换的函数是:StrConv(string,conversion,LCID),conversion选择的是vbFromUnicode.
如果是要用API进行转换,可以使用MultiByteToWideChar(…),可以参看MSDN的 Unicode and Character Set Functions
如果要查看编码方面的资料,可以到http://www.paper.edu.cn/home.jsp,有一篇叫做《汉字编码及其应用的研究》的论文。
40.VB中解决传递引用(byref)空指针(NULL)的问题. [7/13/2005 Antipush use Dynagraph.ocx]
在VB 中,首先是没有指针,其次是没有真正意义上的空指针,而引用是针对传入的变量而言,而不是常数,再有就是ActiveX是没有重新声明接口的方式,故是没有办法传递引用参数类型的ActiveX的空指针的.只有通过别的办法来进行解决,例如传递标志,特殊数字等.但是如果是API的话,可以把传引用 (byref)的声明更改为传值(byval)的声明即可以解决.
41.在VB中的几个常值:TRUE=-1;FALSE=0;vbNull=1;Null=asc.还需要注意的是,在不同语言的开发工具之间,对于数字的编码以不一定相同.(0)[7/13/2005]
42.IO输入有信号正/负之分,连接反了不能采集到信号。


<!--

一道面试题

silver6 | 09 十二月, 2005 10:49

一个单向链表,不知道头节点,一个指针指向其中的一个节点,问如何删除这个指针指向的节点?
当时我没答出来,后来问考官,它告诉我正解,大家下讨论一下。

设ListNode *p 指向链表某一节点

p->data = p->next->data;
ListNode *t = p->next;
p->next = p->next->next;
delete t;

题目有问题啊
如果是单循环链表就没有问题了

typedef struct linknode
{
int data;
struct linknode *next;
}node;


void del(node *p)
{
node *q;
q=p;
while(q->next!=p)
{
q=q->next;
}

q->next=p->next;
free(p);
}
//当然还有很多细节没有考虑
大概思路就是这样

void del(node *p)
{
node *q;
q=p;
while(q->next!=p)
{
q=q->next;
}

q->next=p->next;
free(p);
}


<!--

(int&)a 与 (int)&a 有什么区别!疑惑!!!!公司应聘考试题目!

silver6 | 08 十二月, 2005 13:34

请问各位前辈
#include
using namespace std;
void main()
{
float a = 1.0f;
cout << &a << endl;
cout << (int)&a << endl;
cout << (int&)a << endl;
cout << boolalpha << ( (int)a == (int&)a ) << endl; // 输出什么?
float b = 0.0f;
cout << (int)b << endl;
cout << (int&)b << endl;
cout << boolalpha << ( (int)b == (int&)b ) << endl; // 输出什么?
}

其中:(int&)a 与 (int)&a 有什么区别

谢谢先!!!

(int&)a == static_cast(a)
(int)&a == reinterpret_cast(&a);

(int&)a 不经过转换, 直接得到a在内存单元的值
(int)a a在内存中的值转换成int类型

float类型在内存中存储的形式是 ,符号位 指数 尾数
由754标准:阶码采用增码(该数补码的反符号),尾数采用原码
所以1.0f 在内存中的形式为
0011 1111 1000 0000 0000 0000 0000 0000
所以输出的是 0x3f800000
0 在内存中的的存储形式
0000 0000 0000 0000 0000 0000 0000 0000

(int&)a 把a强制转换成整形引用类型
(int)&a 把a的地址强制转换成整型
不过最好不要(int)&a


<!--

BENQ笔试题,不会做,求解

silver6 | 08 十二月, 2005 13:32

1,把一个32位数倒置
2,输入一个数字,把这个数字变成字符型
谁能帮帮我?
我的思路是把1里面的数拆到数组里,但是好象会超过LONG 的范围
2提我不知道怎么判断我输入了多大的数啊?

32位数倒置什么意思?
是2进制位倒置还是10进制位导致?

bool itoa(int num , char* p , int leng)
{
int count = 0;
int flag = 0;
char* q;
char* ip;
if (leng == 0 || p == NULL)
return 0;
if (num < 0)
{
num =- num;
flag = 1;
count ++;
*p = '-';
}

if (num == 0)
{
*p = '0';
*(p+1)=0;
return 1;
}

while (num > 0 && leng > count)
{
*(p+count) = '0' + num%10;
num /= 10;
count ++;
}

if (num > 0) return 0;
*(p + count) = 0;

q = p + count - 1;
ip = p;
if (flag)
ip = p + 1;

while(q > ip)
{
char a = *q;
*q = *ip;
*ip = a;
q --;
ip ++;
}

return 1;
}

void main()
{

int s = -1234567890;
char a[11];

if (itoa(s,a,11))
printf("%s",a);
}


<!--

一个女生教你怎么追MM

silver6 | 04 十二月, 2005 15:51

我是女生,看到有的男生想追自己喜欢的女孩子又不敢追,还想人家倒追她,我很反感.
从一个女生的角度,我比较了解女孩子的心理。女孩子大多不会主动出击,去追求自己喜欢的男孩,除了确实太喜欢了或者是那种比较有个性的勇敢的女孩子。所以,如果你很喜欢一个女孩子,并且认为她对你也有点意思,那就主动点,别跟她搞拉锯战,自己难受,说不定你喜欢的人也痛苦。
任何一个女孩子在被人追的时候,心理都是很复杂的。她也许很开心,但是又带着点惶恐,她对这个闯进自己平静的生活的男孩子,有着欲拒还迎的矛盾心理,她不是故意的。不要以为她在考验你,她其实也在和自己斗争,她怕受到伤害。
不要怕你的主动会带来她的反感,你不主动,她也不主动,也就慢慢淡下来了。如果你开始的表白被她拒绝,那也很正常呀。不要气馁,谁知道这个女孩子心里在想什么呢?
也许你再表白两次,她就会被你打动,一个心地善良的好女孩是很容易感动的。
如果你受到一次挫折,就立刻离开,再也不去答理这个女孩,把自己紧紧地保护起来,默默地舔舐伤口,在你痛苦的同时,殊不知,那个女孩子也许也正在心里遗憾、后悔呢!也许她会偷偷哭泣,后悔拒绝了你,再看到你漠然的眼神,她也很痛心,但是她却不会对你说,绝对不会请求你回来追她。你的过度的自尊心,可能会伤害了女孩子敏感的心。
她会认为你不是真诚的喜欢他,要不怎么会就这么放弃了她?
有人说,男生真难,追女孩子太不容易了。可是我的感觉却是,这种现象跟男人和女人的社会角色定位是分不开的,从生理和社会的角度,女人总是被动的。如果反过来,让男人都脉脉含羞,女人变得勇往直前,世界才乱了套呢!女人的羞涩总是美好的、动人的呀~我总是听说是某个勇敢的男人战胜了多少困难,最终获得佳人芳心。相反的例子却少得很。
有的男生,就怕别人说自己什么死缠烂打,落下不好的名声。可是我觉得男生追求自己喜欢的女孩子,受了点挫折还继续对这个女孩子好,说明人家确实很喜欢,很有诚意,如果没成功,也不遗憾,并没什么啊?谁让人家喜欢了?最讨厌别人跟着瞎掺乎,也最讨厌那种自己没主意,过于在乎别人对自己看法的男生,活该这种男生找不到女朋友。
是男人就勇敢点,女孩子本来就感性,容易沉浸在爱情里。虽然你付出了辛苦,而一旦你的真心打动了她,那么你得到的将是更多更久的加倍的爱。这样的例子,在身边比比皆是。女孩子对自己的男朋友都是很温柔很贴心的,为了换来这份甜蜜,开头的辛苦算什么啊?而且大多好女孩都爱得挺投入挺专一的。

所以,建议有的男生勇敢一点,去追求自己喜欢的女孩子,不要那么畏畏缩缩,一来是让人觉得你没男人气概,二来是你自己怪难受的,然而最最最重要的还是:最后你什么都得不到。幸福总是自己挣来的,别指望别人施舍给你!

再补充一句,我觉得主动点儿挺好的,因为你的目标是你自己真心喜欢的,女孩子往往被动,被动的只能选择接受和拒绝,所以我宁愿主动出击,爱我所爱,无怨无悔!

----- 人生很美好,快乐在其中,要学会寻找!

一、应该给MM留下什么样的第一印象(时间:刚开始接触MM)
1、我认为最关键的,是要让MM看到你的上进心。
男人的最大魅力在于事业有成,年轻人工作时间不长谈不上“有成”,这时候你就要让MM觉得你是个有上进心的人。
别的可以胡说八道,但这个问题不能含糊,你一定要告诉MM,你对未来充满信心,你不满足于现状,并且你已经有了长远的计划,总之你的未来不是梦。
2、要显得有信心、有责任心
不要像个小孩子,女孩子都很懒希望能找个依靠,你要拿出自己的信心和责任心来。
有一个错的选择总比没有选择要好的多。
3、不要太正经,但也不要太随便
该正经的地方就正经,该调侃的的时候就调侃。
女孩子都喜欢有点玩世不恭的男人,所以别显得对什么都特别在意,那样太呆板。
4、显得成熟一点
遇事镇定、从容不迫的男人对MM有致命的吸引力。
二、如何与MM展开进一步接触(时间:开始追的阶段)
1、这个阶段最关键的是不能着急,不要把事情弄的那么清楚,让人家一眼就能看出你在 追人家。
想一想,一般人都不会一眼就看上你,但也不会看一眼就讨厌你,都是老百姓家的孩子(除非你长得象周润发刘德华或者凯文科斯特纳),好感是需要随着了解的不断增加而实现的,所以问题的关键是你要得的进一步发展的机会。
站在女孩子的角度替人家想一想:你这么直接了当的冲过来要搞对象,女孩子肯定有心理压力。这要是接触一阵后发现不喜欢你,那不就成了耍你了么?所以如果你开始就摆出志在必得的姿势出来,基本上会被立刻闷回去。
2、要低姿态起步
首先要把关系定位成“朋友”,本来是“普通朋友”,你希望成为“好朋友”,有品位的还可以要求对方成为“红颜知己”什么的,总之千万不要说“追你”。
你想想,你如果根本不提“追”,那么女孩子也就更没机会“拒绝”你——你没追她怎么拒绝你?!
这样可以减轻女孩子的心理压力,使你们能顺利的交往下去。不要幻想认识三天就答应嫁给你,要充分的交往、了解,感情不是凭空产生的。
3、交往的过程中不要太急躁
要有张有弛,不要整天缠着人家,谁这样对你,你也会腻。我有个好朋友对我说,追女孩子的关键是八个字—— “忽冷忽热、欲擒故纵”(这是我同学多少年心血的结晶)。
你整天缠着人家自然不觉得你好,你适当的冷个一两天,女孩子就会想起你在的好处了。
还有就是不要拿出“非你不娶”的志气来,太掉价了不好,有时候可以耍点花招。
4、要适当的创造机会
前面说了,不要使事情立刻变成“你在追别人”,而你又需要得到接近女孩子的机会,这时就要看你的创造力了。
你可以搜集情报,想办法把守株待兔变成一场邂逅;也可以装做漫不经心的找出最最充足的理由邀请对方和你一起做什么事。
总之这个是最有技术含量的地方,实在不行可以找前辈请教。
5、切忌切忌:随便送人家礼物是不礼貌的
有些人追女孩子心切,喜欢经常买东西送人家,殊不知追女孩子最忌讳这个。
俗话说“无功不受禄”,你这样送人家东西就是在施加压力,人家会觉得欠你的,所以会 想办法还给你,如果没办法还给你就会想办法不和你交往,免得总是欠你人情。
如果你想显示自己的诚意,倒不妨请女孩子一起消费,比如说找好的餐厅吃饭,或者找贵 的地方一起玩什么的,女孩子自然能看出你花了很多钱,但钱终究是两个人一起花了而不是变成东西带回家。
三、“女朋友”到底是什么?
1、“女朋友”是一种事实,而不是一份承诺
你和女孩子开始交往,从“普通朋友”变成“好朋友”,再到“非常非常好、无话不谈的朋友”,某一个阳光灿烂的午后,你“不小心”拉了她的手;“月上柳梢头”,你突然袭击吻了她。这时她就已经是你的女朋友了,无论她是否承认,她心理已经认为你是他男朋友了。
我知道最高明的,直到上床了都没问过“你是否愿意做我女朋友”,最后还是女孩子急了 :“你怎么还不求我做你女朋友啊!”
所以说,千万不要急于把窗户纸捅破,情况越朦胧对你越有利。
2、“表白”是什么?
前面说了,表白实际上就是一个形式而已,正确的顺序应该是:事实上已经成为你女朋友 了,你才能向人家表白,水到渠成。 很多人弄不明白这个问题,总以为人家先答应做自己女朋友,然后再如何如何,我只能说非常非常“单纯”,也非常非常“愚蠢”。
3、有没有“迫不得已非表白不可”的时候?
有,比如说出现第三者,或者你和女孩子关系没有成熟但两个人可能分开一段时间。
这时候的表白就是条件不成熟的表白,风险非常大,类似于下围棋的时候形势严峻,落後的一方迫于无奈放出“胜负手”,赢了就赢了,输了也只能说“倒霉都是天生的”。
4、“爱”字不要轻易出口
经常看见论坛出现“大胆的表白”,说实话我真的认为这是非常不成熟的一种表现。“爱”是一个神圣的字,意味着追求,也意味着承诺,甚至体现出一种责任。
随便说“爱”的男人是不负责任的。
四、文明恋爱,不可强求
1、不是每个MM都能追到手的
好女孩子总会有很多人追,不可能遂了每个人的心愿,总会有失败者。举个例子,就算你刻苦钻研掌握了最搞超的追MM原理,你一样追不上TWINS里的任何一个。
换个角度考虑问题,一个小学没毕业的农村小保姆,即使对你再好,每个月赚600给你买700的礼物(透支),愿意为你“当牛做马”,你也不会爱上她。如果她每天哭哭啼啼的缠着,你肯定觉得烦。
所以说爱情是需要物质基础的,至少需要平衡。
2、追MM做是一种严肃的社会活动
千万不要把人家搞烦了,要给自己留后路。大丈夫何患无妻?有些MM确实势利眼(少数),如果不服气,你可以发愤图强,用事实证明“她当时瞎了眼”,绝对不要误人误己。

最后补充两点:
①千万不要在MM面前显得愤世嫉俗,愤世嫉俗有时候意味着“你很失败”。

<!--

一道面试题 没答出来 高人指教

silver6 | 02 十二月, 2005 16:57

编写一个C语言程序,实现父、子进程之间进行CPU的竞争与同步的过程。
可以由一个父进程创建两到三个子进程,每个进程独立完成不同的任务,如输出不同的数据等,以此来观察各进程占有CPU的情况。(可以利用wait函数来进行进程同步的控制。)

int main()
{
pid_t pid;
int i;

pid = fork();

if (pid == 0){
for (i = 0; i < 14; i++){
sleep (rand()%4);
printf("-SON-n");
}
return 0;
}

sleep (rand()%4);
printf("+FATHER+ Waiting for son's termination...n");
waitpid (pid, NULL, 0);
printf("+FATHER+ ...endedn");

return 0;
}


<!--

华为面试题

silver6 | 02 十二月, 2005 16:53

有1,2,....一直到n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间复杂度O(1),使用交换,而且一次只能交换两个数.

//这是昨天在华为的面试题,楞是没做出来.

#include
#include

int print( int*, int );
int swap( int&, int& );
int main()
{
int *a, n, i;
scanf( "%d", &n );
a = ( int* ) malloc ( ( n + 1 ) * sizeof( int ) );
for( i = 1; i <= n; i++ )
a[i] = i;
for( i = 1; i <= n; i++ )
swap( a[i], a[rand()%n+1] );
print( a, n );
for( i = 1; i <= n; i++ )
{
while( a[i] != i )
swap( a[i], a[a[i]] );
}
print( a, n );
return 0;
}
int swap( int &i, int &j )
{
int temp = i;
i = j;
j = temp;
return 0;
}
int print( int a[], int n )
{
int i;
for( i = 1; i <= n; i++ )
printf( "%4d", a[i] );
printf( "n" );
return 0;
}


TO:zez(思恩 闭关练功ing...) , 你的第一种算法不行吧, 第一个位置没交换好你就i++了,
象我的程序一样要加一句话才行:
int i,b;
for (i =0;i{
while( a[i] != ( i + 1 ) )
{
b=a[i];
a[i]=a[a[i]-1];
a[a[i]-1]=b;
}
}
看似两重循环, 实则复杂度为O(n).

int i,b;
for i =0;i{
b=a[i];
a[i]=a[a[i]-1];
a[a[i]-1]=b;
}
这种方法是不行的,不信看我的测试程序
#include
#include
void swap(int&,int&);
int main()
{
int *a;
int n;
int i,j,b;
scanf( "%d", &n );
a = ( int* ) malloc ( ( n ) * sizeof( int ) );
for( i = 0; i a[i] = i+1;
for( i = 0; i swap( a[i], a[rand()%n] );

for(i=0;iprintf("%d ",a[i]);
printf("n");

for(i=0;i{
//swap(a[i],a[a[i]-1]);
swap(a[i],a[a[i]-1]);
}
for(i=0;iprintf("%d ",a[i]);
printf("n");
free(a);
getchar();
return 0;
}
void swap(int& a,int& b)
{
int temp;
temp=a;
a=b;
b=temp;
}

输入 10
输出:4 8 1 2 3 10 9 7 5 6
1 7 3 4 2 6 5 8 9 10
哪位老兄再对程序该进一下,怎样才能得到准确的结果。

 查看全文

<!--

笔试题

silver6 | 01 十二月, 2005 09:30

1.代码如下:
class A
{
};
class B
{
A a;
};
A和B的关系是
A。继承(Inheritance)
B.聚合(Aggreation)/组合( Composition)
C.引用(Reference)
D.单件(Singleton)
2.有代码如下
#include
#include
#include
#define NULL 0
void AppendNode(int **ppNode,int nCount,int nValue)
{
if( ppNode != NULL )
{
*ppNode = (int *) realloc(*ppNode,(nCount+1)*sizeof(int));
(*ppNode)[nCount] = nValue;
}
}

int main()
{
int NodeArray[5] = {1,2,3,4,5};
int **ppNode;
*ppNode = NodeArray;
AppendNode(ppNode,5,4);
return 0;
}
请问程序中是否有错误
A。有错误数组操作越界
B。有错误有内存泄露
C。有错误用堆内存分配函数操作栈上内存
D。没有错误

3。某模块提供了如下的接口
class CDataOperator
{
public:
virtual void function(int data) = 0;
};
class CData
{
private:
int m_data[100];
public:
...
void Apply(CDataOperator &opt);
};
void CData::Apply(CDataoperator &opt)
{
for( int k = 0; k < 100; k++)
{
opt.function(m_data[k]);
}
}
请编写一个函数DataSum,返回其参数data对象的成员变量m_data中所有元素的和。
int DataSum(CData &data);

class CDataSumOperator : public CDataOperator{
public :
int he;
CDataSumOperator(): he(0){}
void function(int data){
he += data;
}
};

int DataSum(CData &data)
{
CDataSumOperator temp;
data.Apply(temp);
return temp.he;
}


<!--

新浪的技术人员问我的一道面试题

silver6 | 01 十二月, 2005 09:28

在数据库中有10000条记录,每次提取100条,应该怎么写?

不同数据库不同,
mysql ,postgres用的是limit,
oracle, db2用的是rownum函数,
sql server就惨了,只能 top ... not in top..


oracle:取100 - 200

slect * from
(
select * from table where rownum<=200
) where rownum>=100

select top 100 * from Users


<!--

一道华为公司的面试题目.怎么把字符串转化为字节数组?

silver6 | 01 十二月, 2005 09:26

一道华为公司的面试题目.怎么把字符串转化为字节数组?


比如 CString *str="ABCD";(长度不确定的字符串)  (VC中)

char *str="ABCD";(长度不确定的字符串)  (C语言中)

变为 byte DATA[4]; (要求字节数组长度应和字符串一致)
DATA[0]='A';
DATA[1]='B';
DATA[2]='C';
DATA[3]='D';

char *str='ABCD',*p=str;
byte *b = (byte *) malloc(strlen(str)),*c=b;
while (*p) *c++=*p++;

// ssh.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include
#define N 6

int main(int argc, char* argv[])
{
char *p="abcde";
char array[N];
for(int i=0;i{
array[i]=*p;
p++;
}
cout<cout<return 0;
}

#include
using namespace std;

char OneChar(const char* pChar = 0)
{
static const char* psChar;
if(NULL != pChar)
{
psChar = pChar;
return *psChar;
}

if('' != *psChar)
{
return *psChar++;
}
else
{
return 0;
}
}

const char* pChar = "ABCD" ;

void main()
{
int i = 0;
char Data[4];
char c;
OneChar(pChar);
while((c = OneChar()) != 0)
{
Data[i++] = c;
}
}

//动态字符维数
#include
using namespace std;

char OneChar(const char* pChar = 0)
{
static const char* psChar;
if(NULL != pChar)
{
psChar = pChar;
return *psChar;
}

if('' != *psChar)
{
return *psChar++;
}
else
{
return 0;
}
}

const char* pChar = "ABCDE" ;

void main()
{
int i = 0;
char *pData = new char[strlen(pChar)];
char c;
OneChar(pChar);
while((c = OneChar()) != 0)
{
pData[i++] = c;
}

for(i = 0; i < strlen(pChar); i++)
cout << pData[i] << endl;
}

#include
using namespace std;

void main()
{
char* pChar = "ABCDE";
char* pData = new char[strlen(pChar) + 1];
int i = 0;
while(*pChar != '')
{
pData[i++] = *pChar;
cout << *pChar << endl;
pChar++;
}
}


<!--

一个笔试题

silver6 | 01 十二月, 2005 09:21

class StringBuf
{
StringBuffer x,y;
public StringBuf()
{
x=new StringBuffer("A");
y=new StringBuffer("B");
append(x,y);
System.out.println("x>> "+x+" y>> "+y);
}
void append(StringBuffer x,StringBuffer y)
{
x=x.append(y);
y=x;
}
public static void main(String[] args)
{
StringBuf str=new StringBuf();
}
}

我对这个题目不是搞得很清楚.可以给我说说吗.
为什么会输出 x>>AB y>>B
谢谢了!

x=new StringBuffer("A");
y=new StringBuffer("B");
起初x=A,y=B

append(x,y);
执行append(x,y)后
y被加到x后面
x变成AB
因为函数是传值调用,append(StringBuffer x,StringBuffer y)里的y不是构造的y
所以构造函数里的y没变,还是B

改变参数引用值是没用的.只有改变参数引用所对应的对象才会起作用.

可以这么理解
张三和李四都是人名
a(张三,李四)
{
张三赚500块;
李四=张三;//在局部范围内,李四和张三都成了张三的名字
//想得到原李四,在这个局部范围再也找不着了.
}
调用完a后,回到大范围,李四还是原来的李四,张三还是原来的张三.

class A
{
StringBuffer x,y;
public A()
{
x=new StringBuffer("AA");
y=new StringBuffer("BB");
foo(x,y);
System.out.println("x>> "+x+" y>> "+y);
}
void foo(StringBuffer a,StringBuffer b)
{
/*a= */ a.append(b);
b=a;
}
public static void main(String[] args)
{
A str=new A();
}
}
这样就清楚了。

void append(StringBuffer x,StringBuffer y){//x,y局部变量
x=x.append(y);//x(成员)=x(局部变量).append(y(局部变量))
y=x;//y(局部变量)=x(局部变量)
}

明白了,那两个x,y参数真是糊弄人的!
改成a,b就清楚了

可以这么看
在foo中,定义了两个引用a和b,a和x同时指向一个StringBuffer,b和y同时指向一个StringBuffer,a.append(b)将a和x指向的对象修改了,所以显示出来x就也变化了,这里操纵的是指向的对象。

b指向了a所指向的对象,但y仍然指向原来的对象,这里改变的是应用本身。


在b=a;后面加上System.out.println(b.toString());就更明显了

void append(StringBuffer x,StringBuffer y){//x,y局部变量
x=x.append(y);//x(局部变量)=x(成员).append(y(局部变量))
y=x;//y(局部变量)=x(局部变量)
}

对于这个你只要把StringBuffer类型 理解为String 类型就可以了,其实两种类型是用在字符串变量中,只是StringBuffer用在多操作的字符串

StringBuffer在堆内存中只有1份
void append(StringBuffer x,StringBuffer c){//x,c栈变量(就是引用)
c.append(x);System.out.println(c);//append使栈变量c指向堆中的值发生改变
x.append(c);System.out.println(x);
System.out.println(x);
c=x;System.out.println(c);//引用指向改变
}

************ 下文(转载)能很好地解答这问题 ************

在不同的java新闻组中,参数是传值还是传址一直是一个经常被争辩的话题。误解的中心是以下两个事实:

对象是传引用的
参数是传值的
这两个能够同时成立吗?一个字:是!在java中,你从来没有传递对象,你传递的仅仅是对象的引用!一句话,java是传引用的。然而,当你传递一个参数,那么只有一种参数传递机制:传值!

通常,当程序员讨论传值和传引用时,他们是指语言的参数传递机制,c++同时支持这两种机制,因此,以前使用过c++的程序员开始好像不能确定的java是如何传参数的。java语言为了事情变得简单只支持参数传值的机制。

java中的变量有两种类型:引用类型和原始类型。当他们被作为参数传递给方法时,他们都是传值的。这是一个非常重要的差别,下面的代码范例将说明这一点。在继续前,我们有必要定义一下传值和传引用。

传值意味着当参数被传递给一个方法或者函数时,方法或者函数接收到的是原始值的副本。因此,如果方法或者函数修改了参数,受影响的只是副本,原始值保持不变。

关于java中的参数传递的混乱是因为很多java程序员是从c++转变过来的。c++有引用和非引用类型的变量,并且分别是通过传引用和传值得。java语言有原始类型和对象引用,那么,按照逻辑,java对于原始类型使用传值而对引用是传引用的,就像c++一样。毕竟,你会想到如果你正在传递一个引用,那么它一定是传引用的。这是一个很诱惑人的想法,但是是错误的!

在c++和java中,当函数

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/122100/viewspace-653/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/122100/viewspace-653/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值