当前位置:文档之家› uCOS-II实时操作系统内核源代码注释

uCOS-II实时操作系统内核源代码注释

uCOS-II实时操作系统内核源代码注释
uCOS-II实时操作系统内核源代码注释

/*

*********************************************************************

************************************

* uC/OS-II

* 实时操作内核

* 内存管理

*

* (c) 版权 1992-2002, Jean J. Labrosse, Weston, FL

* All Rights Reserved

*

* 文件名 : OS_MEM.C

* 作者 : Jean J. Labrosse

* 注释 : 彭森 2007/9/2

*********************************************************************

************************************

*/

#ifndef OS_MASTER_FILE

#include "includes.h"

#endif

#if (OS_MEM_EN > 0) && (OS_MAX_MEM_PART > 0)

/*

*********************************************************************

************************************

* 创建一个内存分区

*

* 说明 : 创建一个固定大小的内存分区,这个内存分区通过uC/OS-II

管理。

*

* 参数 : addr 内存分区的起始地址

*

* nblks 来自分区的内存块的数目.

*

* blksize 每个内存分区中的内存块的大小.

*

* err 指向一个变量包含错误的信息,这个信息通过这个

函数或其他来设置:

*

* OS_NO_ERR 内存分区创建正确返回值. * OS_MEM_INVALID_ADDR 指定的是无效地址作为分

区的内存存储空间

* OS_MEM_INVALID_PART 没有未使用的有用的分区

* OS_MEM_INVALID_BLKS 使用者指定一个无效的内

存块(必须 >= 2)

* OS_MEM_INVALID_SIZE 使用者指定一个无效的内

存空间值

* (必须大于指针的空间大小) * 返回值 : != (OS_MEM *)0 分区被创建

* == (OS_MEM *)0 分区没有被创建由于无效的参数,没有未使

用的分区可用

*********************************************************************

************************************

*/

OS_MEM *OSMemCreate (void *addr, INT32U nblks, INT32U blksize, INT8U *err)

{

#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register 为CPU状态寄存器分配存储空间 */

OS_CPU_SR cpu_sr;

#endif

OS_MEM *pmem;

INT8U *pblk;

void **plink;

INT32U i;

#if OS_ARG_CHK_EN > 0

if (addr == (void *)0) { /* Must pass a valid address for the memory part. 必须是一个有效的内存部分*/

*err = OS_MEM_INVALID_ADDR;

return ((OS_MEM *)0);

}

if (nblks < 2) { /* Must have at least 2 blocks per partition 每个分区至少有两个分区*/

*err = OS_MEM_INVALID_BLKS;

return ((OS_MEM *)0);

}

if (blksize < sizeof(void *)) { /* Must contain space for at least a pointer 必须包含空间至少有一个指针*/

*err = OS_MEM_INVALID_SIZE;

return ((OS_MEM *)0);

}

#endif

OS_ENTER_CRITICAL();

pmem = OSMemFreeList; /* Get next free memory partition 得到下一个未使用的内存分区*/

if (OSMemFreeList != (OS_MEM *)0) { /* See if pool of

free partitions was empty 查看是否有未使用的分区空间是空的*/

OSMemFreeList = (OS_MEM *)OSMemFreeList->OSMemFreeList;

}

OS_EXIT_CRITICAL();

if (pmem == (OS_MEM *)0) { /* See if we have a memory partition 查看是否我们有一个内存分区*/

*err = OS_MEM_INVALID_PART;

return ((OS_MEM *)0);

}

plink = (void **)addr; /* Create linked list of free memory blocks 创建未使用的内存块的可连接的列表*/

pblk = (INT8U *)addr + blksize;

for (i = 0; i < (nblks - 1); i++) {

*plink = (void *)pblk;

plink = (void **)pblk;

pblk = pblk + blksize;

}

*plink = (void *)0; /* Last memory block points to NULL 最后的内存块指针指向NULL*/

pmem->OSMemAddr = addr; /* Store start address of memory partition 保存内存分区的起始地址*/

pmem->OSMemFreeList = addr; /* Initialize pointer to pool of free blocks 为未使用的内存块初始化指针*/

pmem->OSMemNFree = nblks; /* Store number of free blocks in MCB 在内存控制块中保存许多未使用的内存块*/

pmem->OSMemNBlks = nblks;

pmem->OSMemBlkSize = blksize; /* Store block size of each memory blocks 保存每个内存块的块大小*/

*err = OS_NO_ERR;

return (pmem);

}

/*$PAGE*/

/*

********************************************************************* ************************************

* 得到一个内存控制块

*

* 说明 : 从分区中得到一个内存块

*

* 参数 : pmem 指针指向一个内存分区控制块

*

* err 指向一个变量包含一个错误信息,这个错误信息通过这个函数或其他来设计

*

* OS_NO_ERR 假如内存分区被正确的创建. * OS_MEM_NO_FREE_BLKS 假如没有更多的内存块被分

配给调用者

* OS_MEM_INVALID_PMEM 假如已经为'pmem'通过一个

空指针

*

* 返回值 : 一个指针指向一个内存控制块,假如没有察觉错误

* 一个指针指向空指针,假如有错误被察觉到

********************************************************************* ************************************

*/

void *OSMemGet (OS_MEM *pmem, INT8U *err)

{

#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register 为CPU状态寄存器分配存储空间 */

OS_CPU_SR cpu_sr;

#endif

void *pblk;

#if OS_ARG_CHK_EN > 0

if (pmem == (OS_MEM *)0) { /* Must point to a valid memory partition 必须指向一个有效的内存分区 */

*err = OS_MEM_INVALID_PMEM;

return ((OS_MEM *)0);

}

#endif

OS_ENTER_CRITICAL();

if (pmem->OSMemNFree > 0) { /* See if there are any free memory blocks 查看是否有其他未使用的内存块*/

pblk = pmem->OSMemFreeList; /* Yes, point to next free memory block 是的,指针指向下一个未使用的内存块*/ pmem->OSMemFreeList = *(void **)pblk; /* Adjust pointer to new free list 调整指针指向一个新的未使用的空间列表*/

pmem->OSMemNFree--; /* One

less memory block in this partition 在这个分区中减少一个内存块*/

OS_EXIT_CRITICAL();

*err = OS_NO_ERR; /* No

error 没有错误*/

return (pblk); /* Return memory block to caller 返回内存控制块给调用者*/

}

OS_EXIT_CRITICAL();

*err = OS_MEM_NO_FREE_BLKS; /* No, Notify caller of empty memory partition 告知调用者是空的内存分区*/

return ((void *)0); /* Return NULL pointer to caller 返回NULL个调用者*/

}

/*$PAGE*/

