memcpy函数的实现代码

memcpy函数的实现代码
memcpy函数的实现代码

memcpy函数的实现代码(面试急用)

void memcpy( void * dest, void * src , size_t n)

{

char far * pd = (char far * )dest;

char far * ps = (char far * )src;

long len = (long)sizeof(size_t) * n;

for( long i=0; i

*pd++ = *ps++;

}

TOP 精华推荐:一段小代码,是否出现了野指针?请大家发表一下对野指针理解!(希望能Show 出代码)

改进一下,这样我觉得更安全一点

void memcpy( void * dest, void * src , size_t n)

{

char far * pd = (char far * )dest;

char far * ps = (char far * )src;

long len = (long)sizeof(size_t) * n;

while(len)

{

while((*pd++ = *ps++)!= '\0 ')

len--;

}

}

有2个问题:

1. n不就是要拷贝的字节数?为什么还要乘以sizeof(size_t)? 是sizeof(char)吧?

2. 为什么要far指针呢?是不是要考虑跨段拷贝的情形?

你的方法我好像更不能理解, 为什么要判断 '\0 '呢? 这又不是拷贝字符串.

程序是这样的:

void _fmemcpy(void far *dest, void far* src, long n)

{

while (n-=sizeof(char)) *((char far*)dest)=*((char far*)src);

}

不过,在32位语言中,far是不必要的

C里面定义的memcpy讲求的是快,没有保证任何的安全性。

抱歉,有个bug,改之

void _fmemcpy(void far *dest, void far* src, long n)

{

do

*((char far*)dest)=*((char far*)src);

while (n-=sizeof(char));

}

extern void *MEMCPY ( void *pDest, const void *pSrc, Length

size )

{

Counter cNumBytes;

char *pD, *pS;

if ((NULL == pSrc) || (NULL == pDest))

return NULL;

pD = ( char * ) pDest;

pS = ( char * ) pSrc;

cNumBytes = 0;

while ( cNumBytes < size )

{

*pD++ = *pS++;

cNumBytes++;

}

return pDest;

}

void * memmove(void * dst, void * src, size_t count)

{

void * ret = dst;

if (dst <= src || dst > = (src + count)) {

/* * Non-Overlapping Buffers * copy from lower addresses to higher addresses

*/

while (count--)

*dst++ = *src++;

}

else {

/*

* Overlapping Buffers

* copy from higher addresses to lower addresses

*/

dst += count - 1;

src += count - 1;

while (count--)

*dst-- = *src--;

}

return(ret);

}

#include

void * memcpy(void *s1, const void *s2, register size_t n)

{

register char *p1 = s1;

register const char *p2 = s2;

if (n)

{

n++;

while (--n > 0)

{

*p1++ = *p2++;

}

}

return s1;

}

看看真正的C/C++库的是现代码吧

Func@ memmove, _EXPFUNC, _RTLENTRYF, , ,

Link@ esi,edi

mov edi,dest

mov esi,src

mov ecx,n

mov edx,ecx

cmp edi,esi ; dest < source ?

jb mov_fwd ; yes, do a simple forward move

je mov_end ; dest == source ? do nothing

std ; force esi and edi to decrement

lea esi,[esi+ecx-1] ; point to last byte of source buffer

lea edi,[edi+ecx-1] ; point to last byte of dest buffer

and ecx,3 ; copy trailing bytes rep movsb

mov ecx,edx ; get original count back

shr ecx,1 ; calculate no. of longwords

shr ecx,1

sub esi,3 ; point to previous longword in source

sub edi,3 ; point to previous longword in dest

rep movsd ; copy longwords

cld ; clear direction

flag

jmp short mov_end

mov_fwd:

cld

shr ecx,1

shr ecx,1

rep movsd ; copy longwords

mov ecx,edx ; get original count back

and ecx,3 ; calculate remainder byte count (0-3)

rep movsb ; copy remaining bytes mov_end:

mov eax,dest

Unlink@ esi,edi

Return@

EndFunc@ memmove

做几件事情:

1。内存自身拷贝问题

2。有相交重叠的两块内存的拷贝问题

3。拷贝速度的问题

对于拷贝速度问题,方法是32位机器上双字对齐边界开始拷贝,16位机器上字边界开始拷贝,把内存分为3段:

对齐边界之前的字节,对齐拷贝的字节,最后对齐边界之后的字节

第一段使用一个movsb和movsw完成任务,第二段采用movsd完成,第三段也采用一个movsw和movsb

完成。

面试过程只要说出这三个要点就可以了,程序其实你可以不用编写了

刚才拷贝部分的等价操作如下

memmove(char * src,char *dest, int n) // <-- 实际定义是void *

if( 0 != (long(dest) & 0x1)) O

n--, (*dest++ = *src++);

if( 0 != (long(dest) & 0x2)) {

*(short*)dest++ = *(short*)src++;

n--; n--;

}

int c = n / 4;

while( c -- )

*(long*)dest++ = *(long*)src++;

int k = n %4;

if( k > = 2 ) *(short*)dest++ = *(short*)src++;

if( k == 1 ) *dest++ = src++;

其他再加上一些if判断就可以了

的确memcpy讲求的是效率,下面的代码是c库的实现代码

看一看大师是怎样考虑的。

typedef int word; /* "word " used for optimal copy speed */

#define wsize sizeof(word)

#define wmask (wsize - 1)

void * memcpy(void *dst0, const void *src0, size_t length)

{

char *dst = dst0;

const char *src = src0;

size_t t;

if (length == 0 || dst == src) /* nothing to do */

goto done;

/*

* Macros: loop-t-times; and loop-t-times, t> 0

*/

#define TLOOP(s) if (t) TLOOP1(s)

#define TLOOP1(s) do { s; } while (--t)

if ((unsigned long)dst < (unsigned long)src) {

/*

* Copy forward.

*/

t = (int)src; /* only need low bits */

if ((t | (int)dst) & wmask) {

/*

* Try to align operands. This cannot be done

* unless the low bits match.

*/

if ((t ^ (int)dst) & wmask || length < wsize)

t = length;

else

t = wsize - (t & wmask);

length -= t;

TLOOP1(*dst++ = *src++);

}

/*

* Copy whole words, then mop up any trailing bytes.

*/

t = length / wsize;

TLOOP(*(word *)dst = *(word *)src; src += wsize; dst += wsize); t = length & wmask;

TLOOP(*dst++ = *src++);

} else {

/*

* Copy backwards. Otherwise essentially the same.

* Alignment works as before, except that it takes

* (t&wmask) bytes to align, not wsize-(t&wmask).

*/

src += length;

dst += length;

t = (int)src;

if ((t | (int)dst) & wmask) {

if ((t ^ (int)dst) & wmask || length <= wsize)

t = length;

else

t &= wmask;

length -= t;

TLOOP1(*--dst = *--src);

}

t = length / wsize;

TLOOP(src -= wsize; dst -= wsize; *(word *)dst = *(word *)src);

t = length & wmask;

TLOOP(*--dst = *--src);

}

done:

return (dst0);

}

VC:

void* Dest=(void*)pSurf;

void* Src = (void*)pBuffer;

size_t nBytes = (size_t)buffLen;

_asm

{

push edi

push esi

mov esi, dword ptr[Src]

mov edi, dword ptr[Dest]

mov ecx, nBytes

shr ecx, 6 ; nBytes / 64

align 4

Memcpy_Loop:

movq mm0, qword ptr[esi]

movq mm1, qword ptr[esi+8*1]

movq mm2, qword ptr[esi+8*2]

movq mm3, qword ptr[esi+8*3]

movq mm4, qword ptr[esi+8*4]

movq mm5, qword ptr[esi+8*5]

movq mm6, qword ptr[esi+8*6]

movq mm7, qword ptr[esi+8*7] movq qword ptr[edi], mm0

movq qword ptr[edi+8*1], mm1 movq qword ptr[edi+8*2], mm2 movq qword ptr[edi+8*3], mm3 movq qword ptr[edi+8*4], mm4 movq qword ptr[edi+8*5], mm5 movq qword ptr[edi+8*6], mm6 movq qword ptr[edi+8*7], mm7 add esi, 64

add edi, 64

loop Memcpy_Loop

mov ecx, nBytes

and ecx, 63

cmp ecx, 0

je Memcpy_End

rep movsb

Memcpy_End:

emms

pop esi

pop edi

}

做游戏常用的函数

时间延迟函数 函数名: delay 功能: 将程序的执行暂停一段时间(毫秒) 用法: void delay(unsigned millis econds); 重画屏幕区域的函数 函数名:getimage 功能:将指定区域的一个位图存到主存中 用法:void far getimage( int left, int top, int right, int bottom, v oid far *bitmap); 函数名:putimage 功能:在屏幕上输出一个位图 用法:void far putimage( int x, i nt y, void far *bitmap, int op ); 图像大小函数

函数名: imagesize 功能: 返回保存位图像所需的字节数 用法: unsigned far imagesize( in t left, int top, int right, int bo ttom ); 异或模式函数 函数名: setwritemode 功能: 设置图形方式下画线的输出模式 用法: void far setwritemode(int mode); 参数MODE可以被设置位COPY_PUT 或者XOR_PUT两种模式。当mode被设置为XOR_PUT,其后的图形操作将都采用异或方式。此外之前提到的putimage()函数也可以采用异或模式向屏幕复制图像。 检测键盘输入函数 函数名: kbhit

功能: 检查当前按下的键 用法: int kbhit(void); 键盘接口函数 函数名: bioskey 功能: 直接使用BIOS服务的键盘接口用法: int bioskey(int cmd); 该函数通过bois中断0x16执行键盘操作,由参数cmd来决定具体的操作。Cmd 具体操作 0 读取按键的ascii码 1 测试是否有按键如果没有按键返回0 如果按键为ctrl+brk 返回-1 如果是其他按键返回按键本身键值(直到此按键被取出后恢复0) 2 返回shift key 状态 以下是当cmd为2的时候,返回值的具体含义 cmd返回值触发特殊键

memset函数使用详解

memset函数使用详解 今天做题卡在MEMSET函数的使用上了,本来以为int a[100]; memset(a, MAX,sizeof(a));就是将a数组全部赋值为MAX,现在才知道他的填充是以字节为单位,一般用于对字符型变量的初值进行赋值. 更详细的解说见百度百科--> https://www.360docs.net/doc/de3664943.html,/view/982208.htm 1。void *memset(void *s,int c,size_t n) 总的作用:将已开辟内存空间s 的首n 个字节的值设为值c。 2。例子 #include void main(){ char *s="Golden Global View"; clrscr(); memset(s,'G',6); printf("%s",s); getchar(); return 0; } 3。memset() 函数常用于内存空间初始化。如: char str[100]; memset(str,0,100); 4。memset()的深刻内涵:用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘/0’;例:char a[100];memset(a, '/0', sizeof(a)); memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;例:char a[100],b[50]; memcpy(b, a, sizeof(b));注意如用sizeof(a),会造成b的内存地址溢出。 strcpy就只能拷贝字符串了,它遇到'/0'就结束拷贝;例:char a[100],b[50];strcpy(a,b);如用strcpy(b,a),要注意a中的字符串长度(第一个‘/0’之前)是否超过50位,如超过,则会造成b 的内存地址溢出。 5.补充:一点心得 memset可以方便的清空一个结构类型的变量或数组。 如:

通达信函数大全使用说明

软件简介: 通达信全部函数及其用法(2011年最新版) (一)行情函数 1)HIGH(H)最高价返回该周期最高价.2)LOW(L)最低价返回该周期最低价.3)CLOSE(C)收盘价返回该周期收盘价.4)VOL(V)成交量(手)返回该周期成交量.5)OPEN (O)开盘价返回该周期开盘价.6)ADVANCE 上涨家数返回该周期上涨家数. (本函数仅对大盘有效)7)DECLINE 下跌家数返回该周期下跌家数. (本函数仅对大盘有效)8)AMOUNT 成交额(元)返回该周期成交额.9)VOLINSTK 持仓量返回期货该周期持仓量.10)QHJSJ 期货结算价返回期货该周期结算价. 11)BUYVOL 外盘(手)返回外盘,即时行情数据 12)SELVOL 外盘(手)返回外盘 13)ISBUYORDER 主动性买单返回当前成交是否为主动性买单.用法: ISBUYORDER,当本笔成交为主动性买盘时,返回1,否则为0 14)DHIGH 不定周期最高价返回该不定周期最高价.15)DOPEN 不定周期开盘价返回该不定周期开盘价.16) DLOW 不定周期最低价返回该不定周期最低价.17)DCLOSE 不定周期收盘价返回该不定周期收盘价.18) DVOL 不定周期成交量价返回该不定周期成交量价.19)NAMELIKE 模糊股票名称返回股票名称是否以参数开头.

