继续重写:~
其实感觉如果追求效率的话不调用头文件散写这样反而还高,而调用函数整理的主要目的是为了封装和模块化管理~
当然,效率还是不要太低为好……个人因为效率问题折中处理相对于10楼而言还是感觉还是把malloc模块化和realloc函数模块化分开写比较好~
还有为啥要把原来的二级指针改写成一级指针加返回值的原因是因为读取指针内容需要时间资源,这里可以优化~还有感觉参数类型变得简单了~还可以减少一些不必要的条件判断~
至于free那个模块考虑过用参数void*,free后再由用户自己设置为空,不过这样追求高效还是散写比较好~所以这个倒是没啥改动按照原来的模块~
这次还改进了异常情况判断处理~
接着还新增了一个泛型交换函数(效率到底还是不咋的,高效还是直接多写几行代码好)主要也是为了方便使用~
最后上代码~
Common.h
Common.c
main.c
其实感觉如果追求效率的话不调用头文件散写这样反而还高,而调用函数整理的主要目的是为了封装和模块化管理~
当然,效率还是不要太低为好……个人因为效率问题折中处理相对于10楼而言还是感觉还是把malloc模块化和realloc函数模块化分开写比较好~
还有为啥要把原来的二级指针改写成一级指针加返回值的原因是因为读取指针内容需要时间资源,这里可以优化~还有感觉参数类型变得简单了~还可以减少一些不必要的条件判断~
至于free那个模块考虑过用参数void*,free后再由用户自己设置为空,不过这样追求高效还是散写比较好~所以这个倒是没啥改动按照原来的模块~
这次还改进了异常情况判断处理~
接着还新增了一个泛型交换函数(效率到底还是不咋的,高效还是直接多写几行代码好)主要也是为了方便使用~
最后上代码~
Common.h
程序代码:
#ifndef _COMMON_H_ #define _COMMON_H_ #include<stdio.h> #ifdef __cplusplus extern "C" { #endif void* Common_Node_Mal(size_t size); void* Common_Node_Rea(void* p,size_t); void Common_Node_Free(void** ); char* Comon_String_Get(FILE* ,char* ,int ); void Common_Swap(void* ,void* ,size_t ); #ifdef __cplusplus } #endif #endif
Common.c
程序代码:
#include "Common.h" #define NDEBUG #include<stdlib.h> #include<string.h> #include<errno.h> #define ERR_RET(RET) return RET; #define COMD_SUCCESS errno==0 #ifndef NDEBUG #include<assert.h> #define CHECK_COND(COMD,err,ISERROR) \ do \ { \ assert(COMD); \ }while (0) #else #define CHECK_COND(COMD,err,ISERROR) \ do \ { \ if (!(COMD)) \ { \ printf("\n\nAssertion failed: " #COMD ", file %s, line %d\n",__FILE__,__LINE__); \ printf("\a\a\a\nError: %s\n\n",strerror(err)); \ getchar(); \ ISERROR; \ } \ }while(0) #endif void* Common_Node_Mal(size_t size) { void* p=malloc(size); CHECK_COND(COMD_SUCCESS,errno,ERR_RET(NULL)); return memset(p,0,size); } void* Common_Node_Rea(void* p,size_t size) { void* q=NULL; q=realloc(p,size); CHECK_COND(COMD_SUCCESS,errno,ERR_RET(NULL)); return q; } void Common_Node_Free(void** node) { CHECK_COND(node,EFAULT,ERR_RET(;)); if (*node==NULL) return ; free(*node); return ; } char* Comon_String_Get(FILE* fp,char* p,int userEof) { int i=0; int c=0; int n=BUFSIZ; char* q=(char* )Common_Node_Mal(BUFSIZ); CHECK_COND(COMD_SUCCESS,errno,ERR_RET(NULL)); for (;(c=fgetc(fp))!=userEof&&c!=EOF;q[i++]=c) if (i+2>n) { q=(char* )Common_Node_Rea(q,n+=BUFSIZ); CHECK_COND(COMD_SUCCESS,errno,ERR_RET(NULL)); } q=(char* )Common_Node_Rea(q,sizeof(char)*(i+1)); CHECK_COND(COMD_SUCCESS,errno,ERR_RET(NULL)); q[i]='\0'; p=q; return q; } void Common_Swap(void* p1,void* p2,size_t size) { void* pt=NULL; CHECK_COND(p1&&p2,EFAULT,ERR_RET(;)); pt=Common_Node_Mal(size); memcpy(pt,p1,size); memcpy(p1,p2,size); memcpy(p2,pt,size); Common_Node_Free(&pt); }
main.c
程序代码:
#include"Common.h" void Check_StringFoo( void ); void Check_SwapFoo( void ); int main( void ) { Check_StringFoo(); Check_SwapFoo(); return 0; } void Check_StringFoo( void ) { char* pch=NULL; int len=0; puts("请输入字符串:"); pch=Comon_String_Get(stdin,pch,'\n'); puts(pch); Common_Node_Free((void** )&pch); } void Check_SwapFoo( void ) { int na=2; int nb=3; double fa=2.0; double fb=3.0; puts("交换前:"); printf("na=%d,nb=%d\n",na,nb); printf("fa=%.4f,fb=%.4f\n",fa,fb); Common_Swap(NULL,&nb,sizeof(na)); Common_Swap(&fa,&fb,sizeof(fa)); puts("交换后:"); printf("na=%d,nb=%d\n",na,nb); printf("fa=%.4f,fb=%.4f\n",fa,fb); }
[此贴子已经被作者于2017-11-7 03:36编辑过]
[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]