/*

********************************************************************* ************************************

* 释放一个内存块

*

* 说明 : 返回一个内存块给分区

*

* 参数 : pmem 指针指向内存分区控制块

*

* pblk 指针指向被保留的内存块.

*

* 返回值 : OS_NO_ERR 假如内存块是被插入的分区

* OS_MEM_FULL 假如返回一个已经全部内存分区的内存块

* (你释放了更多你分配的内存块!)

* OS_MEM_INVALID_PMEM 假如指针'pmem'指向NULL。

* OS_MEM_INVALID_PBLK 假如指向释放的内存块为空.

********************************************************************* ************************************

*/

INT8U OSMemPut (OS_MEM *pmem, void *pblk)

{

#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register 为CPU状态寄存器分配存储空间 */

OS_CPU_SR cpu_sr;

#endif

#if OS_ARG_CHK_EN > 0

if (pmem == (OS_MEM *)0) { /* Must point to a valid memory partition 必须指向一个有效的内存分区 */

return (OS_MEM_INVALID_PMEM);

}

if (pblk == (void *)0) { /* Must release a valid block 必须保留一个有效的内存块 */

return (OS_MEM_INVALID_PBLK);

}

#endif

OS_ENTER_CRITICAL();

if (pmem->OSMemNFree >= pmem->OSMemNBlks) { /* Make sure all blocks not already returned 确认所有的内存块没有已经返回 */

OS_EXIT_CRITICAL();

return (OS_MEM_FULL);

}

*(void **)pblk = pmem->OSMemFreeList; /* Insert released block into free block list 将释放的内存块插入未使用的内存块表 */ pmem->OSMemFreeList = pblk;

pmem->OSMemNFree++; /* One more memory block in this partition 在分区中增加一个内存块 */

OS_EXIT_CRITICAL();

return (OS_NO_ERR); /* Notify caller that memory block was released 告知调用者内存块被释放 */

}

/*$PAGE*/

/*

********************************************************************* ************************************

* 查询内存分区

*

* 说明 : 这个函数被使用来查询在内存分区中已经使用的内存块数及尚未使用的内存数

*

*

* 参数 : pmem 指针指向一个内存分区控制块

*

* pdata 指针指向一个结构体,该结构体包含关于内存分区的信息*

* 返回值 : OS_NO_ERR 假如没有错误发生.

* OS_MEM_INVALID_PMEM 假如指针'pmem'指向NULL。

* OS_MEM_INVALID_PDATA 假如指向释放的内存块为空.

********************************************************************* ************************************

*/

#if OS_MEM_QUERY_EN > 0

INT8U OSMemQuery (OS_MEM *pmem, OS_MEM_DATA *pdata)

{

#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register 为CPU状态寄存器分配存储空间 */

OS_CPU_SR cpu_sr;

#endif

#if OS_ARG_CHK_EN > 0

if (pmem == (OS_MEM *)0) { /* Must point to a valid memory partition 必须指向一个有效的内存分区 */

return (OS_MEM_INVALID_PMEM);

}

if (pdata == (OS_MEM_DATA *)0) { /* Must release a valid storage area for the data 为这些数据必须释放一个有效的存储区域 */ return (OS_MEM_INVALID_PDATA);

}

#endif

OS_ENTER_CRITICAL();

pdata->OSAddr = pmem->OSMemAddr;

pdata->OSFreeList = pmem->OSMemFreeList;

pdata->OSBlkSize = pmem->OSMemBlkSize;

pdata->OSNBlks = pmem->OSMemNBlks;

pdata->OSNFree = pmem->OSMemNFree;

OS_EXIT_CRITICAL();

pdata->OSNUsed = pdata->OSNBlks - pdata->OSNFree;

return (OS_NO_ERR);

}

#endif /*

OS_MEM_QUERY_EN */

/*$PAGE*/

/*

********************************************************************* ************************************

* 内存分区管理初始化

*

* 说明 : 这个函数是uC/OS-II的内部函数,你的函数务必不要调用它. *

* 参数 : 无

*

* 返回值 : 无

*

* 备注 : 这个函数是uC/OS-II的内部函数,你的函数务必不要调用它.

********************************************************************* ************************************

*/

void OS_MemInit (void)

{

#if OS_MAX_MEM_PART == 1

OSMemFreeList = (OS_MEM *)&OSMemTbl[0]; /* Point to beginning of free list 指向释放列表的起始地址 */

OSMemFreeList->OSMemFreeList = (void *)0; /*

Initialize last node 初始化最后的节点*/

OSMemFreeList->OSMemAddr = (void *)0; /* Store start address of memory partition 保存内存分区的起始地址*/

OSMemFreeList->OSMemNFree = 0; /* No free blocks 没有释放的内存块*/

OSMemFreeList->OSMemNBlks = 0; /* No blocks 没有内存块*/

OSMemFreeList->OSMemBlkSize = 0; /* Zero size 空间大小为0*/

#endif

#if OS_MAX_MEM_PART >= 2

OS_MEM *pmem;

INT16U i;

pmem = (OS_MEM *)&OSMemTbl[0]; /* Point to memory control block (MCB) 指向内存控制块*/

for (i = 0; i < (OS_MAX_MEM_PART - 1); i++) { /* Init. list of free memory partitions 初始化.释放内存分区的列表*/

pmem->OSMemFreeList = (void *)&OSMemTbl[i+1]; /* Chain list of free partitions 释放分区的链表*/

pmem->OSMemAddr = (void *)0; /* Store start address of memory partition 保存内存分区的起始地址*/

pmem->OSMemNFree = 0; /* No free blocks 没有可释放的内存块*/

pmem->OSMemNBlks = 0; /* No

blocks 没有内存块*/

pmem->OSMemBlkSize = 0; /* Zero

size 空间大小为0*/

pmem++;

}

pmem->OSMemFreeList = (void *)0; /* Initialize last node 初始化最后的结点*/

pmem->OSMemAddr = (void *)0; /* Store start

address of memory partition 保存内存分区的起始地址*/

pmem->OSMemNFree = 0; /* No free blocks 没有可释放的内存块*/

pmem->OSMemNBlks = 0; /* No

blocks 没有内存块*/

pmem->OSMemBlkSize = 0; /* Zero

size 空间大小为0*/

OSMemFreeList = (OS_MEM *)&OSMemTbl[0]; /* Point to beginning of free list 指向释放列表的起始地址*/

#endif

}

#endif /*

OS_MEM_EN */

/*

*********************************************************************

************************************

* uC/OS-II

* 实时操作系统内核

* 时钟管理

*

* (c) 版权 1992-2002, Jean J. Labrosse, Weston, FL

* 保留所有权利

*

* 文件名 : OS_TIME.C

* 作者 : Jean J. Labrosse

* 注释:彭森 2007/9/2

*********************************************************************

************************************

*/