用法: if(NAMELIKE('ST'),x,y); 20)CODELIKE 模糊股票代码返回股票代码是否以参数开头. 用法: if(CODELIKE('600'),x,y); 21)INBLOCK 属于某板块返回股票是否属于某板块. 用法: if(INBLOCK('沪深300'),x,y); (二)时间函数 1)PERIOD 周期取得周期类型. 结果从0到11,依次分别是1/5/15/30/60分钟,日/周/月,多分钟,多日,季,年. 2)DATE 日期取得该周期从1900以来的的年月日. 用法: DATE 例如函数返回1000101,表示2000年1月1 日,DATE+19000000后才是真正的日期值 3)TIME 时间取得该周期的时分秒.用法: TIME 函数返回有效值范围为(000000-235959) 4)YEAR 年份取得该周期的年份.5)MONTH 月份取得该周期的月份.用法: 函数返回有效值范围为(1-12) 6)WEEKDAY 星期取得该周期的星期数.用法: WEEKDAY 函数返回有效值范围为(1-7) 7)DAY 日取得该周期的日期.用法: DAY 函数返回有效值范围为(1-31) 8)HOUR 小时取得该周期的小时数.用法: HOUR 函数返回有效值范围为(0-23),对于日线及更长的分析周期值为0

C++中所有函数的使用说明