#ifndef OS_MASTER_FILE

#include "includes.h"

#endif

/*

*********************************************************************

************************************

* 延时n个时间片 (n从0到65535)

*

* 说明 : 这个函数被用来执行当前运行任务的延时调用,直到指定的系统时间片的计数期满。当然这个直接地等于

* 当前任务作为一段时间的延时假如被指定为0将会没有延时。假如指定的延时值大于0,将导致一个上下文交换。

*

* 参数 : ticks 指定任务被暂停的延长时间的时钟片的数目.

* 假如被指定为0,任务将不会延时

*

* 返回值 : 无

********************************************************************* ************************************

*/

void OSTimeDly (INT16U ticks)

{

#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register 分配存储空间作为CPU的状态寄存器 */

OS_CPU_SR cpu_sr;

#endif

if (ticks > 0)

{ /* 0 means no delay! 0意味着没有等待 */

OS_ENTER_CRITICAL();

if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0) { /* Delay current task 延时当前任务 */

OSRdyGrp &= ~OSTCBCur->OSTCBBitY;

}

OSTCBCur->OSTCBDly =

ticks; /* Load ticks in TCB 将时间装载到任务控制块 */

OS_EXIT_CRITICAL();

OS_Sched(); /* Find next task to run! 寻找下一个任务运行 */

}

}

/*$PAGE*/

/*

********************************************************************* ************************************

* 可详细的指定时间的延时任务

*

* 说明 : 这个函数被用来执行当前运行任务的延时调用,直到指定的系统时间片的计数期满。

* 这个函数允许你指定延时是ian用时、分、秒、毫秒来代替时

间片延时

*

* 参数 : hours 指定任务被延时的小时数 (最大值. is 255)

* minutes 指定被延时的分钟数 (最大值. 59)

* seconds 指定被延时的秒数 (最大值. 59)

* milli 指定被延时的毫秒数 (最大值. 999)

*

* 返回值 : OS_NO_ERR

* OS_TIME_INVALID_MINUTES

* OS_TIME_INVALID_SECONDS

* OS_TIME_INVALID_MS

* OS_TIME_ZERO_DLY

*

* 备注(s) : 这个解决方案在毫秒上依靠时间片周期. 比如:你不能延时10mS假如时间片中断是每隔100mS的话。

* 假如那样的话,延时将会被置为0。实际的延时将接近最近的时间片

********************************************************************* ************************************

*/

#if OS_TIME_DLY_HMSM_EN > 0

INT8U OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U milli)

{

INT32U ticks;

INT16U loops;

if (hours > 0 || minutes > 0 || seconds > 0 || milli > 0) {

if (minutes > 59) {

return (OS_TIME_INVALID_MINUTES); /* Validate arguments to be within range 使参数在在内部定义的范围内有效 */

}

if (seconds > 59) {

return (OS_TIME_INVALID_SECONDS);

}

if (milli > 999) {

return (OS_TIME_INVALID_MILLI);

}

/* Compute the total number of clock ticks required.. 计数必要的时钟片的总数......*/

/* .. (rounded to the nearest tick) 循环最近的时间片 */

ticks = ((INT32U)hours * 3600L + (INT32U)minutes * 60L + (INT32U)seconds) * OS_TICKS_PER_SEC

+ OS_TICKS_PER_SEC * ((INT32U)milli + 500L /

OS_TICKS_PER_SEC) / 1000L;

loops = (INT16U)(ticks / 65536L); /* Compute the integral number of 65536 tick delays 计数整数制的时间片延时 */

ticks = ticks % 65536L; /* Obtain the fractional number of ticks 获得部分的时间片 */

OSTimeDly((INT16U)ticks);

while (loops > 0) {

OSTimeDly(32768);

OSTimeDly(32768);

loops--;

}

return (OS_NO_ERR);

}

return (OS_TIME_ZERO_DLY);

}

#endif

/*$PAGE*/

/*

********************************************************************* ************************************

* 恢复一个已经延时的任务

*

* 说明 : 这个函数被用来恢复一个任务,这个任务是已经通过OSTimeDly()或者OSTimeDlyHMSM()在延时。

* 注意你不能调用这个函数去恢复是由于事件暂停的任务。这种情况将使任务看起来像暂停延时的发生

* (而不是你所期待的效果)。同时,你也不能恢复这样一个任务,这个任务是调用时钟片计数超过65535的组合时钟

* OSTimeDlyHMSM()函数。换句话说。假如时钟片运行在100 Hz,你将不能恢复一个已经运行的任务通过调用函数

* OSTimeDlyHMSM(0,10,55,350)或者更高

*

* (10 Minutes * 60 + 55 Seconds + 0.35) * 100 ticks/second. *

* 参数 : prio 指定需要恢复的任务的优先级

*

* 返回值 : OS_NO_ERR 任务已经被恢复

* OS_PRIO_INVALID 假如你指定的优先级比允许指定的最大值高

* (例如: >= OS_LOWEST_PRIO)

* OS_TIME_NOT_DLY 任务没有等待时钟期满

* OS_TASK_NOT_EXIST 要求的任务没有被创建

********************************************************************* ************************************

*/

#if OS_TIME_DLY_RESUME_EN > 0

INT8U OSTimeDlyResume (INT8U prio)

{

#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register 分配存储空间作为CPU状态寄存器 */

OS_CPU_SR cpu_sr;

#endif

OS_TCB *ptcb;

if (prio >= OS_LOWEST_PRIO) {

return (OS_PRIO_INVALID);

}

OS_ENTER_CRITICAL();

ptcb = (OS_TCB *)OSTCBPrioTbl[prio]; /* Make sure that task exist 确认任务存在 */

if (ptcb != (OS_TCB *)0) {

if (ptcb->OSTCBDly != 0) { /* See if task is delayed 查看任务是否被延时 */

ptcb->OSTCBDly = 0; /* Clear the time delay 清楚时钟的延时 */

if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) { /* See if task is ready to run 查看任务是否已经准备运行*/

OSRdyGrp |=

ptcb->OSTCBBitY; /* Make task ready to run 使任务准备运行 */

OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;

OS_EXIT_CRITICAL();

OS_Sched(); /* See if this is new highest priority 查看这个是否是最高的优先级 */

} else {

OS_EXIT_CRITICAL(); /* Task may be suspended 任务可能被挂起 */

}

return (OS_NO_ERR);

} else {

OS_EXIT_CRITICAL();

return (OS_TIME_NOT_DLY); /* Indicate that task was not delayed 指示任务没有被延时 */

}

}

OS_EXIT_CRITICAL();

return (OS_TASK_NOT_EXIST); /* The task does not exist 指示任务不存在 */

}

#endif

/*$PAGE*/

/*

********************************************************************* ************************************

* 得到当前的系统时间

*

* 说明 : 这个函数用来得到32位的记录时钟片数的当前值

*

* 参数 : 无

*

* 返回值 : 返回 OSTime 的当前值

********************************************************************* ************************************

*/

#if OS_TIME_GET_SET_EN > 0

INT32U OSTimeGet (void)

{

#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register 分配存储空间作为CPU状态寄存器 */

OS_CPU_SR cpu_sr;

#endif

INT32U ticks;

OS_ENTER_CRITICAL();

ticks = OSTime;

OS_EXIT_CRITICAL();

return (ticks);

}

#endif

/*

********************************************************************* ************************************

* 设定系统始终

*

* 说明 : 这个函数设定32位计数器用来跟踪时钟片计数。

*

* 参数 : ticks 指定新值给OSTime.

*

* 返回值 : 无

********************************************************************* ************************************

*/

#if OS_TIME_GET_SET_EN > 0

void OSTimeSet (INT32U ticks)

{

#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register 分配存储空间作为CPU状态寄存器 */

OS_CPU_SR cpu_sr;

#endif

OS_ENTER_CRITICAL();

OSTime = ticks;

OS_EXIT_CRITICAL();

}

#endif

返回主页

操作系统源代码

#include<stdio、h> #include<time、h〉 #include