C++函数大全 2010-04-10 10:11 数学函数,所在函数库为math.h、stdlib.h、string.h、float.h int abs(int i) 返回整型参数i的绝对值 double cabs(struct complex znum) 返回复数znum的绝对值 double fabs(double x) 返回双精度参数x的绝对值 long labs(long n) 返回长整型参数n的绝对值 double exp(double x) 返回指数函数ex的值 double frexp(double value,int *eptr) 返回value=x*2n中x的值,n存贮在eptr中 double ldexp(double value,int exp); 返回value*2exp的值 double log(double x) 返回logex的值 double log10(double x) 返回log10x的值 double pow(double x,double y) 返回xy的值 double pow10(int p) 返回10p的值 double sqrt(double x) 返回+√x的值 double acos(double x) 返回x的反余弦cos-1(x)值,x为弧度 double asin(double x) 返回x的反正弦sin-1(x)值,x为弧度 double atan(double x) 返回x的反正切tan-1(x)值,x为弧度 double atan2(double y,double x) 返回y/x的反正切tan-1(x)值,y的x为弧度 double cos(double x) 返回x的余弦cos(x)值,x为弧度 double sin(double x) 返回x的正弦sin(x)值,x为弧度 double tan(double x) 返回x的正切tan(x)值,x为弧度 double cosh(double x) 返回x的双曲余弦cosh(x)值,x为弧度 double sinh(double x) 返回x的双曲正弦sinh(x)值,x为弧度 double tanh(double x) 返回x的双曲正切tanh(x)值,x为弧度 double hypot(double x,double y) 返回直角三角形斜边的长度(z), x和y为直角边的长度,z2=x2+y2 double ceil(double x) 返回不小于x的最小整数 double floor(double x) 返回不大于x的最大整数 void srand(unsigned seed) 初始化随机数发生器 int rand() 产生一个随机数并返回这个数 double poly(double x,int n,double c[])从参数产生一个多项式 double modf(double value,double *iptr)将双精度数value分解成尾数和阶double fmod(double x,double y) 返回x/y的余数 double frexp(double value,int *eptr) 将双精度数value分成尾数和阶double atof(char *nptr) 将字符串nptr转换成浮点数并返回这个浮点数double atoi(char *nptr) 将字符串nptr转换成整数并返回这个整数 double atol(char *nptr) 将字符串nptr转换成长整数并返回这个整数 char *ecvt(double value,int ndigit,int *decpt,int *sign) 将浮点数value转换成字符串并返回该字符串 char *fcvt(double value,int ndigit,int *decpt,int *sign) 将浮点数value转换成字符串并返回该字符串