?printf(”\nCan't open%s in mode %s、",); ?errorMessage(); } } void makeFreeNode(structfreeList **empty,int startAddress,in tsize) /*根据参数startAddress、size创建空闲节点,由empty指针返回*/ { ?if((*empty= malloc(sizeof(struct freeList)))== NULL) ?{ ?printf("\nNot enough toallocatefor the freenode 、”); ??errorMessage(); } ?(*empty)—>startAddress =startAddress; ?(*empty)-〉size= size; (*empty)-〉next = NULL; } void iniMemory(void) /*初始化存储空间起始地址、大小*/ { ?char MSA[10],MS[10]; ?printf(”\nPlease input the start address ofthe memory!");?scanf(”%s”,MSA); ?memoryStartAddress= atoi(MSA); ?printf(”\nPleaseinputthesize ofthe memory !”); scanf(”%s",MS); memorySize= atoi(MS); } char selectFitMethod(void) /*选择适应算法*/ { ?FILE*fp; char fitMethod; ?do{ ?printf(”\n\nPlease input a char as fallow toselect the fit method!\ ???\n 1(Best fit)\ ?\n 2 (Worst fit) \ ?\n 3 (First fit) \ ?\n 4 (Last fit)\n");

C语言注释规范

C语言注释规范 1.注释原则 同一软件项目开发中,尽量保持代码注释规范和统一。 注释方便了代码的阅读和维护。 边写代码边注释,修改代码时要相应修改注释,保证注释和代码的一致性。 注释要简洁明确,不要出现形容词。 对于写的好的注释,我们将是第一个受益者。 大型软件开发中,通过别人的注释可以快速知道他人所写函数的功能,返回值,参数的使用。 2.文件头部的注释 示例: / * Program Assignment : 该文件的作用 * Author: 作者 * Date: 2013/8/6 14:34 * Description: 该文件的描述 *****/ /* * Source code in : 源代码的路径 * Function List: * initLinear 初始化线性表 * destoryLinear 释放线性表申请的空间 * isLinearEmpty 判断线性表是否为空 * isLinearFull 判断线性表是否为满 * getLinearElementValue 取得下标为index的元素的值 */ 注意:这个函数列表可以快速查询到我们想要了解的函数。 3.结构体,全局变量等的注释 示例: typedef POLYNOMIAL USER_TYPE; /* 新的数据类型的描述*/ int a; /* 全局变量的作用*/ /* 说明结构体的功能*/ typedef struct LINEAR { USER_TYPE *data; /* 每个成员的意义(作用) */ int maxRoom; /* 每个成员的意义(作用) */

int elementCount; /* 每个成员的意义(作用) */ }LINEAR; 4.函数的注释 在逻辑性较强的的地方加入注释,以便其他人的理解,在一定的程度上排除bug。 示例: /* * Function Name: getLinearElementIndex * Purpose: 取得元素的index值 * Params : * @LINEAR linear 线性表实例 * @USER_TYPE var 类型为USER_TYPE的实例 * @int (*)() cmp 提供接口,让用户定义具体比较函数 * Return: int 返回元素的index值 * Limitation: 如果返回-1,则代表不存在var的元素 */ int getLinearElementIndex(LINEAR linear, USER_TYPE var, int (*cmp)()) { /* * 如果逻辑太过复杂,这里写明该算法的过程和思路。 */ boolean found = FALSE; int i; for(i = 0; i < && !found; i++) if(cmp[i], var) == 0) found = TRUE; if(i >= i = NOT_FOUND; return i; }

UMAT全过程

UMAT全过程——技术篇 1.ABAQUS中非线性问题的处理2.用户子程序接口3.用户子程序和主程序的结合4.用户材料子程序UMAT接口的原理5.UMAT子程序流程ABAQUS是怎么计算的 I.ABAQUS一共有42个用户子程序接口,15个应用程序接口,可以定义包括边界条 件,荷载条件,接触条件,材料特性以及利用用户子程序和其它应用软件进行数值交换。 1.根据ABAQUS提供的相应接口,按照FORTRAN语法自己编写的代码,是一个独立的程序单元,可以独立地被储存和编译,也能被其他程序单元引用。 I.一般结构形式 II. 一个算例中,可以用到多个用户子程序,但必须把它们放在一个以.for为扩展名的文件中。 III.运行带有用户子程序的算例的两种方法 1.在CAE中运行,在EDIT JOB菜单中的GENRAL子菜单的USERSUBROUTINE GILE对话框中选择用户子程序所在的文件 2.在https://www.doczj.com/doc/d414457617.html,MAND中运行语法如下 IV.编制用户子程序时应注意: 1.用户子程序相互之间不能调用,可以调用用户自己编写的Fortran子程序和 ABAQUS应用程序,ABAQUS应用程序必须由用户子程序调用。编写Fortran子程序时,建议子程序以K开头,以免和ABAQUS内部程序冲突。2.用户在用户子程序中利用OPEN打开外部文件时,要注意以下两点: (1)设备号的选择有限制,只能取15~18和大于100的设备号 (2)用户需提供外部文件的绝对路径而不是相对路径。3.对于不同的用户子程序,ABAQUS调用的时间不相同,有的在每个STEP的开始,有的在结尾,有的在每个 INCREMENT的开始。(当ABAQUS在调用用户子程序时,都会把当前的STEP 和INCREMENT 利用用户子程序的两个实参KSTEP 和KINC 传给用户子程序,用户可把他们输出到外部文件中,这样可清楚知道何时调用) V.ABAQUS提供给用户定义自己的材料属性的Fortran程序接口,用户材料子程序 UMAT 通过与ABAQUS主求解程序的接口实现与ABAQUS的资料交流,输入文件中,使用“UESER MATERIAL”表示定义用户材料属性。 I.UMAT子程序采用Fortran语言编制,包括以下几个部分:子程序定义语句、 ABAQUS 定义的参数说明、用户定义的局部变量说明、用户编制的程序主体、子程序返回和结束语句。I.

系统后台操作手册

手册目录 1、登录后台管理系统..................................... 错误!未定义书签。 登录后台............................................. 错误!未定义书签。 后台管理界面介绍..................................... 错误!未定义书签。 2、修改网站基本信息..................................... 错误!未定义书签。 修改管理员密码....................................... 错误!未定义书签。 更新缓存............................................. 错误!未定义书签。 网站名称,BANNER 修改。............................... 错误!未定义书签。 3、栏目管理............................................. 错误!未定义书签。 添加栏目............................................. 错误!未定义书签。 修改栏目............................................. 错误!未定义书签。 添加子栏目........................................... 错误!未定义书签。 删除栏目............................................. 错误!未定义书签。 4、文章管理............................................. 错误!未定义书签。 添加文章................................................. 错误!未定义书签。 文章管理(删除,修改)................................... 错误!未定义书签。 文章回收站管理........................................... 错误!未定义书签。 5、留言本管理........................................... 错误!未定义书签。 6、其他管理(友情链接,调查等)......................... 错误!未定义书签。 友情连接管理............................................. 错误!未定义书签。 添加友情链接......................................... 错误!未定义书签。 修改友情链接信息..................................... 错误!未定义书签。

程序代码注释编写规范

程序代码注释编写规范 为提高控制程序的阅读性与可理解性,现制定相关代码程序代码注释编写的编写规范。 一般情况下,源程序有效注释量必须在20%以上,注释的原则是有助于对程序的阅读理解,在该加的地方都加了,注释不宜太多也不能太少,注释语言必须准确、易懂、简洁。 常规注释有以下两种方式。 单行:以"//"符号开始,任何位于该符号之后的本行文字都视为注释。 多行:以"/*"符号开始,以"*/"结束。任何介于这对符号之间的文字都视为注释。 一、说明性文件 说明性文件(如头文件.h文件、.inc文件、.def文件、编译说明文件.cfg等)头部应进行注释,注释必须列出:版权说明、版本号、生成日期、作者、内容、功能、与其它文件的关系、修改日志等,头文件的注释中还应有函数功能简要说明。 示例:下面这段头文件的头注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。 /************************************************* COPYRIGHT (C), MicTiVo International. Co., Ltd. File NAME: // 文件 Author: Version: Date: // 作者、版本及完成日期 DESCRIPTION: // 用于详细说明此程序文件完成的主要功能,与其他模块 // 或函数的接口,输出值、取值范围、含义及参数间的控 // 制、顺序、独立或依赖等关系 Others: // 其它内容的说明 Function List: // 主要函数列表,每条记录应包括函数名及功能简要说明 1.... History: // 修改历史记录列表,每条修改记录应包括修改日期、修改 // 者及修改内容简述 1. Date: Author: Modification: 2. .. *************************************************/ 二、源文件头 源文件头部应进行注释,列出:版权说明、版本号、生成日期、作者、模块目的/功能、主要函数及其功能、修改日志等。 示例:下面这段源文件的头注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。 /************************************************************ COPYRIGHT (C), MicTiVo International. Co., Ltd. FileName: Author:

ABAQUS子程序UMAT里弹塑本构的实现

前言 有限元法是工程中广泛使用的一种数值计算方法。它是力学、计算方法和计算机技术相结合的产物。在工程应用中,有限元法比其它数值分析方法更流行的一个重要原因在于:相对与其它数值分析方法,有限元法对边界的模拟更灵活,近似程度更高。所以,伴随着有限元理论以及计算机技术的发展,大有限元软件的应用证变得越来越普及。 ABAQUS软件一直以非线性有限元分析软件而闻名,这也是它和ANSYS,Nastran等软件的区别所在。非线性有限元分析的用处越来越大,因为在所用材料非常复杂很多情况下,用线性分析来近似已不再有效。比方说,一个复合材料就不能用传统的线性分析软件包进行分析。任何与时间有关联,有较大位移量的情况都不能用线性分析法来处理。多年前,虽然非线性分析能更适合、更准确的处理问题,但是由于当时计算设备的能力不够强大、非线性分析软件包线性分析功能不够健全,所以通常采用线性处理的方法。 这种情况已经得到了极大的改善,计算设备的能力变得更加强大、类似ABAQUS这样的产品功能日臻完善,应用日益广泛。 非线性有限元分析在各个制造行业得到了广泛应用,有不少大型用户。航空航天业一直是非线性有限元分析的大客户,一个重要原因是大量使用复合材料。新一代波音 787客机将全部采用复合材料。只有像 ABAQUS这样的软件,才能分析包括多个子系统的产品耐久性能。在汽车业,用线性有限元分析来做四轮耐久性分析不可能得到足够准确的结果。分析汽车的整体和各个子系统的性能要求(如悬挂系统等)需要进行非线性分析。在土木工程业, ABAQUS能处理包括混凝土静动力开裂分析以及沥青混凝土方面的静动力分析,还能处理高度复杂非线性材料的损伤和断裂问题,这对于大型桥梁结构,高层建筑的结构分析非常有效。 瞬态、大变形、高级材料的碰撞问题必须用非线性有限元分析来计算。线性分析在这种情况下是不适用的。以往有一些专门的软件来分析碰撞问题,但现在ABAQUS在通用有限元软件包就能解决这些问题。所以,ABAQUS可以在一个软件完成线性和非线性分析。 ABAQUS给用户提供了强大二次开发接口,尤其是在材料本构方面,给用户开发符合实际工程的材料本构模型提供了强大帮助,本文将针对其用户材料子程序展开研究,总结常用材料模型的开发方法。

商业管理系统源码操作手册

本源码下载地址:https://www.doczj.com/doc/d414457617.html,/ 目录┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄1 一、系统硬件安装┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄3 A、网络布线┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄3 1、设计布线方案┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄3 2、选择网络材料┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄3 3、抗干扰措施┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄3 4、施工要求┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄4 5、布线完成┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄5 B、设备安装┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄5 1、前台收款机基本安装(****收款机)┄┄┄┄┄┄┄┄┄┄┄┄┄5 2、系统设置┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄5 3、系统自检┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄5 4、注意事项┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄6 二、软件安装┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄7 A、系统软件安装┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄7 1、在服务器上安装 NT ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄7 2、在服务器上安装 NTPACK ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄7 3、在服务器上安装 SQL SERVER┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄7 4、在服务器上安装调制解调器┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄7 B、用户软件安装┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄9 后台商业管理系统┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄9 1)后台进销存系统安装┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄9 2)DELPHI 系统 BDE 安装┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄9 3)BDE 配置┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄9 4)安装过程可能存在问题┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄9 5)新用户使用本系统的基本流程(后台)┄┄┄┄┄┄┄┄┄┄┄10前台销售系统┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄12 1) 前台软件的配置文件┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄12

程序代码注释编写规范

百度文库- 让每个人平等地提升自我 1 程序代码注释编写规范 为提高控制程序的阅读性与可理解性,现制定相关代码程序代码注释编写的编写规范。 一般情况下,源程序有效注释量必须在20%以上,注释的原则是有助于对程序的阅读理解,在该加的地方都加了,注释不宜太多也不能太少,注释语言必须准确、易懂、简洁。 常规注释有以下两种方式。 单行:以"文件、.inc文件、.def文件、编译说明文件.cfg等)头部应进行注释,注释必须列出:版权说明、版本号、生成日期、作者、内容、功能、与其它文件的关系、修改日志等,头文件的注释中还应有函数功能简要说明。 示例:下面这段头文件的头注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。 /************************************************* (C), MicTiVo International. Co., Ltd. 1.File : . History: Date: Author: Modification: 2. .. *************************************************/ 一、源文件头 源文件头部应进行注释,列出:版权说明、版本号、生成日期、作者、模块目的/功能、主要函数及其功能、修改日志等。 示例:下面这段源文件的头注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。 /************************************************************ (C), MicTiVo International. Co., Ltd. FileName: Author: Version : Date: : / /*receive _process() */ 意:与溢出中断写初值不同}