strncpy函数的用法

strcpy ,strncpy ,strlcpy地用法 好多人已经知道利用strncpy替代strcpy来防止缓冲区越界。 但是如果还要考虑运行效率的话,也许strlcpy是一个更好的方式。 1. strcpy 我们知道,strcpy 是依据/0 作为结束判断的,如果to 的空间不够,则会引起buffer overflow。strcpy 常规的实现代码如下(来自OpenBSD 3.9): char * strcpy(char *to, const char *from) { char *save = to; for (; (*to = *from) != '/0'; ++from, ++to); return(save); } 但通常,我们的from 都来源于用户的输入,很可能是非常大的一个字符串,因此strcpy 不够安全。 2. strncpy 在ANSI C 中,strcpy 的安全版本是strncpy。 char *strncpy(char *s1, const char *s2, size_t n); 但strncpy 其行为是很诡异的(不符合我们的通常习惯)。标准规定n 并不是sizeof(s1),而是要复制的char 的个数。一个最常见的问题,就是strncpy 并不帮你保证/0 结束。 char buf[8]; strncpy( buf, "abcdefgh", 8 ); 看这个程序,buf 将会被"abcdefgh" 填满,但却没有/0 结束符了。 另外,如果s2 的内容比较少,而n 又比较大的话,strncpy 将会把之间的空间都用/0 填充。这又出现了一个效率上的问题,如下: char buf[80]; strncpy( buf, "abcdefgh", 79 ); 上面的strncpy 会填写79 个char,而不仅仅是"abcdefgh" 本身。 strncpy 的标准用法为:(手工写上/0)

常用C语言图形函数使用说明