abaqus简单umat子程序

SUBROUTINE UMAT(STRESS,STATEV,DDSDDE,SSE,SPD,SCD,RPL,DDSDDT, 1 DRPLDE,DRPLDT,STRAN,DSTRAN,TIME,DTIME,TEMP,DTEMP,PREDEF,DPRED, 2 CMNAME,NDI,NSHR,NTENS,NSTATV,PROPS,NPROPS,COORDS,DROT, 3 PNEWDT,CELENT,DFGRD0,DFGRD1,NOEL,NPT,LAYER,KSPT,KSTEP,KINC) include 'aba_param.inc' CHARACTER*8 CMNAME DIMENSION STRESS(NTENS),STATEV(NSTATV),DDSDDE(NTENS,NTENS), 1 DDSDDT(NTENS),DRPLDE(NTENS),STRAN(NTENS),DSTRAN(NTENS), 2 TIME(2),PREDEF(1),DPRED(1),PROPS(NPROPS),COORDS(3),DROT(3,3), 3 DFGRD0(3,3),DFGRD1(3,3) C UMAT FOR ISOTROPIC ELASTICITY C CANNOT BE USE D FOR PLAN E STRESS C ---------------------------------------------------------------- C PROPS(1) - E C PROPS(2) - NU C ---------------------------------------------------------------- C IF (NDI.NE.3) THEN WRITE (*,*) 'THIS UMAT MAY ONLY BE USED FOR ELEMENTS 1 WITH THREE DIRECT STRESS COMPONENTS' CALL XIT ENDIF open(400,file='D:\test.txt') C ELASTIC PROPERTIES EMOD=PROPS(1) ENU=PROPS(2) EBULK3=EMOD/(1-2*ENU) EG2=EMOD/(1+ENU) EG=EG2/2 EG3=3*EG ELAM=(EBULK3-EG2)/3 write(400,*) 'temp=',temp C ELASTIC STIFFNESS C DO K1=1, NDI DO K2=1, NDI DDSDDE(K2, K1)=ELAM END DO DDSDDE(K1, K1)=EG2+ELAM

程序代码注释编写规范

程序代码注释编写规范 XXX份公司

为提高控制程序的阅读性与可理解性,现制定相关代码程序代码注释编写的编写规范。 一般情况下,源程序有效注释量必须在20%以上,注释的原则是有助于对程序的阅读理解,在该加的地方都加了,注释不宜太多也不能太少,注释语言必须准确、易懂、简洁。 常规注释有以下两种方式。 单行:以"//"符号开始,任何位于该符号之后的本行文字都视为注释。 多行:以"/*"符号开始,以"*/"结束。任何介于这对符号之间的文字都视为注释。 一、说明性文件 说明性文件(如头文件.h文件、.inc文件、.def文件、编译说明文件.cfg等)头部应进行注释,注释必须列出:版权说明、版本号、生成日期、作者、内容、功能、与其它文件的关系、修改日志等,头文件的注释中还应有函数功能简要说明。 示例:下面这段头文件的头注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。 /************************************************* COPYRIGHT (C), MicTiVo International. Co., Ltd. File NAME: // 文件 Author: Version: Date: // 作者、版本及完成日期 DESCRIPTION: // 用于详细说明此程序文件完成的主要功能,与其他模块 // 或函数的接口,输出值、取值范围、含义及参数间的控 // 制、顺序、独立或依赖等关系 Others: // 其它内容的说明 Function List: // 主要函数列表,每条记录应包括函数名及功能简要说明 1.... History: // 修改历史记录列表,每条修改记录应包括修改日期、修改 // 者及修改内容简述 1. Date: Author: Modification: 2. .. *************************************************/ 二、源文件头 源文件头部应进行注释,列出:版权说明、版本号、生成日期、作者、模块目的/功能、主要函数及其功能、修改日志等。 示例:下面这段源文件的头注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。 /************************************************************

源代码使用许可协议

________源代码使用许可合同 甲方:用友软件股份有限公司乙方: 法定地址:法定地址: 法定代表人:法定代表人: 联系电话:联系电话: 鉴于: 1、甲方设计开发了________软件,依法对________源代码享有著作权; 2、乙方希望获得________源代码的使用许可,甲方同意授予乙方对________源代码的使用 许可。 为此,甲乙双方就________源代码的使用许可事项达成如下一致: 第一条使用许可授权 1.1“________源代码”是指版本号为____的________软件的部分或全部源代码。 1.2“衍生软件”是指以________源代码为平台开发生成的软件产品,不包括源代码本身 及通过源代码编译生成的目标代码。 1.3授予使用许可权及限制 根据本合同约定的条款及条件,甲方同意授予、乙方同意接受对________源代码的非专有的、不可转让的使用许可,乙方可在如下情况下使用________源代码:(1)对以________软件为平台的开发衍生软件而进行的开发调试;(列举内容仅供参考,具体使用范围请业务部门根据实际确定。) 1.4许可使用期限:自______年___月__日至_____年___月__日止。 第二条保密条款 2.1“保密信息”指________源代码、________开发平台教程、本合同及其所有附件和 补充文件,以及其他由甲、乙方各自专有的、且提供给对方的并明确标有“保密”字 样的信息。 2.2双方同意严格按照本合同的规定使用对方的保密信息,未经对方的事先书面许可,不 得向第三方,或允许向第三方直接或间接地透露保密信息。双方同意:

2.2.1对保密信息保密,并采取所有必要的预防措施(包括但不限于双方采取的用 于保护自身保密信息的措施)防止未经授权地使用及透露保密信息。 2.2.2不得向第三方提供保密信息或由保密信息衍生的信息。 2.2.3除了本合同确定的使用范围外,不得在其他任何时候使用保密信息。 2.3甲乙双方不负责保护以下信息: 2.3.1已公开的信息。 2.3.2由另一方从不受保密限制的第三方获得的信息。 2.3.3未参考保密信息而由另一方独立开发的信息。 2.3.4依据法律的规定或根据法律赋予的权力可以获取此信息的司法、政府机构的 要求必须公开的信息。接到此类要求后的一方,应立即通知另一方,使另一 方了解将要披露的内容并提出意见。 2.4本合同约定的双方所承担的保密义务不因本合同的变更、终止而终止,如双方没有对 保密期限加以规定,则直至保密信息在本行业中成为公知信息后,本合同约定的保密 义务才予以解除。 2.5甲乙双方同意,以适当方式告知并要求各自能接触到保密信息的员工遵守本条约定, 若其员工违反本条约定,应承担连带责任。 第三条交付 3.1本合同签订__日内,甲方以光盘形式向乙方指定人员提供________源代码和________ 开发平台教程各一份。 3.2乙方应及时查收,核对无误后,应向甲方出具书面收讫证明。 第四条技术支持和新版________源代码的提供 4.1甲方同意按甲方当时技术支持政策,在乙方按规定支付技术支持费用后,向乙方提供 与________源代码有关的技术支持。 4.2如甲方发布新版________,经乙方书面申请,甲方应在接到乙方申请__日内,向乙方 提供该新版______源代码以及________开发平台教程,并支付相应的使用许可费。注:如甲方发布新版源代码,经乙方申请后,除提供开发平台教程外是否需要向乙方提供 该新版源代码?如是,请注明,并请注明提供新版源代码及开发平台教程所需费用及 其支付方式。

ABAQUS-二次开发资料-UMAT

各个楼层及内容索引 2-------------------------------------什么是UMAT 3-------------------------------------UMAT功能简介 4-------------------------------------UMAT开始的变量声明 5-------------------------------------UMAT中各个变量的详细解释 6-------------------------------------关于沙漏和横向剪切刚度 7-------------------------------------UMAT流程和参数表格实例展示 8-------------------------------------FORTRAN语言中的接口程序Interface 9-------------------------------------关于UMAT是否可以用Fortran90编写的问题 10-17--------------------------------Fortran77的一些有用的知识简介 20-25\30-32-----------------------弹塑性力学相关知识简介 34-37--------------------------------用户材料子程序实例JOhn-cook模型压缩包下载 38-------------------------------------JOhn-cook模型本构简介图 40-------------------------------------用户材料子程序实例JOhn-cook模型完整程序+david详细注解[欢迎大家来看看,并提供意见,完全是自己的diy的,不保证完全正确,希望共同探讨,以便更正,带"?"部分,还望各位大师\同仁指教] 1什么是UMAT??? 1.1 UMAT功能简介!!![-摘自庄茁老师的书 UMAT子程序具有强大的功能,使用UMAT子程序: (1)可以定义材料的本构关系,使用ABAQUS材料库中没有包含的材料进行计算,扩充程序 功能。ABAQUS软件2003年度用户年会论文集 (2)几乎可以用于力学行为分析的任何分析过程,几乎可以把用户材料属性赋予ABAQUS中 的任何单元; (3)必须在UMAT中提供材料本构模型的雅可比(Jacobian)矩阵,即应力增量对应变增量 的变化率。 (4)可以和用户子程序“USDFLD”联合使用,通过“USDFLD”重新定义单元每一物质点上传 递到UMAT中场变量的数值。 1.2 UMAT开始的变量声明 由于主程序与UMAT之间存在数据传递,甚至共用一些变量,因此必须遵守有关书写格式,UMAT中常用的变量在文件开头予以定义,通常格式为: SUBROUTINE UMAT(STRESS,STATEV,DDSDDE,SSE,SPD,SCD, 1 RPL,DDSDDT,DRPLDE,DRPLDT, 2STRAN,DSTRAN,TIME,DTIME,TEMP,DTEMP,PREDEF,DPRED,CMNAME 3 NDI,NSHR,NTENS,NSTATV,PROPS,NPROPS,COORDS,DROT,PNEWDT,

C语言编写规范之注释

1、头文件包含Includes 2、私有类型定义 Private typedef 3、私有定义Private define 4、私有宏定义 Private macro 5、私有变量 Private variables 6、私有函数原型Private function prototypes 7、私有函数Private functions 8、私有函数前注释 /****************************************************************************** * * Function Name : FSMC_NOR_Init * Description : Configures the FSMC and GPIOs to interface with the NOR memory. * This function must be called before any write/read operation * on the NOR. * Input : None * Output : None * Return : None ******************************************************************************* / 9、程序块采用缩进风格编写,缩进空格为4。 10、相对独立的程序块之间、变量说明之后必须加空行; 11、较长的字符(>80字符)要分成多行书写,长表达式要在低优先级操作符划分新行,操作符放在新行之首,新行要恰当缩进,保持排版整齐; 12、循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分,长表达式要在低优先级操作符处划分新行,操作符放在新行之首; 13、若函数或过程中的参数较长,则要进行适当的划分。 14、不允许把多个短语句写在一行中,即一行只写一条语句。 15、if、for、do、while、case、switch、default等语句自占一行,且if、for、 do、while等语句的执行语句部分无论多少都要加括号{}。 16、对齐只使用空格键,不使用TAB键; 17、 函数或过程的开始、结构的定义及循环、判断等语句中的代码都要采用缩进风格,case 语句下的情况处理语句也要遵从语句缩进要求 18、 程序块的分界符(如C/C++语言的大括号‘{’和‘}’)应各独占一行并且位于同一 列,同时与引用它们的语句左对齐。在函数体的开始、类的定义、结构的定义、枚举的定义以 及if、for、do、while、switch、case语句中的程序都要采用如上的缩进方式。 19、 在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或

图书馆管理系统源代码

源程序清单 1、文件名 login(login.frm) 功能说明:整个系统的登陆界面,需要输入用户名和登陆密码才能进入到系统中,进行借阅等操作。 源代码: Option Explicit Dim cnt As Integer Private Sub Command1_Click() Dim sql As String Dim rs_login As New ADODB.Recordset If Trim(Combo1.Text) = "" Then MsgBox "没有这个用户", vbOKOnly + vbExclamation, "" Combo1.SetFocus Else sql = "select * from 系统管理 where 用户名='" & Combo1.Text & "'" rs_login.Open sql, conn, adOpenKeyset, adLockPessimistic If rs_login.EOF = True Then MsgBox "没有这个用户", vbOKOnly + vbExclamation, "" Combo1.SetFocus Else If Trim(rs_login.Fields(1)) = Trim(txtpwd.Text) Then userID = Combo1.Text rs_login.Close Unload Me form1.Show Else MsgBox "密码不正确", vbOKOnly + vbExclamation, "" txtpwd.SetFocus End If

End If cnt = cnt + 1 If cnt = 3 Then Unload Me End If Exit Sub End Sub Private Sub Command2_Click() Unload Me End Sub Private Sub Form_Load() Dim connectionstring As String connectionstring = "provider=Microsoft.Jet.oledb.4.0;" & _ "data source=book.mdb" conn.Open connectionstring cnt = 0 End Sub Private Sub txtuser_Change() End Sub 2、文件名 form1(form1.frm) 功能说明:整个系统的主界面,其中包括图书管理、读者管理、图书借阅管理、系统管理、关于,以及在这下面的子菜单。 源代码: Private Sub add_admin_Click() frmadduser.Show End Sub Private Sub add_back_book_Click() frmbackbookinfo.Show

代码规范

目录 一.规范简介 1.1 目的 所有的程序开发手册都包含了各种规则。一些习惯自由程序人员可能对这些规则很不适应,但是在多个开发人员共同写作的情况下,这些规则是必需的。这不仅仅是为了开发效率来考虑,而且也是为了后期维护考虑。 本规范正是为培养规范设计和编程,养成良好的习惯,增强软件产品的稳定,健壮,可靠性;同时也为了提高软件的可读性,可以让程序员尽快而彻底地理解新的代码,使产品可维护性提高而制定的规范。 1.2 开发规范的重要性 (1)减少维护成本; 一个软件的生命周期中,80%的花费在于维护,另一方面,几乎没有任何一个软件,在其整个生命周期中,均由最初的开发人员来维护,规范的编码减少人员变动带来的维护成本。 (2)改善软件的可读性 可以让程序员尽快而彻底地理解新的代码。在一个团队中,代码也容易在程序员之间共享。 (3)维护部门交付产品的规范形象。 二.具体规范 2.1 注释 注释是软件可读性的具体表现。程序注释量一般占程序编码量的20%,软件工程要求不少于20%。程序注释不能用抽象的语言,要精确表达出程序的处理说明。避免每行程序都使用注释,可以在一段程序的前面加一段注释,具有明确的处理逻辑。 注释必不可少,但也不应过多,不要被动得为写注释而写注释。

2.1.1 需要注释的部分 (1)文件头注释,文件创建及修改记录,版权归属,作者以及修订者,以及对文件的简短描述。 (2)类的目的(即类所完成的功能)、设置接口的目的以及应如何被使用。 (3)成员方法注释(对于设置与获取成员方法,在成员变量已有说明的情况下,可以不加注释;普通成员方法要求说明完成功能,参数含义以及返回值)。 (4)普通成员方法内部注释(控制结构、代码所起到的作用以及如此编写代码的原因,处理顺序等)。 (4)参数的含义以及其他任何约束或前提条件、字段或属性描述。而对于局部变量,如无特别意义的情况下则不加注释。 2.1.2 具体注释 (1)文件头注释 要求:遵循JavaDoc的规范,在每一个源文件的开头注明该文件的作用, 作简要说明, 并写上源文件的作者,版权信息编写日期。如果是修改别人编写的源文件,要在修改信息上注明修改者和修改日期。 例子: /** * @Title: 文件名 * @Copyright (C) 年份龙图软件 * @Description: 文件信息描述 * @Revision History: * @Revision 版本号日期作者. */ (2)类和接口的注释 要求:遵循JavaDoc的规范,在每一个类的开头注明该类的作用,作简要说明,并写上作者,编写日期。 例子: /** * @ClassName: 类(或接口)名 * @Description: Description of this class

程序源代码注释规范

程序注释规范说明 程序注释规范应包括以下三方面: 一、文件头部注释 在代码文件的头部进行注释,这样做的好处在于,我们能对代码文件做变更跟踪。在代码头部分标注出创始人、创始时间、修改人、修改时间、代码的功能,这在团队开发中必不可少,它们可以使后来维护/修改的同伴在遇到问题时,在第一时间知道他应该向谁去寻求帮助,并且知道这个文件经历了多少次迭代、经历了多少个程序员的开发和修改。 样本: /***************************************************** ** 作者:Liuchao ** 创始时间:2007-11-12 ** 修改人:Liuchao ** 修改时间:2007-11-12 ** 修改人:Liaochao ** 修改时间:2007-11-12 ** 描述: ** 主要用于产品信息的资料录入,… *****************************************************/ 二、函数、属性、类等注释 请使用///三斜线注释,这种注释是基于XML的,不仅能导出XML制作帮助文档,而且在各个函数、属性、类等的使用中,编辑环境会自动带出注释,方便你的开发。以protected,protected Internal,public声明的定义注释都建议以这样命名方法。 例如: ///

/// 用于从ERP系统中捞出产品信息的类 ///

class ProductTypeCollector { … } 三、逻辑点注释 在我们认为逻辑性较强的地方加入注释,说明这段程序的逻辑是怎样的,以方便我们自己后来的理解以及其他人的理解,并且这样还可以在一定程度上排除BUG。在注释中写明我们的逻辑思想,对照程序,判断程序是否符合我们的初衷,如果不是,则我们应该仔细思考耀修改的是注释还是程序了… 四、变量注释 我们在认为重要的变量后加以注释,说明变量的含义,以方便我们自己后来的理解以及其他人的理解,并且这样还可以在一定程度上排除BUG.我们常用///三斜线注释。 /// 用于从ERP系统中捞出产品信息的类 class ProductTypeCollector { int STData;/// … }

相关主题
文本预览
相关文档 最新文档