常用C语言图形函数使用说明 (以下函数均应在图形方式初始之后使用,在win-tc中使用BGI图形程序模板时,其中已经定义有一个initgr函数,在main函数中应在执行initgr函数之后再使用这些函数。使用这些函数时,均应在程序中包含头文件graphics.h,即程序开始时应有#include "graphics.h") 1、setcolor(色彩值):设置绘图色彩,使用该函数后,图形函数所绘制的直线或曲线为该函数中指定的色彩。例如: setcolor(YELLOW); circle(320,240,100); 在屏幕中央以黄色绘制半径为100的圆。(关于画图色彩使用的说明) 2、setbkcolor(色彩值):设置图形屏幕的背景色彩,使用该函数后图形屏幕清屏,背景色彩为该函数中所指定的色彩。如果没有使用该函数设置背景色,则图形屏幕的背景色彩为黑色。 3、cleardevice():清除图形屏幕上已经绘制的内容,该函数没有参数。 4、line(x1,y1,x2,y2): 绘制直线段,其中(x1,y1)为一个端点的坐标,(x2,y2)为另一个端点的坐标。直线的色彩为在使用该函数之前通过setcolor函数所设置的色彩。例如: setcolor(WHITE); line(0,240,639,240);绘制一条横贯屏幕中间的白色水平直线。 5、circle(x,y,r):绘制一个以(x,y)为圆心坐标,半径为r的圆。例如: setcolor(WHITE); circle(320,240,100);绘制一个以(320,240)为圆心位置,半径为100 的圆。 6、rectangle(x1,y1,x2,y2):绘制一个以(x1,y1)和(x2,y2)为对角端点坐标的矩形 7、putpixel(x,y,color):在(x,y)坐标位置处绘制一个点,点的色彩由color 指定。例如: putpixel(320,240,RED);在屏幕中央绘制一个红色的点。

memcpy和memmove的区别与实现

区别:两个函数都是进行n字节内存内容的拷贝,入口参数和返回参数也都一样,可是这两个函数在内部实现上是有一定区别的,这主要是因为dest内存区域和src内存区域可能有一下四种不同的情况, 注意count的影响: 从图中可以看出,src的内存区域和dest的内存区域相对位置和重叠关系有四种情况,memcpy没有考虑重叠的情况,而memmove考虑到了全部情况,因此memcpy函数的时候可能出现意向不到的结果。 这两个函数的实现: ***********下面两个是错误的实现************** void* memcpy(void* dest, void* source, size_t count) { void* ret = dest; //copy from lower address to higher address while (count--) *dest++ = *source++; //不知道两个指针的类型,不可以这样自加。 return ret; }

void* memmove(void* dest, void* source, size_t count) { void* ret = dest; if (dest <= source || dest >= (source + count)) { //Non-Overlapping Buffers //copy from lower addresses to higher addresses while (count --) *dest++ = *source++; } else{ //Overlapping Buffers //copy from higher addresses to lower addresses dest += count - 1; source += count - 1; while (count--) *dest-- = *source--; // 情况同上 } return ret; } ***********************正确的如下************************** void* mymemcpy(void* dest, void* source, size_t count) { char*ret = (char*)dest; char*dest_t = ret; char*source_t = (char*)source; while (count--){ *dest_t++=*source_t++; } return ret; }

【重要】C++拷贝函数详解 20150111

C++拷贝函数详解 1.什么是拷贝构造函数: CA(const CA& C)就是我们自定义的拷贝构造函数。可见,拷贝构造函数是一种特殊的构 造函数,函数的名称必须和类名称一致,它的唯一的一个参数是本类型的一个引用变量,该参 数是const类型,不可变的。例如:类X的拷贝构造函数的形式为X(X& x)。 当用一个已初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候,拷 贝构造函数就会被自动调用。 也就是说,当类的对象需要拷贝时,拷贝构造函数将会被调用。以下情况都会调用拷贝构造函数: ①程序中需要新建立一个对象,并用另一个同类的对象对它初始化,如前面介绍的那样。 ②当函数的参数为类的对象时。 在调用函数时需要将实参对象完整地传递给形参,也就是需要建立一个实参的拷贝,这就 是按实参复制一个形参,系统是通过调用复制构造函数来实现的,这样能保证形参具有和实参 完全相同的值。 ③函数的返回值是类的对象。 在函数调用完毕将返回值带回函数调用处时。 此时需要将函数中的对象复制一个临时对象并传给该函数的调用处。如 Box f( ) //函数f的类型为Box类类型 {Box box1(12,15,18); return box1; //返回值是Box类的对象 } int main( ) {Box box2; //定义Box类的对象box2 box2=f( ); //调用f函数,返回Box类的临时对象,并将它赋值给 box2 } 如果在类中没有显式地声明一个拷贝构造函数,那么,编译器将会自动生成一个默认的 拷贝构造函数,该构造函数完成对象之间的位拷贝。位拷贝又称浅拷贝,后面将进行说明。 自定义拷贝构造函数是一种良好的编程风格,它可以阻止编译器形成默认的拷贝构造函数,提高源码效率。 浅拷贝和深拷贝 在某些状况下,类内成员变量需要动态开辟堆内存,如果实行位拷贝,也就是把对象里的

excel函数代码

excel公式应用大全 1、ABS函数函数名称:ABS 主要功能:求出相应数字的绝对值。使用格式:ABS(number) 参数说明:number代表需要求绝对值的数值或引用的单元格。 应用举例:如果在B2单元格中输入公式:=ABS(A2),则在A2单元格中无论输入正数(如100)还是负数(如-100),B2中均显示出正数(如100)。 特别提醒:如果number参数不是数值,而是一些字符(如A等),则B2中返回错误值“#VALUE!”。 2、AND函数函数名称:AND 主要功能:返回逻辑值:如果所有参数值均为逻辑“真(TRUE)”,则返回逻辑“真(TRUE)”,反之返回逻辑“假(FALSE)”。 使用格式:AND(logical1,logical2, ...) 参数说明:Logical1,Logical2,Logical3……:表示待测试的条件值或表达式,最多这30个。 应用举例:在C5单元格输入公式:=AND(A5>=60,B5>=60),确认。如果C5中返回TRUE,说明A5和B5中的数值笥诘扔?0,如果返回FALSE,说明A5和B5中的数值至少有一个小于60。 特别提醒:如果指定的逻辑条件参数中包含非逻辑值时,则函数返回错误值“#VALUE!”或“#NAME”。 3、AVERAGE函数函数名称:AVERAGE 主要功能:求出所有参数的算术平均值。 使用格式:AVERAGE(number1,number2,……) 参数说明:number1,number2,……:需要求平均值的数值或引用单元格(区域),参数不超过30个。 应用举例:在B8单元格中输入公式:=AVERAGE(B7:D7,F7:H7,7,8),确认后,即可求出B7至D7区域、F7至H7区域中的数值和7、8的平均值。 特别提醒:如果引用区域中包含“0”值单元格,则计算在内;如果引用区域中包含空白或字符单元格,则不计算在内。 4、COLUMN 函数 函数名称:COLUMN 主要功能:显示所引用单元格的列标号值。 使用格式:COLUMN(reference) 参数说明:reference为引用的单元格。 应用举例:在C11单元格中输入公式:=COLUMN(B11),确认后显示为2(即B列)。 特别提醒:如果在B11单元格中输入公式:=COLUMN(),也显示出2;与之相对应的还有一个返回行标号值的函数——ROW(reference)。 5、CONCATENATE函数 函数名称:CONCATENATE 主要功能:将多个字符文本或单元格中的数据连接在一起,显示在一个单元格中。 使用格式:CONCATENATE(Text1,Text……) 参数说明:Text1、Text2……为需要连接的字符文本或引用的单元格。 应用举例:在C14单元格中输入公式:=CONCATENATE(A14,"@",B14,".com"),确认后,即可将A14单元格中字符、@、B14单元格中的字符和.com连接成一个整体,显示在C14单元格中。 特别提醒:如果参数不是引用的单元格,且为文本格式的,请给参数加上英文状态下的双引号,如果将上述公式改为: =A14&"@"&B14&".com",也能达到相同的目的。 6、COUNTIF函数 函数名称:COUNTIF 主要功能:统计某个单元格区域中符合指定条件的单元格数目。 使用格式:COUNTIF(Range,Criteria) 参数说明:Range代表要统计的单元格区域;Criteria表示指定的条件表达式。 应用举例:在C17单元格中输入公式:=COUNTIF(B1:B13,">=80"),确认后,即可统计出B1至B13单元格区域中,数值大于等于80的单元格数目。 特别提醒:允许引用的单元格区域中有空白单元格出现 7、DATE函数 函数名称:DATE 主要功能:给出指定数值的日期。 使用格式:DATE(year,month,day) 参数说明:year为指定的年份数值(小于9999);month为指定的月份数值(可以大于12);day为指定的天数。 应用举例:在C20单元格中输入公式:=DATE(2003,13,35),确认后,显示出2004-2-4。 特别提醒:由于上述公式中,月份为13,多了一个月,顺延至2004年1月;天数为35,比2004年1月的实际天数又多了4天,故又顺延至2004年2月4日。 上页我们介绍了ABS、AND、AVERAGE、COLUMN 、CONCATENATE、COUNTIF 、DATE 这七个常用函数,今天我们继续介绍下面的七个常用函数: DATEDIF函数:计算返回两个日期参数的差值。 DAY函数:计算参数中指定日期或引用单元格中的日期天数。 DCOUNT函数:返回数据库或列表的列中满足指定条件并且包含数字的单元格数目。 FREQUENCY函数:以一列垂直数组返回某个区域中数据的频率分布。 IF函数:根据对指定条件的逻辑判断的真假结果,返回相对应条件触发的计算结果。 INDEX函数:返回列表或数组中的元素值,此元素由行序号和列序号的索引值进行确定。 INT函数:将数值向下取整为最接近的整数。 8、DATEDIF函数 函数名称:DATEDIF 主要功能:计算返回两个日期参数的差值。

memcpy函数详解

memcpy函数详解 1)memcpy函数用法解析 结构如下: void *memcpy( void *dest, const void *src, size_t count ); 作用: 在dest处拷贝src处的字节,并以count来计算需要拷贝的字节数量,进行内存的拷贝。 参数: dest:新的存贮区的开始部位src:需要拷贝的开始部位count:需要拷贝的字节数备注:dest,src,它们都是从各自的地址处进行写入,如果是p而不是&p,那么奖会取得p的值(地址),在该值的地址处进行读出或写入。 例: int* intPoint = new int(3333); int* intPoint1; memcpy( &intPoint1, &intPoint, 4 );//在intPoint1的地址处写入intPoint地址处的值,也就是intPoint指针值。 cout << *intPoint1 << endl;//使intPoint1指向了intPoint. 或 int* intPoint = new int(3333); int intPoint1; memcpy( &intPoint1, intPoint, 4 ); cout << intPoint1 << endl; 2)memcpy函数的实现与应用 memcpy函数较memmove相比,存在的不足是没有考虑到目的地址与源地址相重合,本文 对memcpy作了修改,弥补其不足。 memcpy函数的特点是: 1. 使用memcpy函数前,实参dest必须初始化,否则可能会出错,原因见2。 2. 函数原理是将void *src 强制转换为char *s,然后只负责拷贝n个字节到dest里,不

代码编写规范说明书

代码编写规范说明书(c#.net与https://www.360docs.net/doc/de3664943.html,)目录 1 目的 2 范围 3 注释规范 3.1 概述 3.2 自建代码文件注释 3.3 模块(类)注释 3.4 类属性注释 3.5 方法注释 3.6 代码间注释 4 命名总体规则 5 命名规范 5.1 变量(Variable)命名 5.2 常量命名 5.3 类(Class)命名 5.4 接口(Interface)命名 5.5 方法(Method)命名 5.6 名称空间Namespace)命名 6 编码规则 6.1 错误检查规则 6.2 大括号规则 6.3 缩进规则 6.4 小括号规则 6.5 If Then Else规则 6.6 比较规则 6.7 Case规则 6.8 对齐规则 6.9 单语句规则 6.10 单一功能规则 6.11 简单功能规则 6.12 明确条件规则 6.13 选用FALSE规则 6.14 独立赋值规则 6.15 定义常量规则 6.16 模块化规则 6.17 交流规则 7 编程准则 7.1 变量使用 7.2 数据库操作 7.3 对象使用 7.4 模块设计原则 7.5 结构化要求 7.6 函数返回值原则 8 代码包规范 8.1 代码包的版本号

8.2 代码包的标识 9 代码的控制 9.1 代码库/目录的建立 9.2 代码归档 10 输入控制校验规则 10.1 登陆控制 10.2 数据录入控制 附件1:数据类型缩写表 附件2:服务器控件名缩写表 1 目的 一.为了统一公司软件开发设计过程的编程规范 二.使网站开发人员能很方便的理解每个目录,变量,控件,类,方法的意义 三.为了保证编写出的程序都符合相同的规范,保证一致性、统一性而建立的程序编码规范。 四.编码规范和约定必须能明显改善代码可读性,并有助于代码管理、分类范围适用于企业所有基于.NET平台的软件开发工作 2 范围 本规范适用于开发组全体人员,作用于软件项目开发的代码编写阶段和后期维护阶段。 3 注释规范 3.1 概述 a) 注释要求英文及英文的标点符号。 b) 注释中,应标明对象的完整的名称及其用途,但应避免对代码过于详细的描述。 c) 每行注释的最大长度为100个字符。 d) 将注释与注释分隔符用一个空格分开。 e) 不允许给注释加外框。 f) 编码的同时书写注释。 g) 重要变量必须有注释。 h) 变量注释和变量在同一行,所有注释必须对齐,与变量分开至少四个“空格”键。 如:int m_iLevel,m_iCount; // m_iLevel ....tree level // m_iCount ....count of tree items string m_strSql; //SQL i) 典型算法必须有注释。 j) 在循环和逻辑分支地方的上行必须就近书写注释。 k) 程序段或语句的注释在程序段或语句的上一行 l) 在代码交付之前,必须删掉临时的或无关的注释。 m) 为便于阅读代码,每行代码的长度应少于100个字符。 3.2 自建代码文件注释 对于自己创建的代码文件(如函数、脚本),在文件开头,一般编写如下注释: /****************************************************** FileName: Copyright (c) 2004-xxxx *********公司技术开发部 Writer: create Date: Rewriter:

C常用操作函数

C++常用操作函数载入动态库 bool LoadDll() { HttpDownDll = LoadLibrary("HTTPDOWNDLL.dll"); if(HttpDownDll == NULL) { MessageBox(0, "载入动ˉ态库a错洙误ó!", "错洙误ó", MB_OK|MB_ICONWARNING); FreeLibrary(HttpDownDll); return false; } SendCommand = (SendCommandFunc)GetProcAddress(HttpDownDll, "SendCommand"); if(SendCommand == NULL) { MessageBox(0, "GetProcAddress错洙误ó!", "错洙误ó", MB_OK|MB_ICONWARNING); FreeLibrary(HttpDownDll); return false; } return true;

} 卸载动态库 bool FreeDll() { FreeLibrary(HttpDownDll); SendCommand = NULL; return true; } 字符串分割 std::vector split(std::string str,std::string pattern) { std::string::size_type pos; std::vector result; str+=pattern;//扩展1字符串以方便操ù作痢 int size=str.size(); for(int i=0; i

memcpy

memcpy 函数原型 void *memcpy(void *dest, const void *src, size_t n); 功能 从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中 所需头文件 #include 返回值 函数返回dest的值。 说明 1.source和destin所指内存区域不能重叠,函数返回指向destin的指针。 2.strcpy和memcpy主要有以下3方面的区别。 2.1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。 2.2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。 2.3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy 3.如果目标数组destin本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址。 //注意,source和destin都不一定是数组,任意的可读写的空间均可。---wk 编辑本段程序例 example1 作用:将s中的字符串复制到字符数组d中。

// memcpy.c #include #include int main() { char *s="Golden Global View"; char d[20]; clrscr(); memcpy(d,s,(strlen(s)+1)); printf("%s",d); getchar(); return 0; } 输出结果:Golden Global View example2 作用:将s中第14个字符开始的4个连续字符复制到d中。(从0开始) #include int main() { char *s="Golden Global View"; char d[20]; memcpy(d,s+14,4); //从第14个字符(V)开始复制,连续复制4个字符(View) //memcpy(d,s+14*sizeof(char),4*sizeof(char));也可 d[4]='\0'; printf("%s",d); getchar(); return 0; } 输出结果:View example3 作用:复制后覆盖原有部分数据 #include #include int main(void) {

炒股函数公式的写法函数公式汇总与代码的使用方法

炒股函数公式的写法函数公式汇总与代码的使用方法 怎样写函数炒股公式 函数代码的使用说明(凡绿色字体,你都可以用鼠标左键点击进入!)和自己写 T+0 公式之后,有网友说:分析家数据找不到,中国股票软件公式网给的公式不会用。分析家数据给的公式是要导入的。中国股票软件公式网给的公式其实也很简单,只要把其中的一个复制下来,粘贴到行情软件的“指标公式编辑器”里就行了。 “指标公式编辑器”,除了像“决策天机”之类的个别软件,其它通常行情软件都提供了。我们只要在菜单中找到它,就可以自己写公式了。但它们在菜单栏中的位置不同,需要我们一个个菜单栏去找。比如: 通信达的“指标公式编辑器”在菜单的“特色/专家系统/公式管理器”项内 同花顺的“指标公式编辑器”在菜单的“工具”项内

操盘手的“指标公式编辑器”在菜单的“系统功能”项内 分析家的“指标公式编辑器”在菜单的“公式”项内

大智慧的“指标公式编辑器”在菜单的“功能”项内 进入行情软件的“自编公式”项或“公式管理”项后,我们就能看到“指标公式编辑器”了。在“指标公式编辑器”上,我们先要把自己的公式,排在“用户”组中。 右栏有“导入公式”(有的叫“导入”)。导入的就是分析家数据上

的公式。因为各行情软件要求的扩展名文件不同,所以通常“导入公式”、“导出公式”的公式,只能在相应的行情软件上用,不是所有软件都通用的。 而右栏的“新建”项,则可以直接粘贴、修改、编写从公式网下载的公式函数。 下面是通信达软件的“公式管理器”。 操盘手的“公式编辑”和通信达软件的“公式管理器”大同小异

我们只要把下载下来的公式函数,复制、粘贴到“指标公式编辑器”上的最大的那个编辑窗口里后,点击确定就行了。 通信达在编辑窗口下,还有一个动态翻译窗口,公式每一行的内涵,它都能翻译出来。这是我们学习公式函数的利器。

实现Memcpy函数

面试中面试官经常会让写程序,根据题目的难度会在算法和编程习惯上各有侧重。比如写一个memcpy函数,这个题算法简单明确,因此重点考察编程习惯、工程思想。 该题目的算法如下 void memcpy(void *dst, void *src, int count) { while(count--) { *dst = *src; dst++; src++; } } 问题是void*不能直接累加*dst = *src也是不对的。 void memcpy(void *dst, void *src, int count) { unsigned char *pdst = (unsigned char *)dst; unsigned char *psrc = (unsigned char *)src; while(count--) { *pdst = *psrc; pdst++; psrc++; } } 在32位系统中,可复制的最多内存是多少?类型会不会不够用?内存复制不应该修改原始内存吧。 因此,函数声明修改如下void memcpy(void *dst, const void *src, size_t count) 这样就万事大吉了吗?如果传入了空指针呢? 接着修改吧 void memcpy(void *dst, const void *src, size_t count) { assert(dst != NULL); assert(src != NULL); unsigned char *pdst = (unsigned char *)dst; const unsigned char *psrc = (const unsigned char *)src; while(count--) { *pdst = *psrc; pdst++; psrc++; } } 如果有这样的数组char ina[]={0,1,2,3,4,5,6,7,8,9,10,11}; 进行如下调用memcpy(&ina[1], &ina[0], 5);会发生什么情况?由于原始数据和目的数据在空间上存在重叠,这样导致复制过

函数代码的使用说明

函数代码的使用说明 ABS 绝对值 BACKSET 回头设置 BARSCOUNT(CLOSE) 若收盘价则将最近?周期置为1 CAPITAL 当前流通股本(手) CIRCLEDOT 圈点显示 CLOSE 收盘价 DRAWICON 画图标 DRAWTEXT 书写文字 EMA 指数移动平均 FILLRGN 根据条件填充区域 FILTER 过滤(不考虑、忽略) HHV(HIGH,75) 75日内最高价的最高值 IF 如果 IF(X,A,B)若X不为0则返回A,否则返回B INDEXC 收盘价 LLV(LOW,75) 75日内最低价的最低值 MA 简单移动平均 MAX 最[较]大值 PEAKBARS 波峰位置 POINTDOT 小点显示

POLYILINE 画折线 SMA 移动平均 STICKLINE 画柱状线 TROUGHBARS 波谷位置 VOL 成交量(手) WINNER 获利盘 ZIG(1,13) 最高价13%的之字转向 ZIG(2,13) 开盘价13%的之字转向 ZIG(3,13) 收盘价13%的之字转向 VAR7B:=IF(TROUGHBARS(3,16,1)=0 AND HIGH>LOW+0.04,4,0); VAR7B赋值(不显示):如果收盘价16%之字转向的前1个波谷位置=0 AND HIGH>最低价+0.04,返回4,否则返回0 V10:=PEAKBARS(3,15,1)<10; V10赋值:收盘价15%之字转向的前1个波峰位置<10 V7:=BACKSET(V6,3); V7赋值:若V6则将最近3周期置为1

DRAWICON(FILTER((D1 OR D2 OR D3) AND DD<15 AND C>REF(C,1),5),5,1); 当满足条件(D1ORD2ORD3)ANDDD<15ANDC>昨收的5日过滤时,在5位置画1号图标 {显示式":",不显示式":="} 例如: ma1:ma(c,5),colorred; ma2:ma(c,10),colorgreen,POINTDOT; ..... ma1:=ma(c,5); ma2:=ma(c,10); ..... {用'字'显示} 该式开头会以DRAW..TEXT开头, DRAWTEXT DRAWTEXTEX DRAWYITEXT DRAWFLAGTEXT DRAWMOVETEXT 例如: {卖} ma1:=ma(c,5);

常见系统函数

1.//*********************************************************************** char* reverse(char* Array) { int len = strlen(Array); for(int i=0;i

相关文档
最新文档